From 0cfdbfb91c7bf41f69d0754e28bfbe6999012733 Mon Sep 17 00:00:00 2001 From: Adam Roben Date: Wed, 7 Jan 2015 14:44:40 -0500 Subject: [PATCH 001/205] Merge github-linguist-grammars into github-linguist Now that all our grammars are licensed (or grandfathered in), we can distribute them as part of the standard github-linguist gem. This makes it easier for projects to get up and running with Linguist. --- Gemfile | 1 - Rakefile | 8 ++------ github-linguist-grammars.gemspec | 14 -------------- github-linguist.gemspec | 3 ++- lib/linguist.rb | 1 + lib/linguist/grammars.rb | 3 --- 6 files changed, 5 insertions(+), 25 deletions(-) delete mode 100644 github-linguist-grammars.gemspec diff --git a/Gemfile b/Gemfile index c5f2cc3b..9dc1b4dc 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,3 @@ source 'https://rubygems.org' gemspec :name => "github-linguist" -gemspec :name => "github-linguist-grammars" gem 'byebug' if RUBY_VERSION >= '2.0' diff --git a/Rakefile b/Rakefile index b38486c0..186bc9c2 100644 --- a/Rakefile +++ b/Rakefile @@ -40,18 +40,14 @@ task :samples do end task :build_gem => :samples do + rm_rf "grammars" + sh "script/convert-grammars" languages = YAML.load_file("lib/linguist/languages.yml") File.write("lib/linguist/languages.json", Yajl.dump(languages)) `gem build github-linguist.gemspec` File.delete("lib/linguist/languages.json") end -task :build_grammars_gem do - rm_rf "grammars" - sh "script/convert-grammars" - sh "gem", "build", "github-linguist-grammars.gemspec" -end - namespace :benchmark do benchmark_path = "benchmark/results" diff --git a/github-linguist-grammars.gemspec b/github-linguist-grammars.gemspec deleted file mode 100644 index 429b3ff1..00000000 --- a/github-linguist-grammars.gemspec +++ /dev/null @@ -1,14 +0,0 @@ -require File.expand_path('../lib/linguist/version', __FILE__) - -Gem::Specification.new do |s| - s.name = 'github-linguist-grammars' - s.version = Linguist::VERSION - s.summary = "Language grammars for use with github-linguist" - - s.authors = "GitHub" - s.homepage = "https://github.com/github/linguist" - - s.files = ['lib/linguist/grammars.rb'] + Dir['grammars/*'] - - s.add_development_dependency 'plist', '~>3.1' -end diff --git a/github-linguist.gemspec b/github-linguist.gemspec index 983db982..974d1bc0 100644 --- a/github-linguist.gemspec +++ b/github-linguist.gemspec @@ -10,7 +10,7 @@ Gem::Specification.new do |s| s.homepage = "https://github.com/github/linguist" s.license = "MIT" - s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] + s.files = Dir['lib/**/*'] + Dir['grammars/*'] s.executables << 'linguist' s.add_dependency 'charlock_holmes', '~> 0.7.3' @@ -20,6 +20,7 @@ Gem::Specification.new do |s| s.add_development_dependency 'minitest', '>= 5.0' s.add_development_dependency 'mocha' + s.add_development_dependency 'plist', '~>3.1' s.add_development_dependency 'pry' s.add_development_dependency 'rake' s.add_development_dependency 'yajl-ruby' diff --git a/lib/linguist.rb b/lib/linguist.rb index ff9fc3a2..edbd4483 100644 --- a/lib/linguist.rb +++ b/lib/linguist.rb @@ -1,5 +1,6 @@ require 'linguist/blob_helper' require 'linguist/generated' +require 'linguist/grammars' require 'linguist/heuristics' require 'linguist/language' require 'linguist/repository' diff --git a/lib/linguist/grammars.rb b/lib/linguist/grammars.rb index f6468280..b1ccbf6b 100644 --- a/lib/linguist/grammars.rb +++ b/lib/linguist/grammars.rb @@ -1,6 +1,3 @@ -# Note: This file is included in the github-linguist-grammars gem, not the -# github-linguist gem. - module Linguist module Grammars # Get the path to the directory containing the language grammar JSON files. From 23e55e92ca8a01b01f9908e77777d834b97a0f31 Mon Sep 17 00:00:00 2001 From: Adam Roben Date: Thu, 8 Jan 2015 09:19:18 -0500 Subject: [PATCH 002/205] Mention grammar licenses in LICENSE --- LICENSE | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/LICENSE b/LICENSE index f09a7d0a..7981307b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,3 +1,9 @@ +The language grammars included in this gem are covered by their repositories' +respective licenses. See https://github.com/github/linguist/blob/master/grammars.yml +to determine the repository for each grammar. + +All other files are covered by the following license: + Copyright (c) 2011-2014 GitHub, Inc. Permission is hereby granted, free of charge, to any person From 924fddf69892537322188fab6a23c787c1bfc363 Mon Sep 17 00:00:00 2001 From: Brandon Keepers Date: Fri, 17 Apr 2015 14:56:08 +1200 Subject: [PATCH 003/205] Move Linguist::Language.detect to Linguist.detect --- lib/linguist.rb | 78 ++++++++++++++++++++++++++++++++++++ lib/linguist/blob_helper.rb | 4 +- lib/linguist/language.rb | 38 +----------------- test/test_heuristics.rb | 2 +- test/test_instrumentation.rb | 4 +- 5 files changed, 85 insertions(+), 41 deletions(-) diff --git a/lib/linguist.rb b/lib/linguist.rb index 3929efb9..f0680ea6 100644 --- a/lib/linguist.rb +++ b/lib/linguist.rb @@ -8,8 +8,85 @@ require 'linguist/shebang' require 'linguist/version' class << Linguist + # Public: Detects the Language of the blob. + # + # blob - an object that includes the Linguist `BlobHelper` interface; + # see Linguist::LazyBlob and Linguist::FileBlob for examples + # + # Returns Language or nil. + def detect(blob) + # Bail early if the blob is binary or empty. + return nil if blob.likely_binary? || blob.binary? || blob.empty? + + Linguist.instrument("linguist.detection", :blob => blob) do + # Call each strategy until one candidate is returned. + languages = [] + returning_strategy = nil + + STRATEGIES.each do |strategy| + returning_strategy = strategy + candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do + strategy.call(blob, languages) + end + if candidates.size == 1 + languages = candidates + break + elsif candidates.size > 1 + # More than one candidate was found, pass them to the next strategy. + languages = candidates + else + # No candidates, try the next strategy + end + end + + Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first) + + languages.first + end + end + + # Internal: The strategies used to detect the language of a file. + # + # A strategy is an object that has a `.call` method that takes two arguments: + # + # blob - An object that quacks like a blob. + # languages - An Array of candidate Language objects that were returned by the + #     previous strategy. + # + # A strategy should return an Array of Language candidates. + # + # Strategies are called in turn until a single Language is returned. + STRATEGIES = [ + Linguist::Strategy::Modeline, + Linguist::Shebang, + Linguist::Strategy::Filename, + Linguist::Heuristics, + Linguist::Classifier + ] + + # Public: Set an instrumenter. + # + # class CustomInstrumenter + # def instrument(name, payload = {}) + # warn "Instrumenting #{name}: #{payload[:blob]}" + # end + # end + # + # Linguist.instrumenter = CustomInstrumenter + # + # The instrumenter must conform to the `ActiveSupport::Notifications` + # interface, which defines `#instrument` and accepts: + # + # name - the String name of the event (e.g. "linguist.detected") + # payload - a Hash of the exception context. attr_accessor :instrumenter + # Internal: Perform instrumentation on a block + # + # Linguist.instrument("linguist.dosomething", :blob => blob) do + # # logic to instrument here. + # end + # def instrument(*args, &bk) if instrumenter instrumenter.instrument(*args, &bk) @@ -17,4 +94,5 @@ class << Linguist yield if block_given? end end + end diff --git a/lib/linguist/blob_helper.rb b/lib/linguist/blob_helper.rb index 01a567e0..a1565646 100644 --- a/lib/linguist/blob_helper.rb +++ b/lib/linguist/blob_helper.rb @@ -6,7 +6,7 @@ require 'yaml' module Linguist # DEPRECATED Avoid mixing into Blob classes. Prefer functional interfaces - # like `Language.detect` over `Blob#language`. Functions are much easier to + # like `Linguist.detect` over `Blob#language`. Functions are much easier to # cache and compose. # # Avoid adding additional bloat to this module. @@ -325,7 +325,7 @@ module Linguist # # Returns a Language or nil if none is detected def language - @language ||= Language.detect(self) + @language ||= Linguist.detect(self) end # Internal: Get the TextMate compatible scope for the blob diff --git a/lib/linguist/language.rb b/lib/linguist/language.rb index da02b110..f7d7772d 100644 --- a/lib/linguist/language.rb +++ b/lib/linguist/language.rb @@ -87,14 +87,6 @@ module Linguist language end - STRATEGIES = [ - Linguist::Strategy::Modeline, - Linguist::Shebang, - Linguist::Strategy::Filename, - Linguist::Heuristics, - Linguist::Classifier - ] - # Public: Detects the Language of the blob. # # blob - an object that includes the Linguist `BlobHelper` interface; @@ -102,34 +94,8 @@ module Linguist # # Returns Language or nil. def self.detect(blob) - # Bail early if the blob is binary or empty. - return nil if blob.likely_binary? || blob.binary? || blob.empty? - - Linguist.instrument("linguist.detection", :blob => blob) do - # Call each strategy until one candidate is returned. - languages = [] - returning_strategy = nil - - STRATEGIES.each do |strategy| - returning_strategy = strategy - candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do - strategy.call(blob, languages) - end - if candidates.size == 1 - languages = candidates - break - elsif candidates.size > 1 - # More than one candidate was found, pass them to the next strategy. - languages = candidates - else - # No candidates, try the next strategy - end - end - - Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first) - - languages.first - end + warn "[DEPRECATED] `Linguist::Language.detect` is deprecated. Use `Linguist.detect`. #{caller[0]}" + Linguist.detect(blob) end # Public: Get all Languages diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index b3197c69..0f7c0cf4 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -40,7 +40,7 @@ class TestHeuristcs < Minitest::Test def test_detect_still_works_if_nothing_matches blob = Linguist::FileBlob.new(File.join(samples_path, "Objective-C/hello.m")) - match = Language.detect(blob) + match = Linguist.detect(blob) assert_equal Language["Objective-C"], match end diff --git a/test/test_instrumentation.rb b/test/test_instrumentation.rb index ab0615e5..d2eedad8 100644 --- a/test/test_instrumentation.rb +++ b/test/test_instrumentation.rb @@ -28,7 +28,7 @@ class TestInstrumentation < Minitest::Test def test_detection_instrumentation_with_binary_blob binary_blob = fixture_blob("Binary/octocat.ai") - Language.detect(binary_blob) + Linguist.detect(binary_blob) # Shouldn't instrument this (as it's binary) assert_equal 0, Linguist.instrumenter.events.size @@ -36,7 +36,7 @@ class TestInstrumentation < Minitest::Test def test_modeline_instrumentation blob = fixture_blob("Data/Modelines/ruby") - Language.detect(blob) + Linguist.detect(blob) detect_event = Linguist.instrumenter.events.last detect_event_payload = detect_event[:args].first From 8917f1a91a08ea9c05630519f721cec39ba8df9a Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sun, 12 Jul 2015 20:28:42 +0200 Subject: [PATCH 004/205] MemoryBlob class: wrapper around the content of a file Makes it possible to detect the language of a snippet of code without having an actual file on disk Will allow github-markup to use Linguist without restricting its API --- lib/linguist/memory_blob.rb | 73 +++++++++ test/helper.rb | 21 ++- test/test_memory_blob.rb | 290 ++++++++++++++++++++++++++++++++++++ 3 files changed, 380 insertions(+), 4 deletions(-) create mode 100644 lib/linguist/memory_blob.rb create mode 100644 test/test_memory_blob.rb diff --git a/lib/linguist/memory_blob.rb b/lib/linguist/memory_blob.rb new file mode 100644 index 00000000..c17cf3e2 --- /dev/null +++ b/lib/linguist/memory_blob.rb @@ -0,0 +1,73 @@ +require 'linguist/blob_helper' + +module Linguist + # A MemoryBlob is a wrapper around the content of a file to make it quack + # like a Grit::Blob. It provides the basic interface: `name`, + # `data`, `path` and `size`. + class MemoryBlob + include BlobHelper + + # Public: Initialize a new MemoryBlob. + # + # path - A path String (does not necessarily exists on the file system). + # content - Content of the file. + # + # Returns a FileBlob. + def initialize(path, content) + @path = path + @content = content + end + + # Public: Filename + # + # Examples + # + # MemoryBlob.new("/path/to/linguist/lib/linguist.rb", "").path + # # => "/path/to/linguist/lib/linguist.rb" + # + # Returns a String + attr_reader :path + + # Public: File name + # + # Returns a String + def name + File.basename(@path) + end + + # Public: File contents. + # + # Returns a String. + def data + @content + end + + # Public: Get byte size + # + # Returns an Integer. + def size + @content.bytesize + end + + # Public: Get file extension. + # + # Returns a String. + def extension + extensions.last || "" + end + + # Public: Return an array of the file extensions + # + # >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions + # => [".html.erb", ".erb"] + # + # Returns an Array + def extensions + basename, *segments = name.downcase.split(".") + + segments.map.with_index do |segment, index| + "." + segments[index..-1].join(".") + end + end + end +end diff --git a/test/helper.rb b/test/helper.rb index ab3cc8fa..71594416 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -3,14 +3,21 @@ require "minitest/autorun" require "mocha/setup" require "linguist" require 'color-proximity' +require "linguist/memory_blob" def fixtures_path File.expand_path("../fixtures", __FILE__) end def fixture_blob(name) - name = File.join(fixtures_path, name) unless name =~ /^\// - Linguist::FileBlob.new(name, fixtures_path) + filepath = (name =~ /^\//)? name : File.join(fixtures_path, name) + Linguist::FileBlob.new(filepath, fixtures_path) +end + +def fixture_blob_memory(name) + filepath = (name =~ /^\//)? name : File.join(fixtures_path, name) + content = File.read(filepath) + Linguist::MemoryBlob.new(name, content) end def samples_path @@ -18,6 +25,12 @@ def samples_path end def sample_blob(name) - name = File.join(samples_path, name) unless name =~ /^\// - Linguist::FileBlob.new(name, samples_path) + filepath = (name =~ /^\//)? name : File.join(samples_path, name) + Linguist::FileBlob.new(filepath, samples_path) +end + +def sample_blob_memory(name) + filepath = (name =~ /^\//)? name : File.join(samples_path, name) + content = File.read(filepath) + Linguist::MemoryBlob.new(name, content) end diff --git a/test/test_memory_blob.rb b/test/test_memory_blob.rb new file mode 100644 index 00000000..1ba856de --- /dev/null +++ b/test/test_memory_blob.rb @@ -0,0 +1,290 @@ +require_relative "./helper" + +class TestBlob < Minitest::Test + include Linguist + + def setup + # git blobs are normally loaded as ASCII-8BIT since they may contain data + # with arbitrary encoding not known ahead of time + @original_external = Encoding.default_external + Encoding.default_external = Encoding.find("ASCII-8BIT") + end + + def teardown + Encoding.default_external = @original_external + end + + def script_blob(name) + blob = sample_blob_memory(name) + blob.instance_variable_set(:@name, 'script') + blob + end + + def test_name + assert_equal "foo.rb", sample_blob_memory("Ruby/foo.rb").name + end + + def test_mime_type + assert_equal "application/postscript", fixture_blob_memory("Binary/octocat.ai").mime_type + assert_equal "application/x-ruby", sample_blob_memory("Ruby/grit.rb").mime_type + assert_equal "application/x-sh", sample_blob_memory("Shell/script.sh").mime_type + assert_equal "text/plain", fixture_blob_memory("Data/README").mime_type + end + + def test_content_type + assert_equal "application/pdf", fixture_blob_memory("Binary/foo.pdf").content_type + assert_equal "image/png", fixture_blob_memory("Binary/foo.png").content_type + assert_equal "text/plain; charset=iso-8859-2", fixture_blob_memory("Data/README").content_type + end + + def test_disposition + assert_equal "attachment; filename=foo+bar.jar", fixture_blob_memory("Binary/foo bar.jar").disposition + assert_equal "attachment; filename=foo.bin", fixture_blob_memory("Binary/foo.bin").disposition + assert_equal "attachment; filename=linguist.gem", fixture_blob_memory("Binary/linguist.gem").disposition + assert_equal "attachment; filename=octocat.ai", fixture_blob_memory("Binary/octocat.ai").disposition + assert_equal "inline", fixture_blob_memory("Data/README").disposition + assert_equal "inline", sample_blob_memory("Text/foo.txt").disposition + assert_equal "inline", sample_blob_memory("Ruby/grit.rb").disposition + assert_equal "inline", fixture_blob_memory("Binary/octocat.png").disposition + end + + def test_data + assert_equal "module Foo\nend\n", sample_blob_memory("Ruby/foo.rb").data + end + + def test_lines + assert_equal ["module Foo", "end", ""], sample_blob_memory("Ruby/foo.rb").lines + assert_equal ["line 1", "line 2", ""], sample_blob_memory("Text/mac.txt").lines + assert_equal 475, sample_blob_memory("Emacs Lisp/ess-julia.el").lines.length + end + + def test_lines_maintains_original_encoding + # Even if the file's encoding is detected as something like UTF-16LE, + # earlier versions of the gem made implicit guarantees that the encoding of + # each `line` is in the same encoding as the file was originally read (in + # practice, UTF-8 or ASCII-8BIT) + assert_equal Encoding.default_external, fixture_blob_memory("Data/utf16le").lines.first.encoding + end + + def test_size + assert_equal 15, sample_blob_memory("Ruby/foo.rb").size + end + + def test_loc + assert_equal 3, sample_blob_memory("Ruby/foo.rb").loc + end + + def test_sloc + assert_equal 2, sample_blob_memory("Ruby/foo.rb").sloc + assert_equal 3, fixture_blob_memory("Data/utf16le-windows").sloc + assert_equal 1, fixture_blob_memory("Data/iso8859-8-i").sloc + end + + def test_encoding + assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").encoding + assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").ruby_encoding + assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").encoding + assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").ruby_encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").ruby_encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").ruby_encoding + assert_equal "ISO-2022-KR", sample_blob_memory("Text/ISO-2022-KR.txt").encoding + assert_equal "binary", sample_blob_memory("Text/ISO-2022-KR.txt").ruby_encoding + assert_nil fixture_blob_memory("Binary/dog.o").encoding + end + + def test_binary + assert fixture_blob_memory("Binary/git.deb").binary? + assert fixture_blob_memory("Binary/hello.pbc").binary? + assert fixture_blob_memory("Binary/linguist.gem").binary? + assert fixture_blob_memory("Binary/octocat.ai").binary? + assert fixture_blob_memory("Binary/octocat.png").binary? + assert fixture_blob_memory("Binary/zip").binary? + assert !fixture_blob_memory("Data/README").binary? + assert !sample_blob_memory("Ruby/foo.rb").binary? + assert !sample_blob_memory("Perl/script.pl").binary? + end + + def test_all_binary + Samples.each do |sample| + blob = sample_blob_memory(sample[:path]) + assert ! (blob.likely_binary? || blob.binary?), "#{sample[:path]} is a binary file" + end + end + + def test_text + assert fixture_blob_memory("Data/README").text? + assert fixture_blob_memory("Data/md").text? + assert sample_blob_memory("Shell/script.sh").text? + assert fixture_blob_memory("Data/txt").text? + end + + def test_image + assert fixture_blob_memory("Binary/octocat.png").image? + assert !fixture_blob_memory("Binary/octocat.ai").image? + assert !fixture_blob_memory("Binary/octocat.psd").image? + end + + def test_solid + assert fixture_blob_memory("Binary/cube.stl").solid? + assert fixture_blob_memory("Data/cube.stl").solid? + end + + def test_csv + assert fixture_blob_memory("Data/cars.csv").csv? + end + + def test_pdf + assert fixture_blob_memory("Binary/foo.pdf").pdf? + end + + def test_viewable + assert fixture_blob_memory("Data/README").viewable? + assert sample_blob_memory("Ruby/foo.rb").viewable? + assert sample_blob_memory("Perl/script.pl").viewable? + assert !fixture_blob_memory("Binary/linguist.gem").viewable? + assert !fixture_blob_memory("Binary/octocat.ai").viewable? + assert !fixture_blob_memory("Binary/octocat.png").viewable? + end + + def test_generated + assert !fixture_blob_memory("Data/README").generated? + + # Generated .NET Docfiles + assert sample_blob_memory("XML/net_docfile.xml").generated? + + # Long line + assert !sample_blob_memory("JavaScript/uglify.js").generated? + + # Inlined JS, but mostly code + assert !sample_blob_memory("JavaScript/json2_backbone.js").generated? + + # Minified JS + assert !sample_blob_memory("JavaScript/jquery-1.6.1.js").generated? + assert sample_blob_memory("JavaScript/jquery-1.6.1.min.js").generated? + assert sample_blob_memory("JavaScript/jquery-1.4.2.min.js").generated? + + # Composer generated composer.lock file + assert sample_blob_memory("JSON/composer.lock").generated? + + # PEG.js-generated parsers + assert sample_blob_memory("JavaScript/parser.js").generated? + + # Generated PostScript + assert !sample_blob_memory("PostScript/sierpinski.ps").generated? + + # These examples are too basic to tell + assert !sample_blob_memory("JavaScript/hello.js").generated? + + assert sample_blob_memory("JavaScript/intro-old.js").generated? + assert sample_blob_memory("JavaScript/classes-old.js").generated? + + assert sample_blob_memory("JavaScript/intro.js").generated? + assert sample_blob_memory("JavaScript/classes.js").generated? + + # Protocol Buffer generated code + assert sample_blob_memory("C++/protocol-buffer.pb.h").generated? + assert sample_blob_memory("C++/protocol-buffer.pb.cc").generated? + assert sample_blob_memory("Java/ProtocolBuffer.java").generated? + assert sample_blob_memory("Python/protocol_buffer_pb2.py").generated? + assert sample_blob_memory("Go/api.pb.go").generated? + assert sample_blob_memory("Go/embedded.go").generated? + + # Apache Thrift generated code + assert sample_blob_memory("Python/gen-py-linguist-thrift.py").generated? + assert sample_blob_memory("Go/gen-go-linguist-thrift.go").generated? + assert sample_blob_memory("Java/gen-java-linguist-thrift.java").generated? + assert sample_blob_memory("JavaScript/gen-js-linguist-thrift.js").generated? + assert sample_blob_memory("Ruby/gen-rb-linguist-thrift.rb").generated? + assert sample_blob_memory("Objective-C/gen-cocoa-linguist-thrift.m").generated? + + # Generated JNI + assert sample_blob_memory("C/jni_layer.h").generated? + + # Minified CSS + assert !sample_blob_memory("CSS/bootstrap.css").generated? + assert sample_blob_memory("CSS/bootstrap.min.css").generated? + + # Generated VCR + assert sample_blob_memory("YAML/vcr_cassette.yml").generated? + + # Generated by Zephir + assert !sample_blob_memory("Zephir/Router.zep").generated? + + # Cython-generated C/C++ + assert sample_blob_memory("C/sgd_fast.c").generated? + assert sample_blob_memory("C++/wrapper_inner.cpp").generated? + + # Unity3D-generated metadata + assert sample_blob_memory("Unity3D Asset/Tiles.meta").generated? + end + + def test_vendored + assert !fixture_blob_memory("Data/README").vendored? + end + + def test_language + Samples.each do |sample| + blob = sample_blob_memory(sample[:path]) + assert blob.language, "No language for #{sample[:path]}" + assert_equal sample[:language], blob.language.name, blob.name + end + + # Test language detection for files which shouldn't be used as samples + root = File.expand_path('../fixtures', __FILE__) + Dir.entries(root).each do |language| + next if language == '.' || language == '..' || language == 'Binary' || + File.basename(language) == 'ace_modes.json' + + # Each directory contains test files of a language + dirname = File.join(root, language) + Dir.entries(dirname).each do |filename| + # By default blob search the file in the samples; + # thus, we need to give it the absolute path + filepath = File.join(dirname, filename) + next unless File.file?(filepath) + + blob = fixture_blob_memory(filepath) + if language == 'Data' + assert blob.language.nil?, "A language was found for #{filepath}" + elsif language == 'Generated' + assert blob.generated?, "#{filepath} is not a generated file" + else + assert blob.language, "No language for #{filepath}" + assert_equal language, blob.language.name, blob.name + end + end + end + end + + def test_minified_files_not_safe_to_highlight + assert !sample_blob_memory("JavaScript/jquery-1.6.1.min.js").safe_to_colorize? + end + + def test_empty + blob = Struct.new(:data) { include Linguist::BlobHelper } + + assert blob.new("").empty? + assert blob.new(nil).empty? + refute blob.new(" ").empty? + refute blob.new("nope").empty? + end + + def test_include_in_language_stats + generated = sample_blob_memory("CSS/bootstrap.min.css") + assert_predicate generated, :generated? + refute_predicate generated, :include_in_language_stats? + + data = sample_blob_memory("Ant Build System/filenames/ant.xml") + assert_equal :data, data.language.type + refute_predicate data, :include_in_language_stats? + + prose = sample_blob_memory("Markdown/tender.md") + assert_equal :prose, prose.language.type + refute_predicate prose, :include_in_language_stats? + + included = sample_blob_memory("HTML/pages.html") + assert_predicate included, :include_in_language_stats? + end +end From 5a646384f6649474eb539d6c4c7734a244a98ec8 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sun, 12 Jul 2015 20:56:51 +0200 Subject: [PATCH 005/205] FileBlob extends MemoryBlob --- lib/linguist/file_blob.rb | 45 ++------------------------------------- 1 file changed, 2 insertions(+), 43 deletions(-) diff --git a/lib/linguist/file_blob.rb b/lib/linguist/file_blob.rb index 20d87bb0..98ef3825 100644 --- a/lib/linguist/file_blob.rb +++ b/lib/linguist/file_blob.rb @@ -1,10 +1,11 @@ require 'linguist/blob_helper' +require 'linguist/memory_blob' module Linguist # A FileBlob is a wrapper around a File object to make it quack # like a Grit::Blob. It provides the basic interface: `name`, # `data`, `path` and `size`. - class FileBlob + class FileBlob < MemoryBlob include BlobHelper # Public: Initialize a new FileBlob from a path @@ -18,20 +19,6 @@ module Linguist @path = base_path ? path.sub("#{base_path}/", '') : path end - # Public: Filename - # - # Examples - # - # FileBlob.new("/path/to/linguist/lib/linguist.rb").path - # # => "/path/to/linguist/lib/linguist.rb" - # - # FileBlob.new("/path/to/linguist/lib/linguist.rb", - # "/path/to/linguist").path - # # => "lib/linguist.rb" - # - # Returns a String - attr_reader :path - # Public: Read file permissions # # Returns a String like '100644' @@ -39,13 +26,6 @@ module Linguist File.stat(@fullpath).mode.to_s(8) end - # Public: File name - # - # Returns a String - def name - File.basename(@fullpath) - end - # Public: Read file contents. # # Returns a String. @@ -59,26 +39,5 @@ module Linguist def size File.size(@fullpath) end - - # Public: Get file extension. - # - # Returns a String. - def extension - extensions.last || "" - end - - # Public: Return an array of the file extensions - # - # >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions - # => [".html.erb", ".erb"] - # - # Returns an Array - def extensions - basename, *segments = name.downcase.split(".") - - segments.map.with_index do |segment, index| - "." + segments[index..-1].join(".") - end - end end end From b36c4f242834d43a6ac699427d86bb975ef769ee Mon Sep 17 00:00:00 2001 From: ziggi Date: Sat, 18 Jul 2015 03:27:07 +0300 Subject: [PATCH 006/205] TextMate for Pawn --- .gitmodules | 3 +++ grammars.yml | 2 ++ lib/linguist/languages.yml | 16 ++++++++-------- samples/{PAWN => Pawn}/grandlarc.pwn | 0 vendor/grammars/pawn-sublime-language | 1 + 5 files changed, 14 insertions(+), 8 deletions(-) rename samples/{PAWN => Pawn}/grandlarc.pwn (100%) create mode 160000 vendor/grammars/pawn-sublime-language diff --git a/.gitmodules b/.gitmodules index fce31b57..44882a98 100644 --- a/.gitmodules +++ b/.gitmodules @@ -662,3 +662,6 @@ [submodule "vendor/grammars/language-ncl"] path = vendor/grammars/language-ncl url = https://github.com/rpavlick/language-ncl.git +[submodule "vendor/grammars/pawn-sublime-language"] + path = vendor/grammars/pawn-sublime-language + url = https://github.com/Southclaw/pawn-sublime-language.git diff --git a/grammars.yml b/grammars.yml index 43507c92..10c98293 100644 --- a/grammars.yml +++ b/grammars.yml @@ -413,6 +413,8 @@ vendor/grammars/oz-tmbundle/Syntaxes/Oz.tmLanguage: - source.oz vendor/grammars/pascal.tmbundle: - source.pascal +vendor/grammars/pawn-sublime-language/: +- source.pawn vendor/grammars/perl.tmbundle/: - source.perl - source.perl.6 diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index d0930dab..e93c5374 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2374,14 +2374,6 @@ Oz: tm_scope: source.oz ace_mode: text -PAWN: - type: programming - color: "#dbb284" - extensions: - - .pwn - tm_scope: source.c++ - ace_mode: c_cpp - PHP: type: programming tm_scope: text.html.php @@ -2485,6 +2477,14 @@ Pascal: - .pp ace_mode: pascal +Pawn: + type: programming + color: "#dbb284" + extensions: + - .pwn + tm_scope: source.pawn + ace_mode: text + Perl: type: programming tm_scope: source.perl diff --git a/samples/PAWN/grandlarc.pwn b/samples/Pawn/grandlarc.pwn similarity index 100% rename from samples/PAWN/grandlarc.pwn rename to samples/Pawn/grandlarc.pwn diff --git a/vendor/grammars/pawn-sublime-language b/vendor/grammars/pawn-sublime-language new file mode 160000 index 00000000..68c752d7 --- /dev/null +++ b/vendor/grammars/pawn-sublime-language @@ -0,0 +1 @@ +Subproject commit 68c752d7d47adb9bfc27a1ce393b133d89065594 From 483488a2fadbded870517717d81f88fbb97f855b Mon Sep 17 00:00:00 2001 From: ziggi Date: Sat, 18 Jul 2015 03:55:51 +0300 Subject: [PATCH 007/205] Add .inc extension for Pawn --- lib/linguist/languages.yml | 1 + samples/Pawn/fixes.inc | 8399 ++++++++++++++++++++++++++++++++++++ samples/Pawn/grandlarc.pwn | 520 --- samples/Pawn/timertest.pwn | 36 + 4 files changed, 8436 insertions(+), 520 deletions(-) create mode 100644 samples/Pawn/fixes.inc delete mode 100644 samples/Pawn/grandlarc.pwn create mode 100644 samples/Pawn/timertest.pwn diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index e93c5374..98efa92d 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2482,6 +2482,7 @@ Pawn: color: "#dbb284" extensions: - .pwn + - .inc tm_scope: source.pawn ace_mode: text diff --git a/samples/Pawn/fixes.inc b/samples/Pawn/fixes.inc new file mode 100644 index 00000000..d55e8615 --- /dev/null +++ b/samples/Pawn/fixes.inc @@ -0,0 +1,8399 @@ +/* + * =============== + * INTRODUCTION: + * =============== + * + * fixes.inc - Community patch for buggy SA:MP functions. + * + * ================ + * LIST OF FIXES: + * ================ + * + * FIX: GetPlayerColor + * PROBLEM: Returns "0" if "SetPlayerColor" has never been called. + * SOLUTION: Call "SetPlayerColor" in "OnPlayerConnect". + * SEE: "OnPlayerConnect". + * AUTHOR: KoczkaHUN + * POST: http://forum.sa-mp.com/showpost.php?p=1486048 + * + * FIX: FILTERSCRIPT + * PROBLEM: Despite the fact that is in every new script, many people don't + * define "FILTERSCRIPT" where appropriate. + * SOLUTION: Provide an "IS_FILTERSCRIPT" variable (note the naming to match + * the original macro). + * AUTHOR: Y_Less + * SEE: "OnFilterScriptInit" and "OnGameModeInit". + * + * FIX: SpawnPlayer + * PROBLEM: Kills the player if they are in a vehicle. + * SOLUTION: Remove the from the vehicle. + * SEE: "FIXES_SpawnPlayer". + * AUTHOR: Y_Less + * + * FIX: SetPlayerName + * PROBLEM: Using "SetPlayerName" when the new name only differs from the old + * name in case does not alter the name at all. + * SOLUTION: Change their name twice - once to "_FIXES TEMP NAME" and then to + * the actual required name. + * SEE: "OnPlayerConnect" and "FIXES_SetPlayerName". + * AUTHOR: Y_Less/Slice/xX_Simon_Xx + * POST: https://github.com/Y-Less/sa-mp-fixes/issues/3 + * + * FIX: GetPlayerSkin + * PROBLEM: Returns the new skin after "SetSpawnInfo" is called but before the + * player actually respawns to get the new skin. + * SOLUTION: Record the skin in "OnPlayerSpawn" and always return that one. + * SEE: "OnPlayerSpawn", "FIXES_GetPlayerSkin" and "FIXES_SetPlayerSkin". + * AUTHOR: Y_Less + * + * FIX: GetWeaponName + * PROBLEM: Returns nothing for 18, 44, and 45. + * SOLUTION: Return the correct names ("Molotov Cocktail", "Thermal Goggles", + * and "Night vision Goggles"). + * SEE: "FIXES_GetWeaponName". + * AUTHOR: Y_Less + * + * FIX: SetPlayerWorldBounds + * PROBLEM: Aiming can bypass the edge. + * SOLUTION: Check for the player leaving the area and reset them to their last + * good position if they leave the area (aiming or not). + * SEE: "OnPlayerUpdate" and "FIXES_SetPlayerWorldBounds". + * AUTHOR: Y_Less + * + * FIX: TogglePlayerControllable + * PROBLEM: Other players see you moving on the spot. + * SOLUTION: Return 0 in OnPlayerUpdate. + * SEE: "FIXES_TogglePlayerControllable" and "OnPlayerUpdate". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=876854 + * + * FIX: HydraSniper + * PROBLEM: Entering military aircraft with a sniper rifle messes up views. + * SOLUTION: Set their armed weapon to fists. + * SEE: "OnPlayerStateChange", "FIXES_GivePlayerWeapon", + * "FIXES_SetPlayerArmedWeapon". + * AUTHOR: funky1234 + * POST: http://forum.sa-mp.com/showpost.php?p=965644 + * + * FIX: IsPlayerInCheckpoint + * PROBLEM: Function returns an undefined value if it is called before any + * other checkpoint functions are called to initialise the value. + * SOLUTION: Call "DisablePlayerCheckpoint" when they connect. + * SEE: "OnPlayerConnect". + * AUTHOR: Y_Less + * + * FIX: IsPlayerInRaceCheckpoint + * PROBLEM: Function returns an undefined value if it is called before any + * other race checkpoint functions are called to initialise the value. + * SOLUTION: Call "DisablePlayerRaceCheckpoint" when they connect. + * SEE: "OnPlayerConnect". + * AUTHOR: Y_Less + * + * FIX: GetPlayerWeapon + * PROBLEM: Returns the old value after using "SetPlayerArmedWeapon" when they + * are in a vehicle. + * SOLUTION: If "SetPlayerArmedWeapon" is called in a vehicle, store the new + * value and return that instead. + * SEE: "OnPlayerStateChange", "FIXES_SetPlayerArmedWeapon", and + * "FIXES_GetPlayerWeapon". + * AUTHOR: Y_Less + * + * FIX: PutPlayerInVehicle + * PROBLEM: If this is used on a passenger the driver of their old vehicle + * doesn't see them in their new vehicle. + * SOLUTION: Remove them from the vehicle first. + * SEE: "OnPlayerStateChange" and "FIXES_PutPlayerInVehicle". + * AUTHOR: leong124/Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=1265965 + * + * FIX: KEY_AIM + * PROBLEM: "KEY_AIM" isn't defined by default. + * SOLUTION: Define it. + * SEE: N/A. + * AUTHOR: Y_Less + * + * FIX: SetPlayerCheckpoint + * PROBLEM: If a checkpoint is already set it will use the size of that + * checkpoint instead of the new one. + * SOLUTION: Call "DisablePlayerCheckpoint" before setting the checkpoint. + * SEE: "FIXES_SetPlayerCheckpoint". + * AUTHOR: KoczkaHUN + * POST: http://forum.sa-mp.com/showpost.php?p=1482401 + * + * FIX: SetPlayerRaceCheckpoint + * PROBLEM: If a checkpoint is already set it will use the size of that + * checkpoint instead of the new one. + * SOLUTION: Call "DisablePlayerRaceCheckpoint" before setting the checkpoint. + * SEE: "FIXES_SetPlayerRaceCheckpoint". + * AUTHOR: KoczkaHUN + * POST: http://forum.sa-mp.com/showpost.php?p=1482401 + * + * FIX: TextDrawCreate + * PROBLEM: Crashes on a blank string. + * SOLUTION: Intercept blank strings. + * SEE: "FIXES_TextDrawCreate". + * AUTHOR: wups + * POST: http://forum.sa-mp.com/showpost.php?p=1484008 + * + * FIX: TextDrawSetString + * PROBLEM: Crashes on a blank string and size greater than 1024. + * SOLUTION: Intercept blank strings and truncate long strings. + * SEE: "FIXES_TextDrawSetString". + * AUTHOR: TomTrox + * POST: http://forum.sa-mp.com/showpost.php?p=1487870 + * + * FIX: CreatePlayerTextDraw + * PROBLEM: Crashes on a blank string. + * SOLUTION: Intercept blank strings. + * SEE: "FIXES_CreatePlayerTextDraw". + * AUTHOR: wups/Y_Less + * + * FIX: PlayerTextDrawSetString + * PROBLEM: Crashes on a blank string and size greater than 1024. + * SOLUTION: Intercept blank strings and truncate long strings. + * SEE: "FIXES_PlayerTextDrawSetString". + * AUTHOR: TomTrox/Y_Less + * + * FIX: AllowInteriorWeapons + * PROBLEM: Does nothing. + * SOLUTION: Set the player's weapon to fists in an interior. + * SEE: "FIXES_AllowInteriorWeapons", "OnGameModeInit" and + * "OnPlayerUpdate". + * AUTHOR: KoczkaHUN + * POST: http://forum.sa-mp.com/showpost.php?p=1502696 + * + * FIX: OnPlayerEnterVehicle + * PROBLEM: Crashes other players when people enter an invalid seat. + * SOLUTION: Desync the people with invalid seats. + * SEE: "OnPlayerStateChange" and "OnPlayerUpdate". + * AUTHOR: RyDeR`/Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=1410296 + * + * FIX: OnPlayerEnterVehicle_2 + * PROBLEM: Crashes the server when hacks enter an invalid vehicle. + * SOLUTION: Desync the people with invalid vehicles. + * SEE: "OnPlayerEnterVehicle". + * AUTHOR: im/Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=2340900 + * + * FIX: AllowTeleport + * PROBLEM: 0.3dRC9 removed "AllowPlayerTeleport" and "AllowAdminTeleport" in + * favour of "OnPlayerClickMap". Some scripts used the old code and. + * SOLUTION: Teleport the player in "OnPlayerClickMap". + * SEE: "OnPlayerClickMap", "FIXES_AllowPlayerTeleport", and + * "FIXES_AllowAdminTeleport". + * AUTHOR: Y_Less + * + * FIX: SetPlayerSpecialAction + * PROBLEM: Removing jetpacks from players by setting their special action to 0 + * causes the sound to stay until death. + * SOLUTION: Call "ClearAnimations" before "SetPlayerSpecialAction". + * SEE: "FIXES_SetPlayerSpecialAction". + * AUTHOR: MP2 + * POST: Private message from MP2. + * + * FIX: OnDialogResponse + * PROBLEM: Cheaters can spoof the dialogid they are using to respond to ones + * they can't actually see. + * SOLUTION: Store the displayed dialogid and use that instead. + * SEE: "FIXES_OnDialogResponse", "FIXES_ShowPlayerDialog". + * AUTHOR: Y_Less + * FIXED IN: 0.3e RC6 + * + * FIX: GetPlayerDialog + * PROBLEM: This function doesn't exist. Fixed for hidden dialogs. + * SOLUTION: Add it. DEFAULTS TO FALSE! + * SEE: "FIXES_GetPlayerDialog". + * AUTHOR: Y_Less/xX_Simon_Xx + * POST: http://forum.sa-mp.com/showpost.php?p=2141254 + * + * FIX: PlayerDialogResponse + * PROBLEM: A player's dialog doesn't hide when the gamemode restarts, causing + * the server to print "Warning: PlayerDialogResponse PlayerId: 0 + * dialog ID doesn't match last sent dialog ID". + * SOLUTION: Hide it. + * SEE: "OnPlayerConnect", "OnGameModeExit". + * AUTHOR: xX_Simon_Xx + * POST: https://github.com/Y-Less/sa-mp-fixes/issues/2 + * + * FIX: SetSpawnInfo + * PROBLEM: Kicks the player if "SpawnPlayer" is called before "SetSpawnInfo". + * SOLUTION: Call "SetSpawnInfo" at least once. + * SEE: "OnPlayerConnect". + * AUTHOR: Y_Less + * + * FIX: SetPlayerSkin + * PROBLEM: Breaks sitting on bikes. + * SOLUTION: Put them back in the vehicle after setting their skin. + * SEE: "FIXES_SetPlayerSkin". + * AUTHOR: CyNiC + * POST: http://forum.sa-mp.com/showpost.php?p=1756094 + * + * FIX: HideMenuForPlayer + * PROBLEM: Crashes when passed an invalid menu ID. + * SOLUTION: Don't hide it when passed an invalid menu. + * SEE: "FIXES_HideMenuForPlayer". + * AUTHOR: Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=1787297 + * + * FIX: valstr + * PROBLEM: Crashes on large numbers. + * SOLUTION: Use "format" instead. + * SEE: "FIXES_valstr". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=1790300 + * + * FIX: fclose + * PROBLEM: Crashes on an invalid handle. + * SOLUTION: Check for an invalid handle. + * SEE: "FIXES_fclose". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=1790300 + * + * FIX: fwrite + * PROBLEM: Crashes on an invalid handle. + * SOLUTION: Check for an invalid handle. + * SEE: "FIXES_fwrite". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=1790300 + * + * FIX: fread + * PROBLEM: Crashes on an invalid handle. + * SOLUTION: Check for an invalid handle. + * SEE: "FIXES_fread". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=1790300 + * + * FIX: fputchar + * PROBLEM: Crashes on an invalid handle. + * SOLUTION: Check for an invalid handle. + * SEE: "FIXES_fputchar". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=1790300 + * + * FIX: fgetchar + * PROBLEM: Crashes on an invalid handle. + * SOLUTION: Check for an invalid handle. + * SEE: "FIXES_fgetchar". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=1790300 + * + * FIX: fblockwrite + * PROBLEM: Crashes on an invalid handle. + * SOLUTION: Check for an invalid handle. + * SEE: "FIXES_fblockwrite". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=1790300 + * + * FIX: fblockread + * PROBLEM: Crashes on an invalid handle. + * SOLUTION: Check for an invalid handle. + * SEE: "FIXES_fblockread". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=1790300 + * + * FIX: fseek + * PROBLEM: Crashes on an invalid handle. + * SOLUTION: Check for an invalid handle. + * SEE: "FIXES_fseek". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=1790300 + * + * FIX: flength + * PROBLEM: Crashes on an invalid handle. + * SOLUTION: Check for an invalid handle. + * SEE: "FIXES_flength". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=1790300 + * + * FIX: file_inc + * PROBLEM: Includes or excludes all the file function fixes together (can + * cause major overhead). + * SOLUTION: Optionally group them all under one define. DEFAULTS TO FALSE! + * SEE: "FIX_file_inc". + * AUTHOR: Y_Less + * + * FIX: IsPlayerAttachedObjectSlotUsed + * PROBLEM: Doesn't work in OnPlayerDisconnect. + * SOLUTION: Maintain an internal record of slots used. + * SEE: "FIXES_SetPlayerAttachedObject", + * "FIXES_RemovePlayerAttachedObject", + * "FIXES_IsPAttachedObjectSlotUsed", and + * "OnPlayerDisconnect". + * AUTHOR: Y_Less + * + * FIX: SetPlayerAttachedObject + * PROBLEM: Doesn't remove objects when the mode ends. + * SOLUTION: Remove them. + * SEE: "FIXES_SetPlayerAttachedObject", + * "FIXES_RemovePlayerAttachedObject", and + * "OnPlayerDisconnect". + * AUTHOR: Y_Less + * + * FIX: OnPlayerDeath + * PROBLEM: Clients get stuck when they die with an animation applied. + * SOLUTION: Clear their animations. + * SEE: "OnPlayerDeath" and "OnPlayerUpdate". + * AUTHOR: h02 + * POST: http://forum.sa-mp.com/showpost.php?p=1641144 + * + * FIX: strins + * PROBLEM: Ignores the "maxlength" parameter causing possible crashes. + * SOLUTION: Manually check the length. + * SEE: "FIXES_strins". + * AUTHOR: Slice/Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=1860495 + * POST: http://forum.sa-mp.com/showpost.php?p=1864706 + * + * FIX: IsPlayerConnected + * PROBLEM: Only uses the lower two bytes of a passed ID. + * SOLUTION: Mask the numbers. + * SEE: "FIXES_IsPlayerConnected". + * AUTHOR: Slice + * POST: http://forum.sa-mp.com/showpost.php?p=1860464 + * + * FIX: OnPlayerCommandText + * PROBLEM: Can crash ZCMD when passed a null string. + * SOLUTION: Pass NULL if invalid inputs given. + * SEE: "OnPlayerCommandText". + * AUTHOR: Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=1909511 + * + * FIX: TrainExit + * PROBLEM: When getting out of a train entered by "PutPlayerInVehicle", the + * camera does not reset properly. + * SOLUTION: Reset the camera. + * SEE: "FIXES_PutPlayerInVehicle", "FIXES_OnPlayerStateChange". + * AUTHOR: Terminator3/Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=1980214 + * + * FIX: Kick + * PROBLEM: Calling "Kick" in "OnPlayerConnect" doesn't work properly. + * SOLUTION: Defer it. + * SEE: "OnPlayerConnect", "FIXES_Kick". + * AUTHOR: Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=1989453 + * FIXED IN: 0.3x + * + * FIX: OnVehicleMod + * PROBLEM: Crashes other players when invalid mods are applied. + * SOLUTION: Desync the player. + * SEE: "OnVehicleMod". + * AUTHOR: JernejL/Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=1671500 + * + * FIX: random + * PROBLEM: Doesn't work with negative numbers. + * SOLUTION: Invert then reinvert. DEFAULTS TO FALSE! + * SEE: "FIXES_random". + * AUTHOR: xX_Simon_Xx + * POST: http://forum.sa-mp.com/showpost.php?p=2141254 + * + * FIX: sleep + * PROBLEM: Leaks bytes from the stack. + * SOLUTION: Call a function to store the correct value. + * SEE: "FIXES_sleep". + * AUTHOR: Y_Less + * + * FIX: AddMenuItem + * PROBLEM: Crashes when passed an invalid menu ID. + * SOLUTION: Don't hide it when passed an invalid menu. + * SEE: "FIXES_AddMenuItem". + * AUTHOR: Y_Less + * + * FIX: SetMenuColumnHeader + * PROBLEM: Crashes when passed an invalid menu ID. + * SOLUTION: Don't hide it when passed an invalid menu. + * SEE: "FIXES_SetMenuColumnHeader". + * AUTHOR: Y_Less + * + * FIX: ShowMenuForPlayer + * PROBLEM: Crashes when passed an invalid menu ID. + * SOLUTION: Don't hide it when passed an invalid menu. + * SEE: "FIXES_ShowMenuForPlayer". + * AUTHOR: Y_Less + * + * FIX: HideMenuForPlayer + * PROBLEM: Crashes when passed an invalid menu ID. + * SOLUTION: Don't hide it when passed an invalid menu. + * SEE: "FIXES_HideMenuForPlayer". + * AUTHOR: Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=1787297 + * + * FIX: HideMenuForPlayer_2 + * PROBLEM: Ignores the "menuid" parameter. + * SOLUTION: Only hide the correct menu. DEFAULTS TO FALSE! + * SEE: "FIXES_HideMenuForPlayer". + * AUTHOR: Y_Less + * + * FIX: DisableMenu + * PROBLEM: Crashes when passed an invalid menu ID. + * SOLUTION: Don't hide it when passed an invalid menu. + * SEE: "FIXES_DisableMenu". + * AUTHOR: Y_Less + * + * FIX: DisableMenuRow + * PROBLEM: Crashes when passed an invalid menu ID. + * SOLUTION: Don't hide it when passed an invalid menu. + * SEE: "FIXES_DisableMenuRow". + * AUTHOR: Y_Less + * + * FIX: Menus + * PROBLEM: All menu function fixes are included separately for major overhead. + * SOLUTION: Optionally group them all under one define. + * SEE: "FIX_Menus", "_FIX_Menus" + * AUTHOR: Y_Less + * + * FIX: GetPlayerMenu + * PROBLEM: Returns previous menu when none is displayed. + * SOLUTION: Return the correct value. + * SEE: "FIXES_GetPlayerMenu", "OnPlayerSelectedMenuRow". + * AUTHOR: Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=2295867 + * + * FIX: GetPlayerInterior + * PROBLEM: Always returns 0 for NPCs. + * SOLUTION: Return the correct value. + * SEE: "FIXES_GetPlayerInterior", "FIXES_SetPlayerInterior". + * AUTHOR: Y_Less/xX_Simon_Xx + * POST: http://forum.sa-mp.com/showpost.php?p=2309246 + * + * FIX: ClearAnimations + * PROBLEM: Use ClearAnimation while you are in a vehicle cause the player exit + * from it. + * SOLUTION: Apply an animation instead of clear animation. + * SEE: "FIXES_ClearAnimations". + * AUTHOR: xX_Simon_Xx + * POST: https://github.com/Y-Less/sa-mp-fixes/issues/4 + * + * FIX: ClearAnimations_2 + * PROBLEM: ClearAnimations doesn't do anything when the animation ends if we + * pass 1 for the freeze parameter in ApplyAnimation. + * SOLUTION: Apply an idle animation for stop and then use ClearAnimation. + * SEE: "FIXES_ClearAnimations". + * AUTHOR: xX_Simon_Xx + * POST: https://github.com/Y-Less/sa-mp-fixes/issues/4 + * + * FIX: DriveBy + * PROBLEM: If you press KEY_CROUCH while you're passenger and if you are + * armed, the player start to aim; if you repress KEY_CROUCH the + * player don't return in vehicle. + * SOLUTION: Apply the animation to return the player in the vehicle. + * SEE: "OnPlayerKeyStateChange". + * AUTHOR: xX_Simon_Xx + * POST: https://github.com/Y-Less/sa-mp-fixes/issues/13 + * + * FIX: GangZoneCreate + * PROBLEM: Gang zones bug on the main map for players at certain angles + * relative to them. + * SOLUTION: Set a non floating value for the gang zone co-ordinate. + * SEE: "FIXES_GangZoneCreate". + * AUTHOR: xX_Simon_Xx/Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=2144109 + * + * FIX: SPECIAL_ACTION_PISSING + * PROBLEM: "SPECIAL_ACTION_PISSING" isn't defined by default. + * SOLUTION: Define it. + * SEE: N/A. + * AUTHOR: xX_Simon_Xx + * POST: https://github.com/Y-Less/sa-mp-fixes/issues/6 + * + * FIX: IsValidVehicle + * PROBLEM: "IsValidVehicle" isn't defined by default. + * SOLUTION: Define it. + * SEE: N/A. + * AUTHOR: xX_Simon_Xx + * POST: http://forum.sa-mp.com/showpost.php?p=2693650 + * + * FIX: ApplyAnimation + * PROBLEM: Passing an invalid animation library in ApplyAnimation causes a + * client crash for streamed in players. + * SOLUTION: Block ApplyAnimation when an invalid library is passed. + * SEE: "FIXES_ApplyAnimation". + * AUTHOR: xX_Simon_Xx + * POST: https://github.com/Y-Less/sa-mp-fixes/issues/5 + * + * FIX: ApplyAnimation_2 + * PROBLEM: First time a library is used, it does nothing. + * SOLUTION: Apply animations twice when first using a library. + * SEE: "FIXES_ApplyAnimation". + * AUTHOR: xX_Simon_Xx/Lordzy/Y_Less + * POST: http://forum.sa-mp.com/showpost.php?p=3052627 + * + * FIX: OnPlayerSpawn + * PROBLEM: San Andreas deducts $100 from players. + * SOLUTION: Give them it back. + * SEE: "OnPlayerSpawn". + * AUTHOR: Y_Less + * + * FIX: GetGravity + * PROBLEM: "GetGravity" isn't defined by default. + * SOLUTION: Define it. + * SEE: N/A. + * AUTHOR: Whitetiger + * POST: http://forum.sa-mp.com/showpost.php?p=1706447 + * + * FIX: gpci + * PROBLEM: "gpci" isn't defined by default. + * SOLUTION: Define it. + * SEE: N/A. + * AUTHOR: xX_Simon_Xx + * POST: http://pastebin.com/VQSGpbSm + * + * FIX: Natives + * PROBLEM: Several natives are included by default, this enables or disables + * them all. Therefore this is an umbrella fix for several fixes. + * SOLUTION: Define them. + * SEE: "FIX_GetGravity", "FIX_gpci", "FIX_IsValidVehicle". + * AUTHOR: Y_Less + * + * FIX: OnPlayerConnect + * PROBLEM: This function isn't called for players when a filterscript starts. + * SOLUTION: Call it for all connected players. + * SEE: "FIXES_OnFilterScriptInit". + * AUTHOR: Y_Less + * + * FIX: OnPlayerDisconnect + * PROBLEM: This function isn't called for players when a filterscript ends. + * SOLUTION: Call it for all connected players. + * SEE: "FIXES_OnFilterScriptExit". + * AUTHOR: Y_Less + * + * FIX: GameText + * PROBLEM: Several styles do not display for the time specified. + * SOLUTION: Recreate the styles in Text Draws and use those instead. + * SEE: "FIXES_GameTextForAll", "FIXES_GameTextForPlayer". + * AUTHOR: Y_Less + * + * FIX: GameTextStyles + * PROBLEM: San Andreas has fixed styles for area and vehicle names, but they + * are not included in the GameText styles list. + * SOLUTION: Add them. DEFAULTS TO FALSE. + * SEE: "FIXES_GameTextForAll", "FIXES_GameTextForPlayer". + * AUTHOR: Y_Less + * + * FIX: HideGameText + * PROBLEM: There is no "HideGameTextForXYZ" function. + * SOLUTION: Show a single space for a game text. DEFAULTS TO FALSE. + * SEE: "FIXES_HideGameTextForAll", "FIXES_HideGameTextForPlayer". + * AUTHOR: Y_Less + * + * FIX: BODYPARTS + * PROBLEM: The bodyparts to be used in OnPlayer(Take/Give)Damage are not + * defined by default + * SOLUTION: Define it. + * SEE: N/A. + * AUTHOR: Whitetiger + * + * FIX: CAMERAMODES + * PROBLEM: The camera modes for GetPlayerCameraMode are not defined by + * default. + * SOLUTION: Define it. + * SEE: N/A. + * AUTHOR: Whitetiger + * POST: http://forum.sa-mp.com/showpost.php?p=1309730 + * + * FIX: SetPlayerCamera + * PROBLEM: Using the camera functions directly after enabling spectator mode + * doesn't work. + * SOLUTION: Defer them. + * SEE: "FIXES_SetPlayerCameraPos", "FIXES_SetPlayerCameraLookAt", + * "FIXES_TogglePlayerSpectating". + * AUTHOR: Emmet_ + * + * FIX: SetPlayerTime + * PROBLEM: Using this function under "OnPlayerConnect" doesn't work. + * SOLUTION: Defer it. + * SEE: "FIXES_SetPlayerTime" + * AUTHOR: Emmet_ + * + * FIX: OnPlayerRequestClass + * PROBLEM: Random blunts and bottles sometimes appear in class selection. + * SOLUTION: Call "RemoveBuildingForPlayer". + * SEE: "OnPlayerRequestClass" + * AUTHOR: Y_Less + * + * FIX: SetPlayerColor + * PROBLEM: If used under OnPlayerConnect, the affecting player will not + * see the color in the TAB menu. + * SOLUTION: Defer it. + * SEE: "FIXES_SetPlayerColor" + * AUTHOR: Emmet_ + * POST: http://forum.sa-mp.com/showthread.php?t=452407 + * + * FIX: FileMaths + * PROBLEM: You can write gibberish like "File:a; ++a;". + * SOLUTION: Remove the operators. + * SEE: "File:operator" + * AUTHOR: Y_Less + * + * FIX: GetPlayerWeaponData + * PROBLEM: Old weapons with no ammo left are still returned. + * SOLUTION: Set "weapons" to 0. DEFAULTS TO FALSE! + * SEE: "FIXES_GetPlayerWeaponData" + * AUTHOR: Y_Less + * POST: http://forum.sa-mp.com/showthread.php?t=567400 + * + * ============== + * STYLE RULES: + * ============== + * + * All globals should be "static stock" whenever possible (so they can only be + * accessed from this one file). + * + * Statics must start with "FIXES_gs", and all other globals with "FIXES_g". + * + * All functions not overriding existing functions must start with "FIXES_". + * + * Macros must be upper case, use underscores, and start "FIXES_": + * "FIXES_LIKE_THIS". + * + * Functions should be upper camel case (as the original functions are) + * "FIXES_LikeThis". + * + * Globals (after the prefix) should be upper camel case "LikeThis", and locals + * lower camel case "likeThis". + * + * ALS should be used to hook functions and callbacks. See this topic for more + * details: + * + * http://forum.sa-mp.com/showthread.php?t=441293 + * + * The ALS prefix for chaining is "FIXES_". + * + * When redefining a native, add a "BAD_" external name declaration with the + * "_ALS_" definition so that others may use the original native if they so + * desire (with the caveat that it may break all fixes). Note the "BAD_" + * name is meant to indicate the possibility of breaking the fix, not a + * comment on the original native function. + * + * The ALS hook defines used here are a little different to the normal ones as + * this file assumes that it is always first. The pattern is: + * + * #if defined _ALS_NameOfFixHere + * #error _ALS_NameOfFixHere defined + * #endif + * native BAD_NameOfFixHere(params) = NameOfFixHere; + * + * #if FIX_NameOfFixHere + * stock FIXES_NameOfFixHere(params) + * { + * return 0; + * } + * + * #define _ALS_NameOfFixHere + * #define NameOfFixHere FIXES_NameOfFixHere + * #endif + * + * A copyable version of this pattern is at the end of the file. + * + * Enums start with "E_" or "e_" depending on type, then follow rules for + * macros. + * + * NO libraries should be included - not even the default SA:MP ones. Let the + * user do it. + * + * Due to the above rule, you cannot assume any third party libraries AT ALL, so + * do not use them. This can lead to some code duplication, but also means + * that the version of the code used here can be tailored for optimisations. + * + * Certain terms may be shortened when dealing with long callback names to avoid + * compile truncation warnings (max symbol length is 31). Current list: + * + * "Checkpoint" -> "CP" + * "Update" -> "Upd" + * "TextDraw" -> "TD" + * "Object" -> "Obj" + * "Player" -> "P" + * + * Document all fixes at the top of the file, and highlight code. + * + * 4 space TABS - do not edit this file in PAWNO unless you know how to correct + * the indentation. + * + * All rules have exceptions, but they must be justifiable. For example + * "IS_FILTERSCRIPT" is a global variable, but is not called + * "FIXES_gIsFilterscript" to better match the "FILTERSCRIPT" macro it + * replaces. Now a macro for "_FIXES_gIsFilterscript". + * + * Variables which need to be fully global (i.e. not "static"), but should not + * actually be used by other people (e.g. appear inside a macro) should be + * prefixed with "_FIXES" instead of "FIXES" to indicate their private use. + * + * No comments beyond the end of column 80 (where the line in "PAWNO" is). + * + * If a bug is fixed in some version of the server it can be conditionally + * included here. This is done by checking for the existance of a native + * function introduced in the same server version. For example + * "TogglePlayerControllable" was fixed in 0.3eRC6, the same time as the + * "SetObjectMaterial" native was introduced, thus the inclusion becomes: + * + * #if !defined FIX_TogglePlayerControllable + * #if defined SetObjectMaterial + * #define FIX_TogglePlayerControllable (0) + * #else + * #define FIX_TogglePlayerControllable (1) + * #endif + * #elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable) + * #undef FIX_TogglePlayerControllable + * #define FIX_TogglePlayerControllable (2) + * #endif + * + * This only includes this fix if that native doesn't exist. A copyable + * version of this pattern is at the end of the file. + * + * To reduce general memory consumption, strings in this include are stored + * globally in constant arrays and referenced. This is EXACTLY as fast as + * using the string constants directly, but means that strings are not + * stored in the assembly multiple times (unless the string is only used + * once, in which case it's more work for no gain). See this post for more + * details: + * + * http://forum.sa-mp.com/showpost.php?p=1795601 + * + * DO NOT EDIT THIS FILE IN PAWNO OR ON GITHUB. Both mess up the spacing - + * GitHub in an almost irreversible way (except for the fact that nothing is + * irreversible in source control. Pawno spacing is less tricky to solve, + * and can be worked around if you know when it uses spaces and tabs - in + * short, always write code first THEN indent and you won't have a problem + * (in that editor at least, that is normally a bad way to write code). + * + * Documentation explanation: + * + * FIX: + * PROBLEM: + * SOLUTION: + * SEE: + * AUTHOR: + * POST: + * FIXED IN: + * + */ + +#if defined _INC_SAMP_Community_fixes + #endinput +#endif +#define _INC_SAMP_Community_fixes + +#if !defined _inc_fixes + #define _inc_fixes +#endif + +#define _FIXES_IS_UNSET(%0) ((2*%0-1+1)==-1) + +// We can add server version compiler code here to only compile fixes that apply +// to the version of the includes for which the user is compiling. +#if !defined FIX_GetPlayerColour + #if defined FIX_GetPlayerColor + #if _FIXES_IS_UNSET(FIX_GetPlayerColor) + #define FIX_GetPlayerColour (2) + #else + #define FIX_GetPlayerColour (FIX_GetPlayerColor) + #endif + #else + #define FIX_GetPlayerColour (1) + #endif +#elseif _FIXES_IS_UNSET(FIX_GetPlayerColour) + #undef FIX_GetPlayerColour + #define FIX_GetPlayerColour (2) +#endif + +#if !defined FIX_FILTERSCRIPT + #define FIX_FILTERSCRIPT (1) +#elseif _FIXES_IS_UNSET(FIX_FILTERSCRIPT) + #undef FIX_FILTERSCRIPT + #define FIX_FILTERSCRIPT (2) +#endif + +#if !defined FIX_SpawnPlayer + #define FIX_SpawnPlayer (1) +#elseif _FIXES_IS_UNSET(FIX_SpawnPlayer) + #undef FIX_SpawnPlayer + #define FIX_SpawnPlayer (2) +#endif + +#if !defined FIX_SetPlayerName + #define FIX_SetPlayerName (1) +#elseif _FIXES_IS_UNSET(FIX_SetPlayerName) + #undef FIX_SetPlayerName + #define FIX_SetPlayerName (2) +#endif + +#if !defined FIX_GetPlayerSkin + #define FIX_GetPlayerSkin (1) +#elseif _FIXES_IS_UNSET(FIX_GetPlayerSkin) + #undef FIX_GetPlayerSkin + #define FIX_GetPlayerSkin (2) +#endif + +#if !defined FIX_GetWeaponName + #define FIX_GetWeaponName (1) +#elseif _FIXES_IS_UNSET(FIX_GetWeaponName) + #undef FIX_GetWeaponName + #define FIX_GetWeaponName (2) +#endif + +#if !defined FIX_SetPlayerWorldBounds + #define FIX_SetPlayerWorldBounds (1) +#elseif _FIXES_IS_UNSET(FIX_SetPlayerWorldBounds) + #undef FIX_SetPlayerWorldBounds + #define FIX_SetPlayerWorldBounds (2) +#endif + +#if !defined FIX_TogglePlayerControllable + #if defined SetObjectMaterial + #define FIX_TogglePlayerControllable (0) + #else + #define FIX_TogglePlayerControllable (1) + #endif +#elseif _FIXES_IS_UNSET(FIX_TogglePlayerControllable) + #undef FIX_TogglePlayerControllable + #define FIX_TogglePlayerControllable (2) +#endif + +#if !defined FIX_HydraSniper + #define FIX_HydraSniper (1) +#elseif _FIXES_IS_UNSET(FIX_HydraSniper) + #undef FIX_HydraSniper + #define FIX_HydraSniper (2) +#endif + +#if !defined FIX_IsPlayerInCheckpoint + #define FIX_IsPlayerInCheckpoint (1) +#elseif _FIXES_IS_UNSET(FIX_IsPlayerInCheckpoint) + #undef FIX_IsPlayerInCheckpoint + #define FIX_IsPlayerInCheckpoint (2) +#endif + +#if !defined FIX_IsPlayerInRaceCheckpoint + #define FIX_IsPlayerInRaceCheckpoint (1) +#elseif _FIXES_IS_UNSET(FIX_IsPlayerInRaceCheckpoint) + #undef FIX_IsPlayerInRaceCheckpoint + #define FIX_IsPlayerInRaceCheckpoint (2) +#endif + +#if !defined FIX_GetPlayerWeapon + #define FIX_GetPlayerWeapon (1) +#elseif _FIXES_IS_UNSET(FIX_GetPlayerWeapon) + #undef FIX_GetPlayerWeapon + #define FIX_GetPlayerWeapon (2) +#endif + +#if !defined FIX_PutPlayerInVehicle + #define FIX_PutPlayerInVehicle (1) +#elseif _FIXES_IS_UNSET(FIX_PutPlayerInVehicle) + #undef FIX_PutPlayerInVehicle + #define FIX_PutPlayerInVehicle (2) +#endif + +#if !defined FIX_KEY_AIM + #if defined KEY_AIM + #define FIX_KEY_AIM (0) + #else + #define FIX_KEY_AIM (1) + #endif +#elseif _FIXES_IS_UNSET(FIX_KEY_AIM) + #undef FIX_KEY_AIM + #define FIX_KEY_AIM (2) +#endif + +#if !defined FIX_SPECIAL_ACTION_PISSING + #if defined SPECIAL_ACTION_PISSING + #define FIX_SPECIAL_ACTION_PISSING (0) + #else + #define FIX_SPECIAL_ACTION_PISSING (1) + #endif +#elseif _FIXES_IS_UNSET(FIX_SPECIAL_ACTION_PISSING) + #undef FIX_SPECIAL_ACTION_PISSING + #define FIX_SPECIAL_ACTION_PISSING (2) +#endif + +#if !defined FIX_Natives + #define FIX_Natives (1) +#elseif _FIXES_IS_UNSET(FIX_Natives) + #undef FIX_Natives + #define FIX_Natives (2) +#endif + +#if !defined FIX_IsValidVehicle + #if defined IsValidVehicle + #define FIX_IsValidVehicle (0) + #else + #define FIX_IsValidVehicle (FIX_Natives) + #endif +#elseif _FIXES_IS_UNSET(FIX_IsValidVehicle) + #undef FIX_IsValidVehicle + #define FIX_IsValidVehicle (2) +#endif + +#if !defined FIX_GetGravity + #if defined GetGravity + #define FIX_GetGravity (0) + #else + #define FIX_GetGravity (FIX_Natives) + #endif +#elseif _FIXES_IS_UNSET(FIX_GetGravity) + #undef FIX_GetGravity + #define FIX_GetGravity (2) +#endif + +#if !defined FIX_gpci + #if defined gpci + #define FIX_gpci (0) + #else + #define FIX_gpci (FIX_Natives) + #endif +#elseif _FIXES_IS_UNSET(FIX_gpci) + #undef FIX_gpci + #define FIX_gpci (2) +#endif + +#if !defined FIX_BODYPARTS + #if defined BODY_PART_TORSO + #define FIX_BODYPARTS (0) + #else + #define FIX_BODYPARTS (1) + #endif +#elseif _FIXES_IS_UNSET(FIX_BODYPARTS) + #undef FIX_BODYPARTS + #define FIX_BODYPARTS (2) +#endif + +#if !defined FIX_CAMERAMODES + #if defined CAM_MODE_NONE + #define FIX_CAMERAMODES (0) + #else + #define FIX_CAMERAMODES (1) + #endif +#elseif _FIXES_IS_UNSET(FIX_CAMERAMODES) + #undef FIX_CAMERAMODES + #define FIX_CAMERAMODES (2) +#endif + +#if !defined FIX_DriveBy + #define FIX_DriveBy (1) +#elseif _FIXES_IS_UNSET(FIX_DriveBy) + #undef FIX_DriveBy + #define FIX_DriveBy (2) +#endif + +#if !defined FIX_SetPlayerCheckpoint + #define FIX_SetPlayerCheckpoint (1) +#elseif _FIXES_IS_UNSET(FIX_SetPlayerCheckpoint) + #undef FIX_SetPlayerCheckpoint + #define FIX_SetPlayerCheckpoint (2) +#endif + +#if !defined FIX_SetPlayerRaceCheckpoint + #define FIX_SetPlayerRaceCheckpoint (1) +#elseif _FIXES_IS_UNSET(FIX_SetPlayerRaceCheckpoint) + #undef FIX_SetPlayerRaceCheckpoint + #define FIX_SetPlayerRaceCheckpoint (2) +#endif + +#if !defined FIX_TextDrawCreate + #define FIX_TextDrawCreate (1) +#elseif _FIXES_IS_UNSET(FIX_TextDrawCreate) + #undef FIX_TextDrawCreate + #define FIX_TextDrawCreate (2) +#endif + +#if !defined FIX_TextDrawSetString + #define FIX_TextDrawSetString (1) +#elseif _FIXES_IS_UNSET(FIX_TextDrawSetString) + #undef FIX_TextDrawSetString + #define FIX_TextDrawSetString (2) +#endif + +#if !defined FIX_AllowInteriorWeapons + #define FIX_AllowInteriorWeapons (1) +#elseif _FIXES_IS_UNSET(FIX_AllowInteriorWeapons) + #undef FIX_AllowInteriorWeapons + #define FIX_AllowInteriorWeapons (2) +#endif + +#if !defined FIX_OnPlayerEnterVehicle + #if defined OnPlayerClickMap + #define FIX_OnPlayerEnterVehicle (0) + #else + #define FIX_OnPlayerEnterVehicle (1) + #endif +#elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle) + #undef FIX_OnPlayerEnterVehicle + #define FIX_OnPlayerEnterVehicle (2) +#endif + +#if !defined FIX_OnPlayerEnterVehicle_2 + #define FIX_OnPlayerEnterVehicle_2 (1) +#elseif _FIXES_IS_UNSET(FIX_OnPlayerEnterVehicle) + #undef FIX_OnPlayerEnterVehicle_2 + #define FIX_OnPlayerEnterVehicle_2 (2) +#endif + +#if !defined FIX_AllowTeleport + #if defined OnPlayerClickMap + #define FIX_AllowTeleport (1) + #else + #define FIX_AllowTeleport (0) + #endif +#elseif _FIXES_IS_UNSET(FIX_AllowTeleport) + #undef FIX_AllowTeleport + #define FIX_AllowTeleport (2) +#endif + +#if !defined FIX_SetPlayerSpecialAction + #define FIX_SetPlayerSpecialAction (1) +#elseif _FIXES_IS_UNSET(FIX_SetPlayerSpecialAction) + #undef FIX_SetPlayerSpecialAction + #define FIX_SetPlayerSpecialAction (2) +#endif + +#if !defined FIX_ClearAnimations + #define FIX_ClearAnimations (1) +#elseif _FIXES_IS_UNSET(FIX_ClearAnimations) + #undef FIX_ClearAnimations + #define FIX_ClearAnimations (2) +#endif + +#if !defined FIX_ClearAnimations_2 + #define FIX_ClearAnimations_2 (1) +#elseif _FIXES_IS_UNSET(FIX_ClearAnimations_2) + #undef FIX_ClearAnimations_2 + #define FIX_ClearAnimations_2 (2) +#endif + +#if !defined FIX_GangZoneCreate + #define FIX_GangZoneCreate (1) +#elseif _FIXES_IS_UNSET(FIX_GangZoneCreate) + #undef FIX_GangZoneCreate + #define FIX_GangZoneCreate (2) +#endif + +#if !defined FIX_OnDialogResponse + #if defined GetVehicleModelInfo + #define FIX_OnDialogResponse (0) + #else + #define FIX_OnDialogResponse (1) + #endif +#elseif _FIXES_IS_UNSET(FIX_OnDialogResponse) + #undef FIX_OnDialogResponse + #define FIX_OnDialogResponse (2) +#endif + +#if !defined FIX_GetPlayerDialog + #define FIX_GetPlayerDialog (0) +#elseif _FIXES_IS_UNSET(FIX_GetPlayerDialog) + #undef FIX_GetPlayerDialog + #define FIX_GetPlayerDialog (2) +#endif + +#if !defined FIX_PlayerDialogResponse + #define FIX_PlayerDialogResponse (1) +#elseif _FIXES_IS_UNSET(FIX_PlayerDialogResponse) + #undef FIX_PlayerDialogResponse + #define FIX_PlayerDialogResponse (2) +#endif + +#if !defined FIX_SetSpawnInfo + #if defined GetPlayerVersion + #define FIX_SetSpawnInfo (0) + #else + #define FIX_SetSpawnInfo (1) + #endif +#elseif _FIXES_IS_UNSET(FIX_SetSpawnInfo) + #undef FIX_SetSpawnInfo + #define FIX_SetSpawnInfo (2) +#endif + +#if !defined FIX_SetPlayerSkin + #define FIX_SetPlayerSkin (1) +#elseif _FIXES_IS_UNSET(FIX_SetPlayerSkin) + #undef FIX_SetPlayerSkin + #define FIX_SetPlayerSkin (2) +#endif + +#if !defined FIX_HideMenuForPlayer + #define FIX_HideMenuForPlayer (1) +#elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer) + #undef FIX_HideMenuForPlayer + #define FIX_HideMenuForPlayer (2) +#endif + +#if !defined FIX_valstr + #define FIX_valstr (1) +#elseif _FIXES_IS_UNSET(FIX_valstr) + #undef FIX_valstr + #define FIX_valstr (2) +#endif + +#if !defined FIX_file_inc + #define FIX_file_inc (0) +#elseif _FIXES_IS_UNSET(FIX_file_inc) + #undef FIX_file_inc + #define FIX_file_inc (2) +#endif + +#if !defined FIX_fclose + #define FIX_fclose (FIX_file_inc) +#elseif _FIXES_IS_UNSET(FIX_fclose) + #undef FIX_fclose + #define FIX_fclose (2) +#endif + +#if !defined FIX_fwrite + #define FIX_fwrite (FIX_file_inc) +#elseif _FIXES_IS_UNSET(FIX_fwrite) + #undef FIX_fwrite + #define FIX_fwrite (2) +#endif + +#if !defined FIX_fread + #define FIX_fread (FIX_file_inc) +#elseif _FIXES_IS_UNSET(FIX_fread) + #undef FIX_fread + #define FIX_fread (2) +#endif + +#if !defined FIX_fputchar + #define FIX_fputchar (FIX_file_inc) +#elseif _FIXES_IS_UNSET(FIX_fputchar) + #undef FIX_fputchar + #define FIX_fputchar (2) +#endif + +#if !defined FIX_fgetchar + #define FIX_fgetchar (FIX_file_inc) +#elseif _FIXES_IS_UNSET(FIX_fgetchar) + #undef FIX_fgetchar + #define FIX_fgetchar (2) +#endif + +#if !defined FIX_fblockwrite + #define FIX_fblockwrite (FIX_file_inc) +#elseif _FIXES_IS_UNSET(FIX_fblockwrite) + #undef FIX_fblockwrite + #define FIX_fblockwrite (2) +#endif + +#if !defined FIX_fblockread + #define FIX_fblockread (FIX_file_inc) +#elseif _FIXES_IS_UNSET(FIX_fblockread) + #undef FIX_fblockread + #define FIX_fblockread (2) +#endif + +#if !defined FIX_fseek + #define FIX_fseek (FIX_file_inc) +#elseif _FIXES_IS_UNSET(FIX_fseek) + #undef FIX_fseek + #define FIX_fseek (2) +#endif + +#if !defined FIX_flength + #define FIX_flength (FIX_file_inc) +#elseif _FIXES_IS_UNSET(FIX_flength) + #undef FIX_flength + #define FIX_flength (2) +#endif + +#if !defined FIX_IsPlayerAttachedObjSlotUsed + #define FIX_IsPlayerAttachedObjSlotUsed (1) +#elseif _FIXES_IS_UNSET(FIX_IsPlayerAttachedObjSlotUsed) + #undef FIX_IsPlayerAttachedObjSlotUsed + #define FIX_IsPlayerAttachedObjSlotUsed (2) +#endif + +#if !defined FIX_SetPlayerAttachedObject + #define FIX_SetPlayerAttachedObject (1) +#elseif _FIXES_IS_UNSET(FIX_SetPlayerAttachedObject) + #undef FIX_SetPlayerAttachedObject + #define FIX_SetPlayerAttachedObject (2) +#endif + +#if !defined FIX_OnPlayerDeath + #define FIX_OnPlayerDeath (1) +#elseif _FIXES_IS_UNSET(FIX_OnPlayerDeath) + #undef FIX_OnPlayerDeath + #define FIX_OnPlayerDeath (2) +#endif + +#if !defined FIX_strins + #define FIX_strins (1) +#elseif _FIXES_IS_UNSET(FIX_strins) + #undef FIX_strins + #define FIX_strins (2) +#endif + +#if !defined FIX_IsPlayerConnected + #define FIX_IsPlayerConnected (1) +#elseif _FIXES_IS_UNSET(FIX_IsPlayerConnected) + #undef FIX_IsPlayerConnected + #define FIX_IsPlayerConnected (2) +#endif + +#if !defined FIX_OnPlayerCommandText + #define FIX_OnPlayerCommandText (1) +#elseif _FIXES_IS_UNSET(FIX_OnPlayerCommandText) + #undef FIX_OnPlayerCommandText + #define FIX_OnPlayerCommandText (2) +#endif + +#if !defined FIX_TrainExit + #define FIX_TrainExit (1) +#elseif _FIXES_IS_UNSET(FIX_TrainExit) + #undef FIX_TrainExit + #define FIX_TrainExit (2) +#endif + +#if !defined FIX_Kick + #if defined EnableVehicleFriendlyFire + #define FIX_Kick (0) + #else + #define FIX_Kick (1) + #endif +#elseif _FIXES_IS_UNSET(FIX_Kick) + #undef FIX_Kick + #define FIX_Kick (2) +#endif + +#if !defined FIX_OnVehicleMod + #define FIX_OnVehicleMod (1) +#elseif _FIXES_IS_UNSET(FIX_OnVehicleMod) + #undef FIX_OnVehicleMod + #define FIX_OnVehicleMod (2) +#endif + +#if !defined FIX_random + #define FIX_random (0) +#elseif _FIXES_IS_UNSET(FIX_random) + #undef FIX_random + #define FIX_random (2) +#endif + +#if !defined FIX_sleep + #define FIX_sleep (1) +#elseif _FIXES_IS_UNSET(FIX_sleep) + #undef FIX_sleep + #define FIX_sleep (2) +#endif + +#if !defined FIX_Menus + #define FIX_Menus (1) +#elseif _FIXES_IS_UNSET(FIX_Menus) + #undef FIX_Menus + #define FIX_Menus (2) +#endif + +#if !defined FIX_AddMenuItem + #define FIX_AddMenuItem (FIX_Menus) +#elseif _FIXES_IS_UNSET(FIX_AddMenuItem) + #undef FIX_AddMenuItem + #define FIX_AddMenuItem (2) +#endif + +#if !defined FIX_SetMenuColumnHeader + #define FIX_SetMenuColumnHeader (FIX_Menus) +#elseif _FIXES_IS_UNSET(FIX_SetMenuColumnHeader) + #undef FIX_SetMenuColumnHeader + #define FIX_SetMenuColumnHeader (2) +#endif + +#if !defined FIX_ShowMenuForPlayer + #define FIX_ShowMenuForPlayer (FIX_Menus) +#elseif _FIXES_IS_UNSET(FIX_ShowMenuForPlayer) + #undef FIX_ShowMenuForPlayer + #define FIX_ShowMenuForPlayer (2) +#endif + +#if !defined FIX_HideMenuForPlayer + #define FIX_HideMenuForPlayer (FIX_Menus) +#elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer) + #undef FIX_HideMenuForPlayer + #define FIX_HideMenuForPlayer (2) +#endif + +#if !defined FIX_GetPlayerMenu + #define FIX_GetPlayerMenu (1) +#elseif _FIXES_IS_UNSET(FIX_GetPlayerMenu) + #undef FIX_GetPlayerMenu + #define FIX_GetPlayerMenu (2) +#endif + +#if !defined FIX_HideMenuForPlayer_2 + #define FIX_HideMenuForPlayer_2 (0) +#elseif _FIXES_IS_UNSET(FIX_HideMenuForPlayer_2) + #undef FIX_HideMenuForPlayer_2 + #define FIX_HideMenuForPlayer_2 (2) +#elseif FIX_HideMenuForPlayer_2 && !FIX_GetPlayerMenu + #error FIX_HideMenuForPlayer_2 requires FIX_GetPlayerMenu +#endif + +#if !defined FIX_DisableMenu + #define FIX_DisableMenu (FIX_Menus) +#elseif _FIXES_IS_UNSET(FIX_DisableMenu) + #undef FIX_DisableMenu + #define FIX_DisableMenu (2) +#endif + +#if !defined FIX_DisableMenuRow + #define FIX_DisableMenuRow (FIX_Menus) +#elseif _FIXES_IS_UNSET(FIX_DisableMenuRow) + #undef FIX_DisableMenuRow + #define FIX_DisableMenuRow (2) +#endif + +#if FIX_Menus || FIX_AddMenuItem || FIX_SetMenuColumnHeader || FIX_ShowMenuForPlayer || FIX_HideMenuForPlayer || FIX_DisableMenu || FIX_DisableMenuRow + #define _FIX_Menus (1) +#else + #define _FIX_Menus (2) +#endif + +#if !defined FIX_GetPlayerInterior + #define FIX_GetPlayerInterior (1) +#elseif _FIXES_IS_UNSET(FIX_GetPlayerInterior) + #undef FIX_GetPlayerInterior + #define FIX_GetPlayerInterior (2) +#endif + +#if !defined FIX_ApplyAnimation + #define FIX_ApplyAnimation (1) +#elseif _FIXES_IS_UNSET(FIX_ApplyAnimation) + #undef FIX_ApplyAnimation + #define FIX_ApplyAnimation (2) +#endif + +#if !defined FIX_ApplyAnimation_2 + #define FIX_ApplyAnimation_2 (1) +#elseif _FIXES_IS_UNSET(FIX_ApplyAnimation_2) + #undef FIX_ApplyAnimation_2 + #define FIX_ApplyAnimation_2 (2) +#endif + +#if !defined FIX_OnPlayerSpawn + #define FIX_OnPlayerSpawn (1) +#elseif _FIXES_IS_UNSET(FIX_OnPlayerSpawn) + #undef FIX_OnPlayerSpawn + #define FIX_OnPlayerSpawn (2) +#endif + +#if !defined FIX_GameText + #define FIX_GameText (1) +#elseif _FIXES_IS_UNSET(FIX_GameText) + #undef FIX_GameText + #define FIX_GameText (2) +#endif + +#if !defined FIX_HideGameText + #define FIX_HideGameText (0) +#elseif _FIXES_IS_UNSET(FIX_HideGameText) + #undef FIX_HideGameText + #define FIX_HideGameText (2) +#endif + +#if !defined FIX_GameTextStyles + #define FIX_GameTextStyles (0) +#elseif _FIXES_IS_UNSET(FIX_GameTextStyles) + #undef FIX_GameTextStyles + #define FIX_GameTextStyles (2) +#elseif FIX_GameTextStyles && !FIX_GameText + #error FIX_GameTextStyles requires FIX_GameText +#endif + +#if !defined FIX_OnPlayerConnect + #define FIX_OnPlayerConnect (1) +#elseif _FIXES_IS_UNSET(FIX_OnPlayerConnect) + #undef FIX_OnPlayerConnect + #define FIX_OnPlayerConnect (2) +#endif + +#if !defined FIX_OnPlayerDisconnect + #define FIX_OnPlayerDisconnect (1) +#elseif _FIXES_IS_UNSET(FIX_OnPlayerDisconnect) + #undef FIX_OnPlayerDisconnect + #define FIX_OnPlayerDisconnect (2) +#endif + +#if !defined FIX_CreatePlayerTextDraw + #define FIX_CreatePlayerTextDraw (1) +#elseif _FIXES_IS_UNSET(FIX_CreatePlayerTextDraw) + #undef FIX_CreatePlayerTextDraw + #define FIX_CreatePlayerTextDraw (2) +#endif + +#if !defined FIX_PlayerTextDrawSetString + #define FIX_PlayerTextDrawSetString (1) +#elseif _FIXES_IS_UNSET(FIX_PlayerTextDrawSetString) + #undef FIX_PlayerTextDrawSetString + #define FIX_PlayerTextDrawSetString (2) +#endif + +#if !defined FIX_SetPlayerCamera + #define FIX_SetPlayerCamera (1) +#elseif _FIXES_IS_UNSET(FIX_SetPlayerCamera) + #undef FIX_SetPlayerCamera + #define FIX_SetPlayerCamera (2) +#endif + +#if !defined FIX_SetPlayerTime + #define FIX_SetPlayerTime (1) +#elseif _FIXES_IS_UNSET(FIX_SetPlayerTime) + #undef FIX_SetPlayerTime + #define FIX_SetPlayerTime (2) +#endif + +#if !defined FIX_OnPlayerRequestClass + #define FIX_OnPlayerRequestClass (1) +#elseif _FIXES_IS_UNSET(FIX_OnPlayerRequestClass) + #undef FIX_OnPlayerRequestClass + #define FIX_OnPlayerRequestClass (2) +#endif + +#if !defined FIX_SetPlayerColour + #if defined FIX_SetPlayerColor + #if _FIXES_IS_UNSET(FIX_SetPlayerColor) + #define FIX_SetPlayerColour (2) + #else + #define FIX_SetPlayerColour (FIX_SetPlayerColor) + #endif + #else + #define FIX_SetPlayerColour (1) + #endif +#elseif _FIXES_IS_UNSET(FIX_SetPlayerColour) + #undef FIX_SetPlayerColour + #define FIX_SetPlayerColour (2) +#endif + +#if !defined FIX_FileMaths + #define FIX_FileMaths (1) +#elseif _FIXES_IS_UNSET(FIX_FileMaths) + #undef FIX_FileMaths + #define FIX_FileMaths (2) +#endif + +#if !defined FIX_GetPlayerWeaponData + #define FIX_GetPlayerWeaponData (0) +#elseif _FIXES_IS_UNSET(FIX_GetPlayerWeaponData) + #undef FIX_GetPlayerWeaponData + #define FIX_GetPlayerWeaponData (2) +#endif + +/* + * CHAIN_ORDER + * + * Allows y_hooks to call things in the correct order when it exists. + */ + +#if !defined CHAIN_ORDER + #define CHAIN_ORDER() 0 +#endif + +/* + * PRE_HOOK + * + * A method of pre-hooking callbacks to still have them called before any ones + * re-written by y_hooks. + */ + +#define PRE_HOOK(%0) forward @CO_%0();public @CO_%0(){return CHAIN_ORDER()+1;} + +PRE_HOOK(FIXES) +#undef CHAIN_ORDER +#define CHAIN_ORDER @CO_FIXES + +/* + * _FIXES_IncludeStates + * + * Define the "_ALS" states used by hooks. + */ + +static stock _FIXES_IncludeStates() <_ALS : _ALS_x0, _ALS : _ALS_x1, _ALS : _ALS_x2, _ALS : _ALS_x3> +{ +} + +static stock _FIXES_IncludeStates() <_ALS : _ALS_go> +{ +} + +/* + * FIXES_GT_STYLE_COUNT + * + * The number of GameText styles recreated using TextDraw functions. This is 4 + * by default, but can be extended to 6 if you want location and vehicle styles. + */ + +#if FIX_GameText + #if FIX_GameTextStyles + #define FIXES_GT_STYLE_COUNT (14) + #else + #define FIXES_GT_STYLE_COUNT (7) + #endif +#endif + +/* + * FIXES_SilentKick + * + * If this define is set to 1, then players will not be given a message when + * they are kicked for cheats, instead they will just loose connection to the + * server. + */ + +#if !defined FIXES_SilentKick + #define FIXES_SilentKick 0 +#elseif _FIXES_IS_UNSET(FIXES_SilentKick) + #undef FIXES_SilentKick + #define FIXES_SilentKick 2 +#endif + +/* + * FIXES_Debug + * + * If this define is set to 1, then debug printing is turned on for any + * functions which may use it. Otherwise, the compiler entirely removes the + * code to print anything, leaving 0 run-time overhead. + */ + +#if defined FIXES_Debug + #if _FIXES_IS_UNSET(FIXES_Debug) + #undef FIXES_Debug + #elseif FIXES_Debug == 1 + #define FIXES_PRINTF(%0); print(_FIXES_gIsFilterscript ? ("* FIXES_PRINTF (FS):") : ("* FIXES_PRINTF (GM):")),printf("*** " %0); + #else + #undef FIXES_Debug + #endif +#endif + +/* + * FIXES_UseStateHooks + * + * A marker to indicate that this version of fixes.inc uses state-based hooks. + */ +#define FIXES_UseStateHooks + +/* + * FIXES_PRINTF + * + * A special "printf" function only compiled when "FIXES_Debug" is set. + */ + +#if !defined FIXES_PRINTF + #define FIXES_Debug 0 + #define FIXES_PRINTF(%0); +#endif + +/* + * INVALID_DIALOG_ID + * + * Set when a player can't see a dialog. + */ + +#if !defined INVALID_DIALOG_ID + #define INVALID_DIALOG_ID (-1) +#endif + +/* + * FIXES_Single + * + * If this define is set to 1, then the old style include is used, with no + * support for multiple scripts running at the same time on the server (i.e. no + * gamemodes and filter scripts at the same time). You can only have one or the + * other or bugs. + */ + +#if !defined FIXES_Single + #define FIXES_Single (1) +#elseif _FIXES_IS_UNSET(FIXES_Single) + #undef FIXES_Single + #define FIXES_Single (2) +#endif + +/* + * _FIXES_IS_IN_CHARGE + * + * Test to see if this script is in command or not (master). + */ + +#if FIXES_Single + #define _FIXES_IS_IN_CHARGE(%0) +#else + #define _FIXES_IS_IN_CHARGE(%0) if (%0(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)) +#endif + +/* + * E_FIXES_WORLDBOUND_DATA + * + * Store data for each player on their worldbound data. + */ +enum E_FIXES_WORLDBOUND_DATA +{ + // "Previous". + Float:E_FIXES_WORLDBOUND_DATA_PX, + Float:E_FIXES_WORLDBOUND_DATA_PY, + Float:E_FIXES_WORLDBOUND_DATA_PZ, + // "Lower". + Float:E_FIXES_WORLDBOUND_DATA_LX, + Float:E_FIXES_WORLDBOUND_DATA_LY, + // "Upper". + Float:E_FIXES_WORLDBOUND_DATA_UX, + Float:E_FIXES_WORLDBOUND_DATA_UY +} + +/* + * e_FIXES_BOOLS + * + * Collection of boolean values for players, designed to collect multiple checks + * in to one variable to reduce memory consumption. + */ +enum e_FIXES_BOOLS (<<= 1) +{ + // Handy definition for nothing set. + e_FIXES_BOOLS_NONE = 0, + // Does this player have worldbounds enabled? + e_FIXES_BOOLS_WORLDBOUNDS = 1, + e_FIXES_BOOLS_UNCONTROLLABLE, + e_FIXES_BOOLS_PUT_IN_VEHICLE, + e_FIXES_BOOLS_BLOCK, + e_FIXES_BOOLS_TELEPORT, + e_FIXES_BOOLS_CONNECTED, + e_FIXES_BOOLS_INTERIOR, + e_FIXES_BOOLS_PUT_IN_TRAIN, + e_FIXES_BOOLS_KICKED, + e_FIXES_BOOLS_ON_PLAYER_CONNECT, + e_FIXES_BOOLS_DRIVE_BY, + e_FIXES_BOOLS_FIRST_SPAWN, + e_FIXES_BOOLS_FIRST_CLASS, + e_FIXES_BOOLS_SPECTATING, + e_FIXES_BOOLS_CP_DELAYED, + e_FIXES_BOOLS_RACE_CP_DELAYED +} + +/* + * e_FIXES_SETTINGS + * + * Collection of boolean values for the script as a whole. Stores a variety of + * settings that are true/false. + */ +enum e_FIXES_SETTINGS (<<= 1) +{ + // Handy definition for nothing set. + e_FIXES_SETTINGS_NONE = 0, + e_FIXES_SETTINGS_INTERIOR = 1, + e_FIXES_SETTINGS_ADMIN_TELEPORT, + e_FIXES_SETTINGS_IN_CHARGE, + e_FIXES_SETTINGS_DROP_ALL_DATA, + e_FIXES_SETTINGS_MENU_SET, + e_FIXES_SETTINGS_ENDING, + e_FIXES_SETTINGS_ENDED, + e_FIXES_SETTINGS_NO_GAME_TEXT, + e_FIXES_SETTINGS_SECOND_USE +} + +/* + * _FIXES_CEILDIV + * + * Do a ceiling division of the first number by the second number. + */ +#define _FIXES_CEILDIV(%0,%1) (((%0) + (%1) - 1) / (%1)) + +/* + * _FIXES_INFINITY + * + * IEEE 754 definition of infinity. + */ +#define _FIXES_INFINITY (Float:0x7F800000) + +/* + * _FIXES_N_INFINITY + * + * IEEE 754 definition of negative infinity. + */ +#define _FIXES_N_INFINITY (Float:0xFF800000) + +/* + * _FIXES_ATTACHMENTS + * + * The number of players whose attachment data (10-bits) can be stored in one + * cell. + */ +#define _FIXES_ATTACHMENTS (cellbits / MAX_PLAYER_ATTACHED_OBJECTS) + +/* + * _FIXES_FOREACH + * + * A new version of "foreach", but just for this library. + */ +#define _FIXES_FOREACH(%1,%0) for (new %0 = MAX_PLAYERS; (%0 = %1[%0]) != MAX_PLAYERS; ) + +/* + * _FIXES_IN_RANGE + * + * Checks if the first parameter is between the other two: %1 <= %0 < %2 (but + * faster). + */ +#define _FIXES_IN_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) < ((%2) - ((%1) + cellmin))) + +/* + * _FIXES_NO_RANGE + * + * Checks if the first parameter is not between the other two: !(%1 <= %0 < %2) + * (but faster). + */ +#define _FIXES_NO_RANGE(%0,%1,%2) (((%0) - ((%1) + cellmin)) >= ((%2) - ((%1) + cellmin))) + +/* + * _FIXES_FORWARD + * + * Forwards a hooked callbacks, and defines the default state implementations. + */ +#define _FIXES_FORWARD%0(%1); \ + forward%0(%1); \ + public%0(%1) <_ALS : _ALS_x0, _ALS : _ALS_x1> { return 1; } \ + public%0(%1) <> { return 1; } + +/* + * _FIXES_IS_PLAYER_CONNECTED + * + * Always valid "IsPlayerConnected" check. + */ +#define _FIXES_IS_PLAYER_CONNECTED(%0) (_FIXES_IN_RANGE((%0), 0, MAX_PLAYERS) && IsPlayerConnected((%0))) + +// These varaibles are NOT pre-processor dependent as they are stock. It's just +// simpler than trying to figure out when or if a semi-colon is needed. +#if !FIX_FILTERSCRIPT +static +#endif +stock + /* + * bool:_FIXES_gIsFilterscript + * + * Runtime equivalent of "FILTERSCRIPT" for when it is not set by the user. + */ + bool:_FIXES_gIsFilterscript; + +stock + /* + * FIXES_gscSpace[] + * + * A single re-usable space. + */ + FIXES_gscSpace[] = " "; + +#if FIXES_Debug +new +#else +static stock +#endif + /* + * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)] + * + * A record of which menus have and haven't been shown yet. We ensure that + * this only exists when required, since it depends on add and remove + * functions to be called at the right time. + */ +#if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable + FIXES_gsPlayersIterator[MAX_PLAYERS + 1] = {0, 1, ...}, +#endif + /* + * FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)] + * + * A record of which menus have and haven't been shown yet. + */ + FIXES_gsValidMenus[_FIXES_CEILDIV(MAX_MENUS, cellbits)], + /* + * FIXES_gsPlayerIP[MAX_PLAYERS] + * + * A player's IP as a 32-bit integer. + */ + FIXES_gsPlayerIP[MAX_PLAYERS] = {-1, ...}, + /* + * FIXES_gsPlayerSkin[MAX_PLAYERS] + * + * The skin the player is currently using. + */ + FIXES_gsPlayerSkin[MAX_PLAYERS], + /* + * e_FIXES_BOOLEAN_DATA:FIXES_gsPlayerBools[MAX_PLAYERS] + * + * Collection of boolean values for players. + */ + e_FIXES_BOOLS:FIXES_gsPlayerBools[MAX_PLAYERS], + /* + * FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA] + * + * All data for players on where their worldbounds are and where they last + * were before they went through the bounds by crouching. + */ +#if FIX_SetPlayerWorldBounds + FIXES_gsWorldbounds[MAX_PLAYERS][E_FIXES_WORLDBOUND_DATA], +#endif + /* + * FIXES_gsPlayerWeapon[MAX_PLAYERS] + * + * Stores the weapon set by "SetPlayerArmedWeapon" when in a vehicle. + */ + FIXES_gsPlayerWeapon[MAX_PLAYERS], + /* + * FIXES_gsVehicleSeatData[MAX_PLAYERS] + * + * What vehicle the player is due to go in. + */ + FIXES_gsVehicleSeatData[MAX_PLAYERS], + /* + * FIXES_gsVehicleLocked[(MAX_PLAYERS * MAX_VEHICLES + cellbits - 1) / cellbits] + * + * Is this vehicle locked for a player. This is a compressed 2D binary + * array, made by concatenating many bits together (saves 1kb-3kb)! Is + * there a reason this array exists? + */ + //FIXES_gsVehicleLocked[_FIXES_CEILDIV(MAX_PLAYERS * MAX_VEHICLES, cellbits)], + /* + * FIXES_gsDialogID[MAX_PLAYERS] + * + * Stores the true ID of the dialog the player is looking at to prevent + * spoofing. + */ + FIXES_gsDialogID[MAX_PLAYERS] = {-1, ...}, + /* + * FIXES_gsInterior[MAX_PLAYERS] + * + * The player's current interior. + */ + FIXES_gsInterior[MAX_PLAYERS], + /* + * e_FIXES_SETTINGS:FIXES_gsSettings + * + * A collection of 1-bit options, compressed together to save space. + */ + e_FIXES_SETTINGS:FIXES_gsSettings = e_FIXES_SETTINGS_SECOND_USE, + /* + * FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)] + * + * A record of which attached object slots a player has used. + */ + FIXES_gsObjectSlots[_FIXES_CEILDIV(MAX_PLAYERS, _FIXES_ATTACHMENTS)], + /* + * FIXES_gsLastAnimation[MAX_PLAYERS] + * + * The last animation a player used. + */ + FIXES_gsLastAnimation[MAX_PLAYERS], + /* + * FIXES_gsLastCash[MAX_PLAYERS] + * + * A player's cash before dying. + */ + FIXES_gsLastCash[MAX_PLAYERS], + /* + * FIXES_gsDriveByWeapon[MAX_PLAYERS] + * + * The weapon to set after re-enter to vehicle. + */ + FIXES_gsDriveByWeapon[MAX_PLAYERS], + /* + * FIXES_gsCurrentMenu[MAX_PLAYERS] + * + * The menu the player can currently see. + */ + Menu:FIXES_gsCurrentMenu[MAX_PLAYERS] = {Menu:INVALID_MENU, ...}, + /* + * Text:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT] + * + * The pre-defined TextDraw styles used to recreate the bugged GameText + * styles for GameTextForAll. + */ +#if FIX_GameText + Text:FIXES_gsGTStyle[FIXES_GT_STYLE_COUNT], +#endif + /* + * FIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1] + * + * A linked list of which players can see a certain GameText style. + */ +#if FIX_GameText + FIXES_gsPlayerPGTShown[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1], +#endif + /* + * PlayerText:FIXES_gsPGTStyle[FIXES_GT_STYLE_COUNT][MAX_PLAYERS] + * + * The predefined TextDraw styles used to recreate the bugged GameText + * styles for GameTextForPlayer. + */ +#if FIX_GameText + PlayerText:FIXES_gsPGTStyle[MAX_PLAYERS][FIXES_GT_STYLE_COUNT], +#endif + /* + * FIXES_gsPGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS] + * + * The timers used to hide per-player GameText messages. + */ +#if FIX_GameText + FIXES_gsGTTimer[FIXES_GT_STYLE_COUNT][MAX_PLAYERS + 1], +#endif + /* + * FIXES_gsClassAnimTimer[MAX_PLAYERS], + * + * Used for storing the timer ID for deferring class selection animation + * application. + */ + FIXES_gsAnimTimer[MAX_PLAYERS], + /* + * FIXES_gsClassAnimName[MAX_PLAYERS][60], + * + * Used for storing the animation name. + */ +#if FIX_ApplyAnimation_2 + FIXES_gsClassAnimName[MAX_PLAYERS][60], +#endif + /* + * FIXES_gsPlayerAnimLibs[MAX_PLAYERS][_FIXES_CEILDIV(135, cellbits)], + * + * Which animation libraries the player has synced. + */ +#if FIX_ApplyAnimation_2 + FIXES_gsPlayerAnimLibs[MAX_PLAYERS][_FIXES_CEILDIV(135, cellbits)], +#endif + /* + * FIXES_pvarNotNewPlayer[] + * + * This variable records wether or not this player is brand new to the + * server, and not just having "OnPlayerConnect" called due to a script + * load. There are certain functions that need applying only the very first + * time they connect, then this gets set. + */ + FIXES_pvarNotNewPlayer[] = "FIXES_pvarNotNewPlayer", + /* + * FIXES_pvarPlayerWeapon[] + * + * Name of the pvar in which to store the player's current weapon. + */ + FIXES_pvarPlayerWeapon[] = "FIXES_pvarPlayerWeapon", + /* + * FIXES_pvarPlayerSkin[] + * + * Name of the pvar in which to store the player's current skin. + */ + FIXES_pvarPlayerSkin[] = "FIXES_pvarPlayerSkin", + /* + * FIXES_pvarPlayerSpectate[] + * + * Name of the pvar in which to store the player's spectator mode. + */ + FIXES_pvarPlayerSpectate[] = "FIXES_pvarPlayerSpectate", + /* + * FIXES_gscKick[] + * + * Name of the kick timer function. + */ + FIXES_gscKick[] = "_FIXES_Kick", + /* + * FIXES_pvarKick[] + * + * Name of the pvar in which to store a player's kick timer. + */ + FIXES_pvarKick[] = "FIXES_pvarKick", + /* + * FIXES_pvarPlayerDialog[] + * + * Name of the pvar in which to store the player's current dialogid. + */ + FIXES_pvarPlayerDialog[] = "FIXES_pvarPlayerDialog", + /* + * FIXES_pvarPlayerInterior[] + * + * A player's current interior. + */ + FIXES_pvarPlayerInterior[] = "FIXES_pvarPlayerInterior", + /* + * FIXES_pvarCurrentDialog[] + * + * Used in OnDialogResponse to be able to get the correct ID in multiple + * scripts while still correctly resetting the ID for future use. + */ + FIXES_pvarCurrentDialog[] = "FIXES_pvarCurrentDialog", + /* + * FIXES_pvarPlayerLastCash[] + * + * Used in OnPlayerDeath to save a player's cash before death. + */ + FIXES_pvarPlayerLastCash[] = "FIXES_pvarPlayerLastCash", + /* + * FIXES_gscHideGameTextTimer[] + * + * Name of the GameText hide timer function. + */ + FIXES_gscHideGameTextTimer[] = "_FIXES_HideGameTextTimer", + /* + * FIXES_gscDriveBy[] + * + * Name of the Drive-By timer function. + */ + FIXES_gscDriveBy[] = "_FIXES_DriveBy", + /* + * FIXES_gscSetCamera[] + * + * Name of the SetCamera timer function. + */ + FIXES_gscSetCamera[] = "_FIXES_SetCamera", + /* + * FIXES_gscSetTime[] + * + * Name of the SetTime timer function. + */ + FIXES_gscSetTime[] = "_FIXES_SetTime", + /* + * FIXES_gscSetColor[] + * + * Name of the SetColor timer function. + */ + FIXES_gscSetColor[] = "_FIXES_SetColor", + /* + * FIXES_gscSetCheckpoint[] + * + * Name of the SetCheckpoint timer function. + */ + FIXES_gscSetCheckpoint[] = "_FIXES_SetCheckpoint", + /* + * FIXES_pvarPlayerCheckpoint[] + * + * Name of the pvar in which to store the player's checkpoint state. + */ + FIXES_pvarPlayerCheckpoint[] = "FIXES_pvarPlayerCheckpoint", + /* + * FIXES_gscSetRaceCheckpoint[] + * + * Name of the SetRaceCheckpoint timer function. + */ + FIXES_gscSetRaceCheckpoint[] = "_FIXES_SetRaceCheckpoint", + /* + * FIXES_pvarPlayerRaceCheckpoint[] + * + * Name of the pvar in which to store the player's race checkpoint state. + */ + FIXES_pvarPlayerRaceCheckpoint[] = "FIXES_pvarPlayerRaceCheckpoint", + /* + * FIXES_gscNULL[] + * + * NULL. This is stored as a global string to reduce memory usage. + */ + FIXES_gscNULL[] = "\1"; + +static stock const + /* + * FIXES_gscPlayerColours[100] + * + * There are only 100 colours used by default, with SA:MP looping through + * them repeatedly. + */ +#if FIX_GetPlayerColour + FIXES_gscPlayerColours[100] = + { + 0xFF8C13FF, 0xC715FFFF, 0x20B2AAFF, 0xDC143CFF, 0x6495EDFF, + 0xF0E68CFF, 0x778899FF, 0xFF1493FF, 0xF4A460FF, 0xEE82EEFF, + 0xFFD720FF, 0x8B4513FF, 0x4949A0FF, 0x148B8BFF, 0x14FF7FFF, + 0x556B2FFF, 0x0FD9FAFF, 0x10DC29FF, 0x534081FF, 0x0495CDFF, + 0xEF6CE8FF, 0xBD34DAFF, 0x247C1BFF, 0x0C8E5DFF, 0x635B03FF, + 0xCB7ED3FF, 0x65ADEBFF, 0x5C1ACCFF, 0xF2F853FF, 0x11F891FF, + 0x7B39AAFF, 0x53EB10FF, 0x54137DFF, 0x275222FF, 0xF09F5BFF, + 0x3D0A4FFF, 0x22F767FF, 0xD63034FF, 0x9A6980FF, 0xDFB935FF, + 0x3793FAFF, 0x90239DFF, 0xE9AB2FFF, 0xAF2FF3FF, 0x057F94FF, + 0xB98519FF, 0x388EEAFF, 0x028151FF, 0xA55043FF, 0x0DE018FF, + 0x93AB1CFF, 0x95BAF0FF, 0x369976FF, 0x18F71FFF, 0x4B8987FF, + 0x491B9EFF, 0x829DC7FF, 0xBCE635FF, 0xCEA6DFFF, 0x20D4ADFF, + 0x2D74FDFF, 0x3C1C0DFF, 0x12D6D4FF, 0x48C000FF, 0x2A51E2FF, + 0xE3AC12FF, 0xFC42A8FF, 0x2FC827FF, 0x1A30BFFF, 0xB740C2FF, + 0x42ACF5FF, 0x2FD9DEFF, 0xFAFB71FF, 0x05D1CDFF, 0xC471BDFF, + 0x94436EFF, 0xC1F7ECFF, 0xCE79EEFF, 0xBD1EF2FF, 0x93B7E4FF, + 0x3214AAFF, 0x184D3BFF, 0xAE4B99FF, 0x7E49D7FF, 0x4C436EFF, + 0xFA24CCFF, 0xCE76BEFF, 0xA04E0AFF, 0x9F945CFF, 0xDCDE3DFF, + 0x10C9C5FF, 0x70524DFF, 0x0BE472FF, 0x8A2CD7FF, 0x6152C2FF, + 0xCF72A9FF, 0xE59338FF, 0xEEDC2DFF, 0xD8C762FF, 0xD8C762FF + }, +#endif + /* + * FIXES_gscMaxPassengers[] + * + * This is a compressed (4-bit) list of the maximum number of passengers in + * any vehicle, confirmed by a number of sources. "F" (15) means invalid + * vehicle. + */ +#if FIX_OnPlayerEnterVehicle + FIXES_gscMaxPassengers[] = + { + 0x10331113, 0x11311131, 0x11331313, 0x80133301, 0x1381F110, 0x10311103, 0x10001F10, 0x11113311, 0x13113311, + 0x31101100, 0x30001301, 0x11031311, 0x11111331, 0x10013111, 0x01131100, 0x11111110, 0x11100031, 0x11130221, + 0x33113311, 0x11111101, 0x33101133, 0x101001F0, 0x03133111, 0xFF11113F, 0x13330111, 0xFF131111, 0x0000FF3F + }, +#endif + /* + * FIXES_gscVehicleMods[] + * + * This is a bit array of all the valid mods (-1000) for all vehicles (-400) + * EXCEPT for vehicle 576 (Tornado), which has just TWO extra mods on it, + * that should spill over in to an extra cell of data (requiring an extra + * 848 bytes of data total to make the array work). Instead this (hopefully + * rare) case is handled explicitly in "OnVehicleMod". It seems that most + * vehicles are: + * + * 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + * + * I don't know yet if this can be used to our advantage to improve the code + * somehow - it seems like that would require more explicit model handling. + */ +#if FIX_OnVehicleMod + FIXES_gscVehicleMods[] = + { + 0x033C2700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x021A27FA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x023B2785, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02BC4703, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x03BA278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x028E078A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02310744, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x0228073A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02BD4701, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x023A2780, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x0228077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x027A27CA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x0282278A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x023E07C0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x03703730, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x031D2775, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02BE4788, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000, + 0x02010771, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x029A0FCE, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x03382700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x023F8795, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x029F078C, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000, + 0x029627EA, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x0236C782, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x029E1FCA, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0xFC000437, 0x00000000, 0x021C0000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x03FE6007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00001B87, 0x00000001, 0x01E00000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x039E07D2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x023CC700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x038E07D6, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000, + 0x023D0709, 0x00000000, 0x00FFFE00, 0x00000007, 0x0000C000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x029E1F8A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000, + 0x029C077A, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000, + 0x02BD076C, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0xFFFFFE00, 0x00000007, 0x00000000, 0x000001F8, + 0x02000700, 0x00000000, 0x00FFFFFE, 0x00000007, 0xC0000000, 0x00002007, + 0xFE000700, 0x00000003, 0x00FFFE00, 0x00000007, 0x00003C00, 0x00000600, + 0xCE000700, 0xFF800000, 0x00FFFE01, 0x00000007, 0x3C000000, 0x00000000, + 0x02000700, 0x000003FC, 0x00FFFE00, 0x00000007, 0x003C0000, 0x00001800, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x007FE000, 0x00FFFE00, 0x00000007, 0x03C00000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000047, 0x0000003E, 0x3C000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00001C00, 0x00FFFE00, 0x0000000F, 0x00000000, 0x0003C000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x000003C0, 0xC0000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x029607C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x03FFE7CD, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x031727F1, 0x00000000, 0x00FFFE00, 0x00000007, 0x00030000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x025627F0, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x039E07C2, 0x00000000, 0x00FFFE00, 0x00000007, 0x0003C000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000, + 0x02000700, 0x00000000, 0x00FFFE00, 0x00000007, 0x00000000, 0x00000000 + }, +#endif + /* + * FIXES_gscAnimIndexes[] + * + * Which index each letter starts at. Sometimes crashes the compiler... + */ +#if FIX_ApplyAnimation || FIX_ApplyAnimation_2 + FIXES_gscAnimIndexes[24] = + { + 0, 2, 21, 35, 42, 42, 53, 62, 64, 67, 68, 71, 75, 81, 82, 84, 94, 96, 104, 122, 127, 128, 131, 135 + }, +#endif + /* + * FIXES_gscAnimLib[] + * + * List of valid animation libraries. + */ +#if FIX_ApplyAnimation || FIX_ApplyAnimation_2 + FIXES_gscAnimLib[135][] = + { + "AIRPORT", "ATTRACTORS", "BAR", "BASEBALL", "BD_FIRE", + "BEACH", "BENCHPRESS", "BF_INJECTION", "BIKE_DBZ", "BIKED", + "BIKEH", "BIKELEAP", "BIKES", "BIKEV", "BLOWJOBZ", + "BMX", "BOMBER", "BOX", "BSKTBALL", "BUDDY", + "BUS", "CAMERA", "CAR", "CAR_CHAT", "CARRY", + "CASINO", "CHAINSAW", "CHOPPA", "CLOTHES", "COACH", + "COLT45", "COP_AMBIENT", "COP_DVBYZ", "CRACK", "CRIB", + "DAM_JUMP", "DANCING", "DEALER", "DILDO", "DODGE", + "DOZER", "DRIVEBYS", "FAT", "FIGHT_B", "FIGHT_C", + "FIGHT_D", "FIGHT_E", "FINALE", "FINALE2", "FLAME", + "FLOWERS", "FOOD", "FREEWEIGHTS", "GANGS", "GFUNK", + "GHANDS", "GHETTO_DB", "GOGGLES", "GRAFFITI", "GRAVEYARD", + "GRENADE", "GYMNASIUM", "HAIRCUTS", "HEIST9", "INT_HOUSE", + "INT_OFFICE", "INT_SHOP", "JST_BUISNESS", "KART", "KISSING", + "KNIFE", "LAPDAN1", "LAPDAN2", "LAPDAN3", "LOWRIDER", + "MD_CHASE", "MD_END", "MEDIC", "MISC", "MTB", + "MUSCULAR", "NEVADA", "ON_LOOKERS", "OTB", "PARACHUTE", + "PARK", "PAULNMAC", "PED", "PLAYER_DVBYS", "PLAYIDLES", + "POLICE", "POOL", "POOR", "PYTHON", "QUAD", + "QUAD_DBZ", "RAPPING", "RIFLE", "RIOT", "ROB_BANK", + "ROCKET", "RUNNINGMAN", "RUSTLER", "RYDER", "SAMP", + "SCRATCHING", "SEX", "SHAMAL", "SHOP", "SHOTGUN", + "SILENCED", "SKATE", "SMOKING", "SNIPER", "SNM", + "SPRAYCAN", "STRIP", "SUNBATHE", "SWAT", "SWEET", + "SWIM", "SWORD", "TANK", "TATTOOS", "TEC", + "TRAIN", "TRUCK", "UZI", "VAN", "VENDING", + "VORTEX", "WAYFARER", "WEAPONS", "WOP", "WUZI" + }, +#endif + /* + * FIXES_gscDot[] + * + * ".". + */ + FIXES_gscDot[] = ".", + /* + * FIXES_gscSpec@[] + * + * Specifier "". + */ + FIXES_gscSpec@[] = "", + /* + * FIXES_gscSpec@i[] + * + * Specifier "i". + */ + FIXES_gscSpec@i[] = "i", + /* + * FIXES_gscSpec@ii[] + * + * Specifier "ii". + */ + FIXES_gscSpec@ii[] = "ii", + /* + * FIXES_gscSpec@ai[] + * + * Specifier "ai". + */ + FIXES_gscSpec@ai[] = "ai", + /* + * FIXES_gscSpec@is[] + * + * Specifier "is". + */ + FIXES_gscSpec@is[] = "is", + /* + * FIXES_gscSpec@iii[] + * + * Specifier "iii". + */ + FIXES_gscSpec@iii[] = "iii", + /* + * FIXES_gscSpec@isii[] + * + * Specifier "isii". + */ + FIXES_gscSpec@isii[] = "isii", + /* + * FIXES_gscSpec@ifff[] + * + * Specifier "ifff". + */ + FIXES_gscSpec@ifff[] = "ifff", + /* + * FIXES_gscSpec@iifff[] + * + * Specifier "iifff". + */ + FIXES_gscSpec@iifff[] = "iifff", + /* + * FIXES_gscSpec@iifffffff[] + * + * Specifier "iifffffff". + */ + FIXES_gscSpec@iifffffff[] = "iifffffff", + /* + * FIXES_gscSpec@iffff[] + * + * Specifier "iffff". + */ + FIXES_gscSpec@iffff[] = "iffff", + /* + * FIXES_gscSpec@iiiis[] + * + * Specifier "iiiis". + */ + FIXES_gscSpec@iiiis[] = "iiiis", + /* + * FIXES_gscSpec@iiiii[] + * + * Specifier "iiiii". + */ + FIXES_gscSpec@iiiii[] = "iiiii", + /* + * FIXES_gscSpec@iiiiii[] + * + * Specifier "iiiiii". + */ + FIXES_gscSpec@iiiiii[] = "iiiiii", + /* + * FIXES_gscTempName[] + * + * The temporary name to give when renaming people. + */ + FIXES_gscTempName[] = "FIXES_TEMP_NAME", + /* + * FIXES_gscOrderProperty[] + * + * The property to check for script ordering. + */ + FIXES_gscOrderProperty[] = "FIXES_gscOrderProperty", + /* + * FIXES_gscNoGMProperty[] + * + * Call "_FIXES_DetermineOrder" in the GM or not? + */ + FIXES_gscNoGMProperty[] = "FIXES_gscNoGMProperty", + /* + * FIXES_gscDetermineOrder[] + * + * Name of the ordering callback. + */ + FIXES_gscDetermineOrder[] = "_FIXES_DetermineOrder", + /* + * FIXES_gscSetPlayerMenu[] + * + * Name of the remote set player menu function. + */ + FIXES_gscSetPlayerMenu[] = "_FIXES_SetPlayerMenu", + /* + * FIXES_gscClearPlayerMenu[] + * + * Name of the remote function to clear a player's menu set. + */ + FIXES_gscClearPlayerMenu[] = "_FIXES_ClearPlayerMenu", + /* + * FIXES_gscAllowTeleport[] + * + * Name of the remote allow teleport function. + */ + FIXES_gscAllowTeleport[] = "_FIXES_AllowTeleport", + /* + * FIXES_gscPutPlayerInVehicle[] + * + * Name of the remote vehicle entry function. + */ + FIXES_gscPutPlayerInVehicle[] = "_FIXES_PutPlayerInVehicle", + /* + * FIXES_gscAllowInteriorWeapons[] + * + * Name of the remote interior weapons function. + */ + FIXES_gscAllowInteriorWeapons[] = "_FIXES_AllowInteriorWeapons", + /* + * FIXES_gscSetPlayerAttachedObj[] + * + * Name of the remote attache object function. + */ + FIXES_gscSetPlayerAttachedObj[] = "_FIXES_SetPlayerAttachedObject", + /* + * FIXES_gscTogglePlayerControl[] + * + * Name of the remote player toggle function. + */ + FIXES_gscTogglePlayerControl[] = "_FIXES_TogglePlayerControllable", + /* + * FIXES_gscSetPlayerWorldBounds[] + * + * Name of the remote world bounds function. + */ + FIXES_gscSetPlayerWorldBounds[] = "_FIXES_SetPlayerWorldBounds", + /* + * FIXES_gscGameTextShow[] + * + * Name of the remote GameText show function. + */ + FIXES_gscGameTextShow[] = "_FIXES_GameTextShow", + /* + * FIXES_gscReturnProperty[] + * + * The property for accurate returns. + */ + FIXES_gscReturnProperty[] = "FIXES_gscReturnProperty", + /* + * FIXES_gscSingleProperty[] + * + * The property for checking this is the only running script with fixes in. + */ + FIXES_gscSingleProperty[] = "FIXES_gscSingleProperty", + /* + * FIXES_gscMenuProperty[] + * + * The property for a player's current menu. + */ + FIXES_gscMenuProperty[] = "FIXES_gscMenuProperty", + /* + * FIXES_gscFixesError[] + * + * Error shown when multiple scripts are detected. + */ + FIXES_gscFixesError[] = "\7\7\7\7\7" "\n" \ + "*** fixes.inc error: Running multiple scripts compiled with \"fixes.inc\"..." "\n" \ + "*** Please compile your modes with \"#define FIXES_Single 0\" at the top, as" "\n" \ + "*** this setting is no longer the default (to improve the more common case)." ; + +/* + * _FIXES_KEY_AIM + * KEY_AIM + * + * Because the default SA:MP includes missed this one. + */ + +#define _FIXES_KEY_AIM (128) +#if FIX_KEY_AIM + #define KEY_AIM _FIXES_KEY_AIM +#endif + +/* + * _FIXES_SPECIAL_ACTION_PISSING + * SPECIAL_ACTION_PISSING + * + * Because the default SA:MP includes missed this one. + */ + +#define _FIXES_SPECIAL_ACTION_PISSING (68) +#if FIX_SPECIAL_ACTION_PISSING + #define SPECIAL_ACTION_PISSING _FIXES_SPECIAL_ACTION_PISSING +#endif + +/* + * IsValidVehicle + * + * Because the default SA:MP includes missed this one. + */ + +#if FIX_IsValidVehicle + native IsValidVehicle(vehicleid); +#endif + +/* + * GetGravity + * + * Because the default SA:MP includes missed this one. + */ + +#if FIX_GetGravity + native Float:GetGravity(); +#endif + +/* + * gpci + * + * Because the default SA:MP includes missed this one. + */ + +#if FIX_gpci + native gpci(playerid, serial[], maxlen); +#endif + +/* + * BODYPARTS + * + * Because the default SA:MP includes missed these. + */ + +#if FIX_BODYPARTS + #define BODY_PART_TORSO (3) + #define BODY_PART_GROIN (4) + #define BODY_PART_LEFT_ARM (5) + #define BODY_PART_RIGHT_ARM (6) + #define BODY_PART_LEFT_LEG (7) + #define BODY_PART_RIGHT_LEG (8) + #define BODY_PART_HEAD (9) +#endif + +/* + * CAMERAMODES + * + * Because the default SA:MP includes missed these. + */ + +#if FIX_CAMERAMODES + #define CAM_MODE_DISCONNECTED (-1) + #define CAM_MODE_NONE (0) + #define CAM_MODE_BEHINDCAR (3) + #define CAM_MODE_FOLLOWPED (4) + #define CAM_MODE_SNIPER (7) + #define CAM_MODE_ROCKETLAUNCHER (8) + #define CAM_MODE_FIXED (15) + #define CAM_MODE_1STPERSON (16) + #define CAM_MODE_CAM_ON_A_STRING (18) + #define CAM_MODE_BEHINDBOAT (22) + #define CAM_MODE_CAMERA (46) + #define CAM_MODE_ROCKETLAUNCHER_HS (51) + #define CAM_MODE_AIMWEAPON (53) + #define CAM_MODE_AIMWEAPON_FROMCAR (55) + #define CAM_MODE_DW_HELI_CHASE (56) +#endif + +/* + * IS_FILTERSCRIPT + * + * "FILTERSCRIPT" can't always be relied on to be set. This is not a pre- + * processor macro, but may be better than nothing (also used internally). + */ + +#if FIX_FILTERSCRIPT + #define IS_FILTERSCRIPT _FIXES_gIsFilterscript +#endif + +/* + * File operators + * + * Forwards for operators that shouldn't exist, so they won't exist. + */ + +#if FIX_FileMaths + forward File:operator++(File:a); + forward File:operator--(File:a); + forward File:operator-(File:a); + forward File:operator+(File:a, File:b); + forward File:operator+(File:a, _:b); + forward File:operator-(File:a, File:b); + forward File:operator-(_:a, File:b); + forward File:operator-(File:a, _:b); + forward File:operator*(File:a, File:b); + forward File:operator*(File:a, _:b); + forward File:operator/(File:a, File:b); + forward File:operator/(_:a, File:b); + forward File:operator/(File:a, _:b); + forward File:operator%(File:a, File:b); + forward File:operator%(_:a, File:b); + forward File:operator%(File:a, _:b); + forward bool:operator<(File:a, File:b); + forward bool:operator<(_:a, File:b); + forward bool:operator<(File:a, _:b); + forward bool:operator<=(File:a, File:b); + forward bool:operator<=(_:a, File:b); + forward bool:operator<=(File:a, _:b); + forward bool:operator>(File:a, File:b); + forward bool:operator>(_:a, File:b); + forward bool:operator>(File:a, _:b); + forward bool:operator>=(File:a, File:b); + forward bool:operator>=(_:a, File:b); + forward bool:operator>=(File:a, _:b); +#endif + +/* + * FIXES_DetermineOrder() + * + * Figure out which script is called first by callbacks. + */ + +#if !FIXES_Single + forward _FIXES_DetermineOrder(); + + static FIXES_DetermineOrder() + { + deleteproperty(5, FIXES_gscOrderProperty), + // Called in the Game Mode first (thus needs correcting). + setproperty(5, FIXES_gscNoGMProperty, 1), + CallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@), + deleteproperty(5, FIXES_gscNoGMProperty), + CallRemoteFunction(FIXES_gscDetermineOrder, FIXES_gscSpec@); + } +#endif + +/* + * FIXES_IsPlayerConnected(playerid) + * + * FIXES: + * IsPlayerConnected + */ + +#if defined _ALS_IsPlayerConnected + #error _ALS_IsPlayerConnected defined +#endif +native BAD_IsPlayerConnected(playerid) = IsPlayerConnected; + +#if FIX_IsPlayerConnected + stock FIXES_IsPlayerConnected(playerid) + { + return _FIXES_IS_PLAYER_CONNECTED(playerid); + } + + #define _ALS_IsPlayerConnected + #define IsPlayerConnected FIXES_IsPlayerConnected +#endif + +/* + * _FIXES_CreateGameTextDraws(playerid, test) + * + * Create the text draws used to replicate game texts. + * + * FIXES: + * GameText + */ + +#if FIX_GameText + static _FIXES_CreateGameTextDraws(const playerid) + { + if (playerid == INVALID_PLAYER_ID) + { + new + Text:t; + + #if FIX_GameTextStyles + + // Global style 7 (vehicle name). + t = FIXES_gsGTStyle[7] = TextDrawCreate(608.000000, 344.000000, FIXES_gscSpace), + TextDrawLetterSize(t, 1.000000, 3.000000), + TextDrawAlignment(t, 3), + TextDrawColor(t, 0x36682CFF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 2), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 2), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 10.0, 200.0); + + // Global style 8 (location name). + t = FIXES_gsGTStyle[8] = TextDrawCreate(608.000000, 386.500000, FIXES_gscSpace), + TextDrawLetterSize(t, 1.200000, 3.799998), + TextDrawAlignment(t, 3), + TextDrawColor(t, 0xACCBF1FF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 2), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 0), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 10.0, 200.0); + + // Global style 9 (radio name). + t = FIXES_gsGTStyle[9] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace), + TextDrawLetterSize(t, 0.600000, 1.899999), + TextDrawAlignment(t, 2), + TextDrawColor(t, 0x906210FF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 1), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 2), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 200.0, 620.0); + + // Global style 10 (radio switch). + t = FIXES_gsGTStyle[10] = TextDrawCreate(320.000000, 22.000000, FIXES_gscSpace), + TextDrawLetterSize(t, 0.600000, 1.899999), + TextDrawAlignment(t, 2), + TextDrawColor(t, 0x969696FF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 1), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 2), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 200.0, 620.0); + + // Global style 11 (positive money). + t = FIXES_gsGTStyle[11] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace), + TextDrawLetterSize(t, 0.550000, 2.150000), + TextDrawAlignment(t, 3), + TextDrawColor(t, 0x36682CFF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 2), + TextDrawBackgroundColor(t, 0x000000FF), + TextDrawFont(t, 3), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 10.0, 200.0); + + // Global style 12 (negative money). + t = FIXES_gsGTStyle[12] = TextDrawCreate(607.000000, 78.000000, FIXES_gscSpace), + TextDrawLetterSize(t, 0.550000, 2.150000), + TextDrawAlignment(t, 3), + TextDrawColor(t, 0xB4191DFF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 2), + TextDrawBackgroundColor(t, 0x000000FF), + TextDrawFont(t, 3), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 10.0, 200.0); + + // Global style 13 (stunt). + t = FIXES_gsGTStyle[13] = TextDrawCreate(380.000000, 341.000000, FIXES_gscSpace), + TextDrawLetterSize(t, 0.579999, 2.400000), + TextDrawTextSize(t, 40.000000, 460.000000), + TextDrawAlignment(t, 2), + TextDrawColor(t, 0xD7D3CCFF), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0), + TextDrawSetShadow(t, 2), + TextDrawSetOutline(t, 0), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 1), + TextDrawSetProportional(t, 1), + + #endif + + // Global style 0. + t = FIXES_gsGTStyle[0] = TextDrawCreate(320.0, 214.0, FIXES_gscSpace), + TextDrawLetterSize(t, 1.3, 3.6), + TextDrawAlignment(t, 2), + TextDrawColor(t, 0x906210FF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 2), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 3), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 200.0, 620.0); + + // Global style 1. + t = FIXES_gsGTStyle[1] = TextDrawCreate(620.0, 310.0, FIXES_gscSpace), + TextDrawLetterSize(t, 1.0, 2.6), + TextDrawAlignment(t, 3), + TextDrawColor(t, 0x906210FF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 2), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 3), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 10.0, 200.0); + + // Global style 2. + t = FIXES_gsGTStyle[2] = TextDrawCreate(320.0, 156.0, FIXES_gscSpace), + TextDrawLetterSize(t, 2.1, 4.2), + TextDrawAlignment(t, 2), + TextDrawColor(t, 0xE1E1E1FF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 3), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 0), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 200.0, 620.0); + + // Global style 3. + t = FIXES_gsGTStyle[3] = TextDrawCreate(320.000000, 154.500000, FIXES_gscSpace), + TextDrawLetterSize(t, 0.600000, 2.750000), + TextDrawAlignment(t, 2), + TextDrawColor(t, 0x906210FF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 2), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 2), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 200.0, 620.0); + + // Global style 4. + t = FIXES_gsGTStyle[4] = TextDrawCreate(320.000000, 115.500000, FIXES_gscSpace), + TextDrawLetterSize(t, 0.600000, 2.750000), + TextDrawAlignment(t, 2), + TextDrawColor(t, 0x906210FF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 2), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 2), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 200.0, 620.0); + + // Global style 5. + t = FIXES_gsGTStyle[5] = TextDrawCreate(320.0, 217.0, FIXES_gscSpace), + TextDrawLetterSize(t, 0.6, 2.75), + TextDrawAlignment(t, 2), + TextDrawColor(t, 0xE1E1E1FF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 2), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 2), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 200.0, 620.0); + + // Global style 6. + t = FIXES_gsGTStyle[6] = TextDrawCreate(320.000000, 60.000000, FIXES_gscSpace), + TextDrawLetterSize(t, 1.000000, 3.599998), + TextDrawAlignment(t, 2), + TextDrawColor(t, 0xACCBF1FF), + TextDrawSetShadow(t, 0), + TextDrawSetOutline(t, 2), + TextDrawBackgroundColor(t, 0x000000AA), + TextDrawFont(t, 3), + TextDrawSetProportional(t, 1), + TextDrawUseBox(t, true), + TextDrawBoxColor(t, 0x00000000), + TextDrawTextSize(t, 200.0, 620.0); + } + else + { + new + PlayerText:t; + + #if FIX_GameTextStyles + + // Global style 7 (playerid, vehicle name). + t = FIXES_gsPGTStyle[playerid][7] = CreatePlayerTextDraw(playerid, 608.000000, 344.000000, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 1.000000, 3.000000), + PlayerTextDrawAlignment(playerid, t, 3), + PlayerTextDrawColor(playerid, t, 0x36682CFF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 2), + PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA), + PlayerTextDrawFont(playerid, t, 2), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 10.0, 200.0); + + // Global style 8 (playerid, location name). + t = FIXES_gsPGTStyle[playerid][8] = CreatePlayerTextDraw(playerid, 608.000000, 386.500000, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 1.200000, 3.799998), + PlayerTextDrawAlignment(playerid, t, 3), + PlayerTextDrawColor(playerid, t, 0xACCBF1FF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 2), + PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA), + PlayerTextDrawFont(playerid, t, 0), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 10.0, 200.0); + + // Global style 9 (playerid, radio name). + t = FIXES_gsPGTStyle[playerid][9] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999), + PlayerTextDrawAlignment(playerid, t, 2), + PlayerTextDrawColor(playerid, t, 0x906210FF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 1), + PlayerTextDrawBackgroundColor(playerid, t, 170), + PlayerTextDrawFont(playerid, t, 2), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 200.0, 620.0); + + // Global style 10 (playerid, radio switch). + t = FIXES_gsPGTStyle[playerid][10] = CreatePlayerTextDraw(playerid, 320.000000, 22.000000, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 0.600000, 1.899999), + PlayerTextDrawAlignment(playerid, t, 2), + PlayerTextDrawColor(playerid, t, 0x969696FF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 1), + PlayerTextDrawBackgroundColor(playerid, t, 170), + PlayerTextDrawFont(playerid, t, 2), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 200.0, 620.0); + + // Global style 11 (playerid, positive money). + t = FIXES_gsPGTStyle[playerid][11] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000), + PlayerTextDrawAlignment(playerid, t, 3), + PlayerTextDrawColor(playerid, t, 0x36682CFF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 2), + PlayerTextDrawBackgroundColor(playerid, t, 0x000000FF), + PlayerTextDrawFont(playerid, t, 3), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 10.0, 200.0); + + // Global style 12 (playerid, negative money). + t = FIXES_gsPGTStyle[playerid][12] = CreatePlayerTextDraw(playerid, 607.000000, 78.000000, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 0.550000, 2.150000), + PlayerTextDrawAlignment(playerid, t, 3), + PlayerTextDrawColor(playerid, t, 0xB4191DFF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 2), + PlayerTextDrawBackgroundColor(playerid, t, 0x000000FF), + PlayerTextDrawFont(playerid, t, 3), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 10.0, 200.0); + + // Global style 13 (playerid, stunt). + t = FIXES_gsPGTStyle[playerid][13] = CreatePlayerTextDraw(playerid, 380.000000, 341.000000, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 0.579999, 2.400000), + PlayerTextDrawTextSize(playerid, t, 40.000000, 460.000000), + PlayerTextDrawAlignment(playerid, t, 2), + PlayerTextDrawColor(playerid, t, 0xD7D3CCFF), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0), + PlayerTextDrawSetShadow(playerid, t, 2), + PlayerTextDrawSetOutline(playerid, t, 0), + PlayerTextDrawBackgroundColor(playerid, t, 170), + PlayerTextDrawFont(playerid, t, 1), + PlayerTextDrawSetProportional(playerid, t, 1); + + #endif + + // Global style 0. + t = FIXES_gsPGTStyle[playerid][0] = CreatePlayerTextDraw(playerid, 320.0, 214.0, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 1.3, 3.6), + PlayerTextDrawAlignment(playerid, t, 2), + PlayerTextDrawColor(playerid, t, 0x906210FF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 2), + PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA), + PlayerTextDrawFont(playerid, t, 3), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 200.0, 620.0); + + // Global style 1. + t = FIXES_gsPGTStyle[playerid][1] = CreatePlayerTextDraw(playerid, 620.0, 310.0, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 1.0, 2.6), + PlayerTextDrawAlignment(playerid, t, 3), + PlayerTextDrawColor(playerid, t, 0x906210FF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 2), + PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA), + PlayerTextDrawFont(playerid, t, 3), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 10.0, 200.0); + + // Global style 2. + t = FIXES_gsPGTStyle[playerid][2] = CreatePlayerTextDraw(playerid, 320.0, 156.0, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 2.1, 4.2), + PlayerTextDrawAlignment(playerid, t, 2), + PlayerTextDrawColor(playerid, t, 0xE1E1E1FF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 3), + PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA), + PlayerTextDrawFont(playerid, t, 0), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 200.0, 620.0); + + // Global style 3. + t = FIXES_gsPGTStyle[playerid][3] = CreatePlayerTextDraw(playerid, 320.000000, 154.500000, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000), + PlayerTextDrawAlignment(playerid, t, 2), + PlayerTextDrawColor(playerid, t, 0x906210FF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 2), + PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA), + PlayerTextDrawFont(playerid, t, 2), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 200.0, 620.0); + + // Global style 4. + t = FIXES_gsPGTStyle[playerid][4] = CreatePlayerTextDraw(playerid, 320.000000, 115.500000, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 0.600000, 2.750000), + PlayerTextDrawAlignment(playerid, t, 2), + PlayerTextDrawColor(playerid, t, 0x906210FF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 2), + PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA), + PlayerTextDrawFont(playerid, t, 2), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 200.0, 620.0); + + // Global style 5. + t = FIXES_gsPGTStyle[playerid][5] = CreatePlayerTextDraw(playerid, 320.0, 217.0, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 0.6, 2.75), + PlayerTextDrawAlignment(playerid, t, 2), + PlayerTextDrawColor(playerid, t, 0xE1E1E1FF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 2), + PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA), + PlayerTextDrawFont(playerid, t, 2), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 200.0, 620.0); + + // Global style 6. + t = FIXES_gsPGTStyle[playerid][6] = CreatePlayerTextDraw(playerid, 320.000000, 60.000000, FIXES_gscSpace), + PlayerTextDrawLetterSize(playerid, t, 1.000000, 3.599998), + PlayerTextDrawAlignment(playerid, t, 2), + PlayerTextDrawColor(playerid, t, 0xACCBF1FF), + PlayerTextDrawSetShadow(playerid, t, 0), + PlayerTextDrawSetOutline(playerid, t, 2), + PlayerTextDrawBackgroundColor(playerid, t, 0x000000AA), + PlayerTextDrawFont(playerid, t, 3), + PlayerTextDrawSetProportional(playerid, t, 1), + PlayerTextDrawUseBox(playerid, t, true), + PlayerTextDrawBoxColor(playerid, t, 0x00000000), + PlayerTextDrawTextSize(playerid, t, 200.0, 620.0); + } + } +#endif + +/* + * OnFilterScriptInit() + * + * Set "IS_FILTERSCRIPT" to true as this callback is ONLY called if this script + * is actually a FilterScript. Then call "FIXES_OnScriptInit". + * + * FIXES: + * IS_FILTERSCRIPT + * OnPlayerConnect + * GameText + */ + +public OnFilterScriptInit() +{ + // It is possible for this to be the only thing done in this function! + _FIXES_gIsFilterscript = true; + + state _ALS : _ALS_go; + + #if FIXES_Single + // Check this really IS the only script running. + if (existproperty(5, FIXES_gscSingleProperty)) + { + print(FIXES_gscFixesError); + } + else + { + FIXES_gsSettings &= ~e_FIXES_SETTINGS_SECOND_USE, + setproperty(5, FIXES_gscSingleProperty, 1); + } + #endif + + // ================= + // BEGIN: GameText + // ================= + #if FIX_GameText + for (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i) + { + FIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS; + } + #endif + #if FIXES_Single + #if FIX_GameText + _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID); + #endif + // ================= + // END: GameText + // ================= + #else + FIXES_DetermineOrder(), + FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA; + #endif + + #if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect + FIXES_gsSettings |= e_FIXES_SETTINGS_NO_GAME_TEXT; + #endif + // These are all the fixes that use "_FIXES_FOREACH". + #if FIX_OnPlayerConnect || _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable + for (new playerid = 0; playerid != MAX_PLAYERS; ++playerid) + { + if (BAD_IsPlayerConnected(playerid)) + { + // No "defined" checks - if you don't want this fix because + // you don't have an "OnPlayerConnect", just don't use it! + // Of course, it helps that the copy of "OnPlayerConnect" + // in this include is almost always called! + #if FIX_OnPlayerConnect + // ======================== + // BEGIN: OnPlayerConnect + // ======================== + OnPlayerConnect(playerid); + // ======================== + // END: OnPlayerConnect + // ======================== + #else + _FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS); + + #if FIX_GameText + // ================= + // BEGIN: GameText + // ================= + _FIXES_IS_IN_CHARGE() + { + _FIXES_CreateGameTextDraws(playerid); + } + // ================= + // END: GameText + // ================= + #endif + #endif + } + } + #endif + #if !FIXES_Single && FIX_GameText && FIX_OnPlayerConnect + FIXES_gsSettings &= ~e_FIXES_SETTINGS_NO_GAME_TEXT; + #endif + + return FIXES_OnFilterScriptInit(); +} + +#if defined _ALS_OnFilterScriptInit + #error _ALS_OnFilterScriptInit defined +#endif +#define _ALS_OnFilterScriptInit +#define OnFilterScriptInit(%0) FIXES_OnFilterScriptInit(%0) <_ALS : _ALS_go> + +_FIXES_FORWARD FIXES_OnFilterScriptInit(); + +/* + * OnGameModeInit() + * + * Call "FIXES_OnScriptInit" if this is not a FilterScript. + * + * FIXES: + * IS_FILTERSCRIPT + * AllowInteriorWeapons + * AllowTeleport + */ + +public OnGameModeInit() +{ + state _ALS : _ALS_go; + + #if FIXES_Single + // Check this really IS the only script running. Properties reset when + // a gamemode restarts, so we don't have to worry about filterscipts + // detecting themselves. + if (FIXES_gsSettings & e_FIXES_SETTINGS_SECOND_USE) + { + if (existproperty(5, FIXES_gscSingleProperty)) + { + print(FIXES_gscFixesError); + } + else + { + setproperty(5, FIXES_gscSingleProperty, 1); + } + } + else + { + // When the server starts, we need to allow an FS to load with a GM + // that doesn't use fixes.inc. This is the only case where a + // property can be set while a ganemode isn't running. This will + // mean that the FS won't complain if they are both using fixes, but + // the GM still will, so all is good. + FIXES_gsSettings |= e_FIXES_SETTINGS_SECOND_USE; + } + #endif + + // ============================= + // BEGIN: AllowInteriorWeapons + // ============================= + // ====================== + // BEGIN: AllowTeleport + // ====================== + #if FIX_AllowInteriorWeapons && FIX_AllowTeleport && !defined FILTERSCRIPT + FIXES_gsSettings &= ~(e_FIXES_SETTINGS_INTERIOR | e_FIXES_SETTINGS_ADMIN_TELEPORT); + #elseif FIX_AllowInteriorWeapons + FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR; + #elseif FIX_AllowTeleport && !defined FILTERSCRIPT + FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT; + #endif + // ====================== + // END: AllowTeleport + // ====================== + // =========================== + // END: AllowInteriorWeapons + // =========================== + + #if FIX_GameText || !FIXES_Single + if (!_FIXES_gIsFilterscript) + { + // ================= + // BEGIN: GameText + // ================= + #if FIX_GameText + for (new i = 0; i != sizeof (FIXES_gsPlayerPGTShown); ++i) + { + FIXES_gsPlayerPGTShown[i][MAX_PLAYERS] = MAX_PLAYERS; + } + #if FIXES_Single + _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID); + #endif + #endif + // ================= + // END: GameText + // ================= + #if !FIXES_Single + FIXES_DetermineOrder(); + #endif + } + #endif + #if !FIXES_Single + FIXES_gsSettings &= ~e_FIXES_SETTINGS_DROP_ALL_DATA; + #endif + + return FIXES_OnGameModeInit(); +} + +#if defined _ALS_OnGameModeInit + #error _ALS_OnGameModeInit defined +#endif +#define _ALS_OnGameModeInit +#define OnGameModeInit(%0) FIXES_OnGameModeInit(%0) <_ALS : _ALS_go> + +_FIXES_FORWARD FIXES_OnGameModeInit(); + +/* + * OnGameModeExit() + * + * Fast way of detecting not to retain any data. + */ + +#if !FIXES_Single || FIX_PlayerDialogResponse + public OnGameModeExit() + { + #if !FIXES_Single + FIXES_gsSettings |= e_FIXES_SETTINGS_DROP_ALL_DATA; + if (!_FIXES_gIsFilterscript && FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE) + { + FIXES_gsSettings |= e_FIXES_SETTINGS_ENDING, + FIXES_DetermineOrder(); + } + #endif + + // ============================= + // BEGIN: PlayerDialogResponse + // ============================= + #if FIX_PlayerDialogResponse + for (new playerid = 0; playerid != MAX_PLAYERS; ++playerid) + { + ShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace); + } + #endif + // ============================= + // END: PlayerDialogResponse + // ============================= + + return FIXES_OnGameModeExit(); + } + + #if defined _ALS_OnGameModeExit + #error _ALS_OnGameModeExit defined + #endif + #define _ALS_OnGameModeExit + #define OnGameModeExit(%0) FIXES_OnGameModeExit(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnGameModeExit(); +#endif + +/* + * OnFilterScriptExit() + * + * Fast way of detecting not to retain any data. + */ + +#if !FIXES_Single || FIX_GameText || FIX_OnPlayerDisconnect + public OnFilterScriptExit() + { + #if FIX_OnPlayerDisconnect + // Removal safe loop. + for (new next, playerid = FIXES_gsPlayersIterator[MAX_PLAYERS]; playerid != MAX_PLAYERS; playerid = next) + { + next = FIXES_gsPlayersIterator[playerid], + OnPlayerDisconnect(playerid, 4); + #if FIXES_Single + // ================= + // BEGIN: GameText + // ================= + #if FIX_GameText + #if FIX_GameTextStyles + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]), + #endif + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]); + #endif + #endif + } + #endif + #if FIXES_Single + // ================= + // BEGIN: GameText + // ================= + #if FIX_GameText + #if defined FIXES_OnFilterScriptExit + FIXES_OnFilterScriptExit(); + #endif + #if !FIX_OnPlayerDisconnect + _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid) + { + #if FIX_GameTextStyles + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]), + #endif + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]); + } + #endif + return + #if FIX_GameTextStyles + TextDrawDestroy(FIXES_gsGTStyle[13]), + TextDrawDestroy(FIXES_gsGTStyle[12]), + TextDrawDestroy(FIXES_gsGTStyle[11]), + TextDrawDestroy(FIXES_gsGTStyle[10]), + TextDrawDestroy(FIXES_gsGTStyle[9]), + TextDrawDestroy(FIXES_gsGTStyle[8]), + TextDrawDestroy(FIXES_gsGTStyle[7]), + #endif + TextDrawDestroy(FIXES_gsGTStyle[6]), + TextDrawDestroy(FIXES_gsGTStyle[5]), + TextDrawDestroy(FIXES_gsGTStyle[4]), + TextDrawDestroy(FIXES_gsGTStyle[3]), + TextDrawDestroy(FIXES_gsGTStyle[2]), + TextDrawDestroy(FIXES_gsGTStyle[1]), + TextDrawDestroy(FIXES_gsGTStyle[0]); + #else + return FIXES_OnFilterScriptExit(); + #endif + // ================= + // END: GameText + // ================= + #else + if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE) + { + FIXES_gsSettings |= e_FIXES_SETTINGS_ENDING, + FIXES_DetermineOrder(); + } + return FIXES_OnFilterScriptExit(); + #endif + } + + #if defined _ALS_OnFilterScriptExit + #error _ALS_OnFilterScriptExit defined + #endif + #define _ALS_OnFilterScriptExit + #define OnFilterScriptExit(%0) FIXES_OnFilterScriptExit(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnFilterScriptExit(); +#endif + +/* + * OnPlayerCommandText(playerid, cmdtext[]) + * + * FIXES: + * OnPlayerCommandText + */ + +#if FIX_OnPlayerCommandText + public OnPlayerCommandText(playerid, cmdtext[]) + { + // ============================ + // BEGIN: OnPlayerCommandText + // ============================ + #if FIX_OnPlayerCommandText + // If this "#if" is around the whole function, it doesn't always + // compile properly. + return FIXES_OnPlayerCommandText(playerid, (cmdtext[0] <= '\1') ? FIXES_gscNULL : cmdtext); + #endif + // ============================ + // END: OnPlayerCommandText + // ============================ + } + + #if defined _ALS_OnPlayerCommandText + #error _ALS_OnPlayerCommandText defined + #endif + #define _ALS_OnPlayerCommandText + #define OnPlayerCommandText(%0) FIXES_OnPlayerCommandText(%0) <_ALS : _ALS_go> + + forward FIXES_OnPlayerCommandText(playerid, cmdtext[]); + public FIXES_OnPlayerCommandText(playerid, cmdtext[]) <_ALS : _ALS_x0, _ALS : _ALS_x1> { return 0; } + public FIXES_OnPlayerCommandText(playerid, cmdtext[]) <> { return 0; } +#endif + +/* + * OnPlayerConnect(playerid) + * + * Almost every fix uses this callback for initialisation. It is only + * explicitly referenced for those fixes where this is all the code. The + * inclusion code was approaching the 512 line length limit, so I shrank it. + * + * FIXES: + * TogglePlayerControllable + * SetPlayerWorldBounds + * GetPlayerColor + * SetPlayerName + * GetPlayerSkin + * IsPlayerInCheckpoint + * IsPlayerInRaceCheckpoint + * GetPlayerWeapon + * PutPlayerInVehicle + * OnPlayerEnterVehicle + * AllowTeleport + * OnDialogResponse + * SetSpawnInfo + * AllowInteriorWeapons + * TrainExit + * Kick + * OnPlayerEnterVehicle_2 + * PlayerDialogResponse + * OnPlayerSpawn + * ApplyAnimation_2 + */ + +#if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_SetPlayerName || FIX_GetPlayerColour + #define _FIXES_ON_PLAYER_CONNECT +#elseif FIX_GetPlayerSkin || FIX_IsPlayerInCheckpoint || FIX_IsPlayerInRaceCheckpoint || FIX_GetPlayerWeapon + #define _FIXES_ON_PLAYER_CONNECT +#elseif FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_OnDialogResponse + #define _FIXES_ON_PLAYER_CONNECT +#elseif FIX_GetPlayerDialog || FIX_SetSpawnInfo || FIX_AllowInteriorWeapons || FIX_TrainExit + #define _FIXES_ON_PLAYER_CONNECT +#elseif FIX_Kick || FIX_OnPlayerEnterVehicle_2 || FIX_PlayerDialogResponse || FIX_GetPlayerInterior + #define _FIXES_ON_PLAYER_CONNECT +#elseif FIX_OnPlayerSpawn || FIX_ApplyAnimation_2 || FIX_GameText || _FIX_Menus + #define _FIXES_ON_PLAYER_CONNECT +#elseif FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_OnPlayerConnect || FIX_SetPlayerTime + #define _FIXES_ON_PLAYER_CONNECT +#elseif FIX_SetPlayerColour + #define _FIXES_ON_PLAYER_CONNECT +#endif + +#if defined _FIXES_ON_PLAYER_CONNECT + public OnPlayerConnect(playerid) + { + // ========================= + // BEGIN: ApplyAnimation_2 + // ========================= + #if FIX_ApplyAnimation_2 + FIXES_gsPlayerAnimLibs[playerid][0] = + FIXES_gsPlayerAnimLibs[playerid][1] = + FIXES_gsPlayerAnimLibs[playerid][2] = + FIXES_gsPlayerAnimLibs[playerid][3] = + FIXES_gsPlayerAnimLibs[playerid][4] = -1; + #endif + // ======================= + // END: ApplyAnimation_2 + // ======================= + + #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable + _FIXES_AddInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS); + #endif + + FIXES_PRINTF("FIXES_OnPlayerConnect: %d", playerid); + // This is only reset when the Game Mode changes or when a new + #if FIX_Kick || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_AllowTeleport || FIX_AllowInteriorWeapons || FIX_TrainExit || FIX_OnPlayerEnterVehicle_2 || FIX_SetPlayerColour + // player connects, which is what we want. The other items are the + // same, but must be done only once. This variable will tend to + // hold data relevant only in the master script (the first + // filterscript). + #if FIX_Kick || FIX_SetPlayerTime || FIX_SetPlayerColour + FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_ON_PLAYER_CONNECT; + #else + FIXES_gsPlayerBools[playerid] = e_FIXES_BOOLS_NONE; + #endif + #endif + + // ================= + // BEGIN: GameText + // ================= + #if FIX_GameText + #if !FIXES_Single + if (FIXES_gsSettings & (e_FIXES_SETTINGS_NO_GAME_TEXT | e_FIXES_SETTINGS_IN_CHARGE) == e_FIXES_SETTINGS_IN_CHARGE) + #endif + { + _FIXES_CreateGameTextDraws(playerid); + } + #endif + // ================= + // END: GameText + // ================= + + #if !FIXES_Single + if (!GetPVarInt(playerid, FIXES_pvarNotNewPlayer)) + #endif + { + FIXES_PRINTF("FIXES_OnPlayerConnect: First (%d)", FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE); + // ====================== + // BEGIN: SetPlayerName + // ====================== + #if FIX_SetPlayerName + new + name[MAX_PLAYER_NAME]; + GetPlayerName(playerid, name, MAX_PLAYER_NAME); + if (strcmp(name, FIXES_gscTempName) == 0) + { + Kick(playerid); + } + #endif + // ====================== + // END: SetPlayerName + // ====================== + + // ============================= + // BEGIN: SetPlayerWorldBounds + // ============================= + #if FIX_SetPlayerWorldBounds && !FIXES_Single + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = + 0.0; + #endif + // ============================= + // END: SetPlayerWorldBounds + // ============================= + + // ======================= + // BEGIN: GetPlayerColor + // ======================= + #if FIX_GetPlayerColour + SetPlayerColor(playerid, FIXES_gscPlayerColours[playerid % 100]); + #endif + // ======================= + // END: GetPlayerColor + // ======================= + + // ====================== + // BEGIN: GetPlayerSkin + // ====================== + #if FIX_GetPlayerSkin + #if FIXES_Single + FIXES_gsPlayerSkin[playerid] = 0; + #else + SetPVarInt(playerid, FIXES_pvarPlayerSkin, 0); + #endif + #endif + // ====================== + // END: GetPlayerSkin + // ====================== + + // ============================= + // BEGIN: IsPlayerInCheckpoint + // ============================= + #if FIX_IsPlayerInCheckpoint + DisablePlayerCheckpoint(playerid); + #endif + // ============================= + // END: IsPlayerInCheckpoint + // ============================= + + // ================================= + // BEGIN: IsPlayerInRaceCheckpoint + // ================================= + #if FIX_IsPlayerInRaceCheckpoint + DisablePlayerRaceCheckpoint(playerid); + #endif + // ================================= + // END: IsPlayerInRaceCheckpoint + // ================================= + + // ======================== + // BEGIN: GetPlayerWeapon + // ======================== + #if FIX_GetPlayerWeapon + #if FIXES_Single + FIXES_gsPlayerWeapon[playerid] = -1; + #else + SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1); + #endif + #endif + // ======================== + // END: GetPlayerWeapon + // ======================== + + // ========================== + // BEGIN: GetPlayerInterior + // ========================== + #if FIX_GetPlayerInterior + #if FIXES_Single + FIXES_gsInterior[playerid] = 0; + #else + SetPVarInt(playerid, FIXES_pvarPlayerInterior, 0); + #endif + #endif + // ========================== + // END: GetPlayerInterior + // ========================== + + // ========================= + // BEGIN: OnDialogResponse + // ========================= + #if FIX_OnDialogResponse || FIX_GetPlayerDialog + #if FIXES_Single + FIXES_gsDialogID[playerid] = INVALID_DIALOG_ID; + #else + SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID); + #endif + #endif + // ========================= + // END: OnDialogResponse + // ========================= + + // ============================= + // BEGIN: PlayerDialogResponse + // ============================= + #if FIX_PlayerDialogResponse + ShowPlayerDialog(playerid, -1, 0, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace, FIXES_gscSpace); + #endif + // ============================= + // END: PlayerDialogResponse + // ============================= + + // ===================== + // BEGIN: SetSpawnInfo + // ===================== + #if FIX_SetSpawnInfo + SetSpawnInfo(playerid, NO_TEAM, 0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 0, 0); + #endif + // ===================== + // END: SetSpawnInfo + // ===================== + + // ====================== + // BEGIN: OnPlayerSpawn + // ====================== + #if FIX_OnPlayerSpawn + #if FIXES_Single + FIXES_gsLastCash[playerid] = 0; + #else + SetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0); + #endif + #endif + // ====================== + // END: OnPlayerSpawn + // ====================== + + #if !FIXES_Single + // No longer their first time. + SetPVarInt(playerid, FIXES_pvarNotNewPlayer, 1); + #endif + } + // ============= + // BEGIN: Kick + // ============= + #if FIX_Kick || FIX_SetPlayerTime || FIX_SetPlayerColour + new + ret = FIXES_OnPlayerConnect(playerid); + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_ON_PLAYER_CONNECT; + return ret; + #else + return FIXES_OnPlayerConnect(playerid); + #endif + // ============= + // END: Kick + // ============= + } + + #if defined _ALS_OnPlayerConnect + #error _ALS_OnPlayerConnect defined + #endif + #define _ALS_OnPlayerConnect + #define OnPlayerConnect(%0) FIXES_OnPlayerConnect(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerConnect(playerid); +#endif + +/* + * OnPlayerDisconnect(playerid, reason) + * + * FIXES: + * SetPlayerAttachedObject + * IsPlayerAttachedObjectSlotUsed + * Kick + * GetPlayerMenu + */ + +#if FIX_SetPlayerAttachedObject || FIX_IsPlayerAttachedObjSlotUsed || FIX_Kick || (FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2)) || FIX_GetPlayerMenu || _FIX_Menus || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_ApplyAnimation_2 + public OnPlayerDisconnect(playerid, reason) + { + new + ret = FIXES_OnPlayerDisconnect(playerid, reason); + + // ========================= + // BEGIN: ApplyAnimation_2 + // ========================= + #if FIX_ApplyAnimation_2 + if (FIXES_gsAnimTimer[playerid]) + { + KillTimer(FIXES_gsAnimTimer[playerid]), + FIXES_gsAnimTimer[playerid] = 0; + } + #endif + // ======================= + // END: ApplyAnimation_2 + // ======================= + + // ====================== + // BEGIN: GetPlayerMenu + // ====================== + #if FIX_GetPlayerMenu + FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU; + #endif + // ====================== + // END: GetPlayerMenu + // ====================== + + // ========================== + // BEGIN: FIXES_SilentKick + // ========================== + #if FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2) + new + shift = FIXES_gsPlayerIP[playerid]; + if (shift != -1) + { + // Unban the IP (timed out). + new + ip[16]; + format(ip, sizeof (ip), "unbanip %d.%d.%d.%d", shift >>> 24, (shift >>> 16) & 0xFF, (shift >>> 8) & 0xFF, shift & 0xFF), + FIXES_gsPlayerIP[playerid] = -1; + } + #endif + // ========================== + // END: FIXES_SilentKick + // ========================== + + // ================================ + // BEGIN: SetPlayerAttachedObject + // ================================ + #if FIX_SetPlayerAttachedObject + #if !(FIXES_SilentKick && (FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2)) + new + #endif + shift = playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS; + #pragma tabsize 4 + new + slot = playerid / _FIXES_ATTACHMENTS; + #if !FIXES_Single + if (!_FIXES_gIsFilterscript) + #endif + { + for (new i = 0; i != MAX_PLAYER_ATTACHED_OBJECTS; ++i) + { + if (FIXES_gsObjectSlots[slot] & 1 << shift + i) + { + RemovePlayerAttachedObject(playerid, i); + } + } + } + #pragma tabsize 4 + FIXES_gsObjectSlots[slot] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << shift); + #endif + // ================================ + // END: SetPlayerAttachedObject + // ================================ + + // ======================================= + // BEGIN: IsPlayerAttachedObjectSlotUsed + // ======================================= + #if FIX_IsPlayerAttachedObjSlotUsed && !FIX_SetPlayerAttachedObject + FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~((1 << MAX_PLAYER_ATTACHED_OBJECTS) - 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS); + #endif + // ======================================= + // END: IsPlayerAttachedObjectSlotUsed + // ======================================= + + // ============= + // BEGIN: Kick + // ============= + #if FIX_Kick + if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_KICKED) + { + // Stop the timer if it is still running. + KillTimer(GetPVarInt(playerid, FIXES_pvarKick)); + } + #endif + // ============= + // END: Kick + // ============= + + #if _FIX_Menus || FIX_GetPlayerMenu || FIX_OnPlayerDisconnect || FIX_GameText || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable + _FIXES_RemoveInternal(FIXES_gsPlayersIterator, playerid, MAX_PLAYERS); + #endif + + return ret; + } + + #if defined _ALS_OnPlayerDisconnect + #error _ALS_OnPlayerDisconnect defined + #endif + #define _ALS_OnPlayerDisconnect + #define OnPlayerDisconnect(%0) FIXES_OnPlayerDisconnect(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerDisconnect(playerid, reason); +#endif + +/* + * OnPlayerDeath(playerid, killerid, reason) + * + * FIXES: + * OnPlayerDeath + * OnPlayerSpawn + */ + +#if FIX_OnPlayerDeath || FIX_OnPlayerSpawn + public OnPlayerDeath(playerid, killerid, reason) + { + _FIXES_IS_IN_CHARGE() + { + // ====================== + // BEGIN: OnPlayerDeath + // ====================== + #if FIX_OnPlayerDeath + static + sAnimlib[32], + sAnimname[32]; + GetAnimationName(FIXES_gsLastAnimation[playerid], sAnimlib, sizeof (sAnimlib), sAnimname, sizeof (sAnimname)); + if (strcmp(sAnimlib, "PED", true)) + { + ClearAnimations(playerid); + } + #endif + // ====================== + // END: OnPlayerDeath + // ====================== + } + + // ====================== + // BEGIN: OnPlayerSpawn + // ====================== + #if FIX_OnPlayerSpawn + new + ret = FIXES_OnPlayerDeath(playerid, killerid, reason); + + #if FIXES_Single + FIXES_gsLastCash[playerid] = GetPlayerMoney(playerid); + #else + SetPVarInt(playerid, FIXES_pvarPlayerLastCash, GetPlayerMoney(playerid)); + #endif + + return ret; + #else + return FIXES_OnPlayerDeath(playerid, killerid, reason); + #endif + // ====================== + // END: OnPlayerSpawn + // ====================== + } + + #if defined _ALS_OnPlayerDeath + #error _ALS_OnPlayerDeath defined + #endif + #define _ALS_OnPlayerDeath + #define OnPlayerDeath(%0) FIXES_OnPlayerDeath(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerDeath(playerid, killerid, reason); +#endif + +/* + * FIXES_SpawnPlayer(playerid) + * + * FIXES: + * SpawnPlayer + */ + +#if defined _ALS_SpawnPlayer + #error _ALS_SpawnPlayer defined +#endif +native BAD_SpawnPlayer(playerid) = SpawnPlayer; + +#if FIX_SpawnPlayer + stock FIXES_SpawnPlayer(playerid) + { + // Valid "playerid" check inside "GetPlayerVehicleID". + new + vid = GetPlayerVehicleID(playerid); + if (vid) + { + new + Float:x, + Float:y, + Float:z; + // Remove them without the animation. + GetVehiclePos(vid, x, y, z), + SetPlayerPos(playerid, x, y, z); + } + return SpawnPlayer(playerid); + } + + #define _ALS_SpawnPlayer + #define SpawnPlayer FIXES_SpawnPlayer +#endif + +/* + * FIXES_SetPlayerName(playerid, name[]) + * + * FIXES: + * SetPlayerName + */ + +#if defined _ALS_SetPlayerName + #error _ALS_SetPlayerName defined +#endif +native BAD_SetPlayerName(playerid, const name[]) = SetPlayerName; + +#if FIX_SetPlayerName + stock FIXES_SetPlayerName(playerid, name[]) + { + static + sOldName[MAX_PLAYER_NAME]; + GetPlayerName(playerid, sOldName, sizeof (sOldName)); + if (!strcmp(name, sOldName, true)) + { + if(strcmp(name, sOldName, false)) + { + SetPlayerName(playerid, FIXES_gscTempName); + if(SetPlayerName(playerid, name) == -1) + { + SetPlayerName(playerid, sOldName); + return -1; + } + return 1; + } + else + { + return 0; + } + } + return SetPlayerName(playerid, name); + } + + #define _ALS_SetPlayerName + #define SetPlayerName FIXES_SetPlayerName +#endif + +/* + * OnPlayerRequestClass(playerid, classid) + * + * FIXES: + * OnPlayerRequestClass + */ + +#if FIX_OnPlayerRequestClass + public OnPlayerRequestClass(playerid, classid) + { + // ============================= + // BEGIN: OnPlayerRequestClass + // ============================= + #if FIX_OnPlayerRequestClass + new + Float:x, + Float:y, + Float:z; + GetPlayerPos(playerid, x, y, z), + RemoveBuildingForPlayer(playerid, 1484, x, y, z, 10.0), + RemoveBuildingForPlayer(playerid, 1485, x, y, z, 10.0), + RemoveBuildingForPlayer(playerid, 1486, x, y, z, 10.0); + #endif + // =========================== + // END: OnPlayerRequestClass + // =========================== + return FIXES_OnPlayerRequestClass(playerid, classid); + } + + #if defined _ALS_OnPlayerRequestClass + #error _ALS_OnPlayerRequestClass defined + #endif + #define _ALS_OnPlayerRequestClass + #define OnPlayerRequestClass(%0) FIXES_OnPlayerRequestClass(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerRequestClass(playerid, classid); +#endif + +/* + * OnPlayerSpawn(playerid) + * + * FIXES: + * GetPlayerSkin + * TogglePlayerControllable + * GetPlayerInterior + * OnPlayerSpawn + * GameText + */ + +#if FIX_GetPlayerSkin || FIX_TogglePlayerControllable || FIX_GetPlayerInterior || FIX_OnPlayerSpawn || FIX_GameText + public OnPlayerSpawn(playerid) + { + _FIXES_IS_IN_CHARGE() + { + // ====================== + // BEGIN: OnPlayerSpawn + // ====================== + #if FIX_OnPlayerSpawn + ResetPlayerMoney(playerid); + #if FIXES_Single + GivePlayerMoney(playerid, FIXES_gsLastCash[playerid]); + FIXES_gsLastCash[playerid] = 0; + #else + GivePlayerMoney(playerid, GetPVarInt(playerid, FIXES_pvarPlayerLastCash)); + SetPVarInt(playerid, FIXES_pvarPlayerLastCash, 0); + #endif + #endif + // ====================== + // END: OnPlayerSpawn + // ====================== + + // ========================== + // BEGIN: GetPlayerInterior + // ========================== + #if FIX_GetPlayerInterior + #if FIXES_Single + FIXES_gsInterior[playerid] = 0; + #else + SetPVarInt(playerid, FIXES_pvarPlayerInterior, 0); + #endif + #endif + // ========================== + // END: GetPlayerInterior + // ========================== + + // ================= + // BEGIN: GameText + // ================= + #if FIX_GameText + // Per-player GTs. + + #define _FIXES_PER_PLAYER_GT(%0) if (FIXES_gsPlayerPGTShown[%0][playerid] > playerid) PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][%0]), _FIXES_RemoveInternal(FIXES_gsPlayerPGTShown[%0], playerid, MAX_PLAYERS) + + #if FIX_GameTextStyles + _FIXES_PER_PLAYER_GT(13); + _FIXES_PER_PLAYER_GT(12); + _FIXES_PER_PLAYER_GT(11); + _FIXES_PER_PLAYER_GT(10); + _FIXES_PER_PLAYER_GT(9); + _FIXES_PER_PLAYER_GT(8); + _FIXES_PER_PLAYER_GT(7); + #endif + _FIXES_PER_PLAYER_GT(6); + _FIXES_PER_PLAYER_GT(5); + _FIXES_PER_PLAYER_GT(4); + _FIXES_PER_PLAYER_GT(3); + _FIXES_PER_PLAYER_GT(2); + _FIXES_PER_PLAYER_GT(1); + _FIXES_PER_PLAYER_GT(0); + + #undef _FIXES_PER_PLAYER_GT + + // Global GTs. + #if FIX_GameTextStyles + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[13]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[12]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[11]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[10]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[9]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[8]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[7]); + #endif + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[6]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[5]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[4]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[3]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[2]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[1]), + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[0]); + + #endif + // ================= + // END: GameText + // ================= + } + + // ====================== + // BEGIN: GetPlayerSkin + // ====================== + #if FIX_GetPlayerSkin + #if FIXES_Single + FIXES_gsPlayerSkin[playerid] = GetPlayerSkin(playerid); + #else + SetPVarInt(playerid, FIXES_pvarPlayerSkin, GetPlayerSkin(playerid)); + #endif + #endif + // ====================== + // END: GetPlayerSkin + // ====================== + + // ================================= + // BEGIN: TogglePlayerControllable + // ================================= + #if FIX_TogglePlayerControllable + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE; + #endif + // ================================= + // END: TogglePlayerControllable + // ================================= + + return FIXES_OnPlayerSpawn(playerid); + } + + #if defined _ALS_OnPlayerSpawn + #error _ALS_OnPlayerSpawn defined + #endif + #define _ALS_OnPlayerSpawn + #define OnPlayerSpawn(%0) FIXES_OnPlayerSpawn(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerSpawn(playerid); +#endif + +/* + * OnVehicleMod(playerid, vehicleid, componentid) + * + * FIXES: + * OnVehicleMod + */ + +#if FIX_OnVehicleMod + public OnVehicleMod(playerid, vehicleid, componentid) + { + #if !FIXES_Single + if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)) + { + return FIXES_OnVehicleMod(playerid, vehicleid, componentid); + } + #endif + + // ===================== + // BEGIN: OnVehicleMod + // ===================== + new + modelid = GetVehicleModel(vehicleid); + if (_FIXES_IN_RANGE(modelid, 400, 611 + 1)) + { + switch (componentid) + { + case 1000 .. 1191: + { + if (FIXES_gscVehicleMods[(modelid - 400) * 6 + (componentid - 1000 >>> 5)] & 1 << (componentid - 1000 & 0b00011111)) + { + return FIXES_OnVehicleMod(playerid, vehicleid, componentid); + } + } + case 1192, 1193: + { + if (modelid == 576) + { + // This save a whole cell off EVERY other vehicle! This + // is the ONLY vehicle with any mods over "6 * 32 + 999" + // (1191), the highest value you can fit in 6 cells of a + // bit array (minus 1000). + return FIXES_OnVehicleMod(playerid, vehicleid, componentid); + } + } + } + } + // Desync the player entirely. + FIXES_BlockUpdate(playerid, true); + return 0; + // ===================== + // END: OnVehicleMod + // ===================== + } + + #if defined _ALS_OnVehicleMod + #error _ALS_OnVehicleMod defined + #endif + #define _ALS_OnVehicleMod + #define OnVehicleMod(%0) FIXES_OnVehicleMod(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnVehicleMod(playerid, vehicleid, componentid); +#endif + +/* + * FIXES_SetPlayerSkin(playerid, skinid) + * + * FIXES: + * GetPlayerSkin + * SetPlayerSkin + */ + +#if defined _ALS_SetPlayerSkin + #error _ALS_SetPlayerSkin defined +#endif +native BAD_SetPlayerSkin(playerid, skinid) = SetPlayerSkin; + +#if FIX_GetPlayerSkin || FIX_SetPlayerSkin + stock FIXES_SetPlayerSkin(playerid, skinid) + { + // ====================== + // BEGIN: SetPlayerSkin + // ====================== + #if FIX_SetPlayerSkin + new + vehicleid = GetPlayerVehicleID(playerid); + if (vehicleid) + { + new + seat = GetPlayerVehicleSeat(playerid); + ClearAnimations(playerid); + new + ret = SetPlayerSkin(playerid, skinid); + PutPlayerInVehicle(playerid, vehicleid, seat); + + // ====================== + // BEGIN: GetPlayerSkin + // ====================== + #if FIX_GetPlayerSkin + #if FIXES_Single + FIXES_gsPlayerSkin[playerid] = skinid; + #else + SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid); + #endif + #endif + // ====================== + // END: GetPlayerSkin + // ====================== + + return ret; + } + + // ====================== + // BEGIN: GetPlayerSkin + // ====================== + #if FIX_GetPlayerSkin + else + #endif + // ====================== + // END: GetPlayerSkin + // ====================== + #endif + // ====================== + // END: SetPlayerSkin + // ====================== + + // ====================== + // BEGIN: GetPlayerSkin + // ====================== + #if FIX_GetPlayerSkin + // Watch fot the "else" above if this code ever changes. + #if FIXES_Single + FIXES_gsPlayerSkin[playerid] = skinid; + #else + SetPVarInt(playerid, FIXES_pvarPlayerSkin, skinid); + #endif + #endif + // ====================== + // END: GetPlayerSkin + // ====================== + + return SetPlayerSkin(playerid, skinid); + } + + #define _ALS_SetPlayerSkin + #define SetPlayerSkin FIXES_SetPlayerSkin +#endif + +/* + * FIXES_GetPlayerSkin(playerid, skinid) + * + * FIXES: + * GetPlayerSkin + */ + +#if defined _ALS_GetPlayerSkin + #error _ALS_GetPlayerSkin defined +#endif +native BAD_GetPlayerSkin(playerid) = GetPlayerSkin; + +#if FIX_GetPlayerSkin + stock FIXES_GetPlayerSkin(playerid) + { + #if FIXES_Single + return FIXES_gsPlayerSkin[playerid]; + #else + return GetPVarInt(playerid, FIXES_pvarPlayerSkin); + #endif + } + + #define _ALS_GetPlayerSkin + #define GetPlayerSkin FIXES_GetPlayerSkin +#endif + +/* + * FIXES_GetWeaponName(weaponid, weapon[], len) + * + * FIXES: + * GetWeaponName + */ + +#if defined _ALS_GetWeaponName + #error _ALS_GetWeaponName defined +#endif +native BAD_GetWeaponName(weaponid, weapon[], len) = GetWeaponName; + +#if FIX_GetWeaponName + stock FIXES_GetWeaponName(weaponid, weapon[], len) + { + switch (weaponid) + { + case 18: + { + return + weapon[0] = 0, + strcat(weapon, "Molotov Cocktail", len), + 1; + } + case 44: + { + return + weapon[0] = 0, + strcat(weapon, "Night Vision Goggles", len), + 1; + } + case 45: + { + return + weapon[0] = 0, + strcat(weapon, "Thermal Goggles", len), + 1; + } + default: + { + return GetWeaponName(weaponid, weapon, len); + } + } + return 0; + } + + #define _ALS_GetWeaponName + #define GetWeaponName FIXES_GetWeaponName +#endif + +/* + * OnPlayerUpdate(playerid) + * + * FIXES: + * SetPlayerWorldBounds + * TogglePlayerControllable + * AllowInteriorWeapons + * OnPlayerDeath + * Kick + * OnVehicleMod + * OnPlayerEnterVehicle + * OnPlayerEnterVehicle_2 + */ + +#if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable || FIX_AllowInteriorWeapons || FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_OnPlayerDeath || FIX_Kick || FIX_OnVehicleMod + public OnPlayerUpdate(playerid) + { + // ============================= + // BEGIN: OnPlayerEnterVehicle + // ============================= + #if FIX_OnPlayerEnterVehicle || FIX_Kick || FIX_OnVehicleMod || FIX_OnPlayerEnterVehicle_2 + if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_BLOCK) + { + return 0; + } + #endif + // ============================= + // END: OnPlayerEnterVehicle + // ============================= + + #if !FIXES_Single + if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)) + { + return FIXES_OnPlayerUpdate(playerid); + } + #endif + + #if FIX_OnPlayerEnterVehicle || FIX_AllowInteriorWeapons || FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable + new + e_FIXES_BOOLS:pbools = FIXES_gsPlayerBools[playerid]; + #endif + + // ============================= + // BEGIN: AllowInteriorWeapons + // ============================= + #if FIX_AllowInteriorWeapons + if (pbools & e_FIXES_BOOLS_INTERIOR) + { + // DONE: May need integration with "FIX_GetPlayerWeapon". + SetPlayerArmedWeapon(playerid, 0); + } + #endif + // ============================ + // END: AllowInteriorWeapons + // ============================ + + #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable + new + ud, + lr, + keys; + GetPlayerKeys(playerid, keys, ud, lr); + #endif + + #if FIX_SetPlayerWorldBounds && !FIX_TogglePlayerControllable + #pragma unused ud, lr + #endif + + // ============================= + // BEGIN: SetPlayerWorldBounds + // ============================= + #if FIX_SetPlayerWorldBounds + if (pbools & e_FIXES_BOOLS_WORLDBOUNDS && keys & _FIXES_KEY_AIM) + { + new + Float:x, + Float:y, + Float:z; + GetPlayerPos(playerid, x, y, z); + if (FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] < x < FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] && FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] < y < FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY]) + { + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = x, + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = y, + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = z; + } + else + { + SetPlayerPos(playerid, FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX], FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY], FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ]); + } + } + #endif + // ============================= + // END: SetPlayerWorldBounds + // ============================= + + // ====================== + // BEGIN: OnPlayerDeath + // ====================== + #if FIX_OnPlayerDeath + FIXES_gsLastAnimation[playerid] = GetPlayerAnimationIndex(playerid); + #endif + // ====================== + // END: OnPlayerDeath + // ====================== + + // ================================= + // BEGIN: TogglePlayerControllable + // ================================= + #if FIX_TogglePlayerControllable + // MUST come last. + if (pbools & e_FIXES_BOOLS_UNCONTROLLABLE) + { + // Keys based sync blocking, modified based on a post by Slice: + // http://forum.sa-mp.com/showpost.php?p=876854 Use "playerid" + // here as it's a variable that already exists, but note that + // after this point, you CANNOT use "playerid" as it has been + // "clobbered" (and yes, that's the technical term). This is + // just to avoid "statement has no effect" warnings. ALWAYS + // return 0 in this case, regardless of what other callbacks + // return. + playerid = FIXES_OnPlayerUpdate(playerid); + if (keys || ud || lr) + { + return 0; + } + else + { + return playerid; + } + } + #endif + // ================================= + // END: TogglePlayerControllable + // ================================= + + return FIXES_OnPlayerUpdate(playerid); + } + + #if defined _ALS_OnPlayerUpdate + #error _ALS_OnPlayerUpdate defined + #endif + #define _ALS_OnPlayerUpdate + #define OnPlayerUpdate(%0) FIXES_OnPlayerUpdate(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerUpdate(playerid); +#endif + +/* + * FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) + * + * TODO: Modify this to remove aim animations when they get to the boundaries. + * + * FIXES: + * SetPlayerWorldBounds + */ + +#if defined _ALS_SetPlayerWorldBounds + #error _ALS_SetPlayerWorldBounds defined +#endif +native BAD_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) = SetPlayerWorldBounds; + +#if FIX_SetPlayerWorldBounds + #if FIXES_Single + stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + FIXES_PRINTF("Call SetPlayerWorldBounds"); + if (x_max == x_min || y_max == y_min) + { + // Impossibly small area, disable checks entirely. + return + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS, + SetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY); + } + // This code could do with a way to mostly remove the checks. Maybe + // when setting everything to FIXES_INFINITY (with default + // parameters). + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS; + new + Float:tmp; + if (x_max < x_min) + { + tmp = x_min, + x_min = x_max, + x_max = tmp; + } + if (y_max < y_min) + { + tmp = y_min, + y_min = y_max, + y_max = tmp; + } + // Give a little leway so this fix isn't noticed if you're not + // trying to break through the world bounds. Leway removed in + // favour of keys. + return + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min, + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max, + + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min, + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max, + + GetPlayerPos(playerid, tmp, tmp, tmp), + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min, + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min, + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp, + + SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min); + } + return 0; + } + #else + forward _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min); + + stock FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + FIXES_PRINTF("Call SetPlayerWorldBounds"); + return + CallRemoteFunction(FIXES_gscSetPlayerWorldBounds, FIXES_gscSpec@iffff, playerid, x_max, x_min, y_max, y_min), + getproperty(5, FIXES_gscReturnProperty); + } + return 0; + } + + public _FIXES_SetPlayerWorldBounds(playerid, Float:x_max, Float:x_min, Float:y_max, Float:y_min) + { + FIXES_PRINTF("_FIXES_SetPlayerWorldBounds: %d %.2f %.2f %.2f %.2f", playerid, x_max, x_min, y_max, y_min); + _FIXES_IS_IN_CHARGE() + { + FIXES_PRINTF("SetPlayerWorldBounds"); + //if (x_max == _FIXES_INFINITY && x_min == _FIXES_INFINITY && y_max == _FIXES_INFINITY && y_min == _FIXES_INFINITY) + if (x_max == x_min || y_max == y_min) + { + // Impossibly small area, disable checks entirely. + return + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_WORLDBOUNDS, + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = + 0.0, + setproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, _FIXES_INFINITY, _FIXES_N_INFINITY, _FIXES_INFINITY, _FIXES_N_INFINITY)), + -1; + } + // This code could do with a way to mostly remove the checks. Maybe + // when setting everything to FIXES_INFINITY (with default + // parameters). + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_WORLDBOUNDS; + new + Float:tmp; + if (x_max < x_min) + { + tmp = x_min, + x_min = x_max, + x_max = tmp; + } + if (y_max < y_min) + { + tmp = y_min, + y_min = y_max, + y_max = tmp; + } + // Give a little leway so this fix isn't noticed if you're not + // trying to break through the world bounds. Leway removed in + // favour of keys. + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LX] = x_min, + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UX] = x_max, + + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_LY] = y_min, + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_UY] = y_max, + + GetPlayerPos(playerid, tmp, tmp, tmp), + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PX] = (x_max - x_min) / 2 + x_min, + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PY] = (y_max - y_min) / 2 + y_min, + FIXES_gsWorldbounds[playerid][E_FIXES_WORLDBOUND_DATA_PZ] = tmp, + + setproperty(5, FIXES_gscReturnProperty, SetPlayerWorldBounds(playerid, x_max, x_min, y_max, y_min)); + } + return 0; + } + #endif + + #define _ALS_SetPlayerWorldBounds + #define SetPlayerWorldBounds FIXES_SetPlayerWorldBounds +#endif + +/* + * FIXES_TogglePlayerControllable(playerid, toggle) + * + * FIXES: + * TogglePlayerControllable + */ + +#if defined _ALS_TogglePlayerControllable + #error _ALS_TogglePlayerControllable defined +#endif +native BAD_TogglePlayerControllable(playerid, toggle) = TogglePlayerControllable; + +#if FIX_TogglePlayerControllable + #if FIXES_Single + stock FIXES_TogglePlayerControllable(playerid, toggle) + { + if (TogglePlayerControllable(playerid, toggle)) + { + if (toggle) + { + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE; + } + else + { + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE; + } + return 1; + } + return 0; + } + #else + forward _FIXES_TogglePlayerControllable(playerid, toggle); + + stock FIXES_TogglePlayerControllable(playerid, toggle) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + return + CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, playerid, toggle), + getproperty(5, FIXES_gscReturnProperty); + } + return 0; + } + + public _FIXES_TogglePlayerControllable(playerid, toggle) + { + _FIXES_IS_IN_CHARGE() + { + if (toggle) + { + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_UNCONTROLLABLE; + } + else + { + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_UNCONTROLLABLE; + } + setproperty(5, FIXES_gscReturnProperty, TogglePlayerControllable(playerid, toggle)); + } + } + #endif + + #define _ALS_TogglePlayerControllable + #define TogglePlayerControllable FIXES_TogglePlayerControllable +#endif + +/* + * OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) + * + * FIXES: + * AllowInteriorWeapons + * GetPlayerInterior + */ + +#if FIX_AllowInteriorWeapons || FIX_GetPlayerInterior + public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid) + { + // ========================== + // BEGIN: GetPlayerInterior + // ========================== + #if FIX_GetPlayerInterior + #if FIXES_Single + FIXES_gsInterior[playerid] = newinteriorid; + #else + _FIXES_IS_IN_CHARGE() + { + SetPVarInt(playerid, FIXES_pvarPlayerInterior, newinteriorid); + } + #endif + #endif + // ========================== + // END: GetPlayerInterior + // ========================== + + // ============================= + // BEGIN: AllowInteriorWeapons + // ============================= + #if FIX_AllowInteriorWeapons + if (newinteriorid) + { + if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR) + { + // This only needs doing here if "GetPlayerWeapon" is set. + // If it isn't, even though "AllowInteriorWeapons" can use + // this code on its own, it doesn't as "OnPlayerUpdate" + // takes care of it all. + // TODO: Rewrite this code to use a single bit to indicate + // if a player can have a weapon or not, and just use the in + // the "OnPlayerUpdate" callback, instead of several checks. + // DONE! + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_INTERIOR; + _FIXES_IS_IN_CHARGE() + { + SetPlayerArmedWeapon(playerid, 0); + #if FIX_GetPlayerWeapon + if (IsPlayerInAnyVehicle(playerid)) + { + #if FIXES_Single + FIXES_gsPlayerWeapon[playerid] = 0; + #else + SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0); + #endif + } + #endif + } + } + } + else + { + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_INTERIOR; + } + #endif + // =========================== + // END: AllowInteriorWeapons + // =========================== + return FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid); + } + + #if defined _ALS_OnPlayerInteriorChange + #error _ALS_OnPlayerInteriorChange defined + #endif + #define _ALS_OnPlayerInteriorChange + #define OnPlayerInteriorChange(%0) FIXES_OnPlayerInteriorChange(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid); +#endif + +/* + * _FIXES_DriveBy(playerid) + * + * FIXES: + * DriveBy + */ + +#if FIX_DriveBy + forward _FIXES_DriveBy(playerid); + + public _FIXES_DriveBy(playerid) + { + if (GetPlayerState(playerid) == PLAYER_STATE_PASSENGER) + { + SetPlayerArmedWeapon(playerid, FIXES_gsDriveByWeapon[playerid]); + } + return FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_DRIVE_BY; + } +#endif + +/* + * OnPlayerKeyStateChange(playerid, newkeys, oldkeys) + * + * FIXES: + * DriveBy + */ + +#if FIX_DriveBy + public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) + { + // =============================== + // BEGIN: DriveBy + // =============================== + #if FIX_DriveBy + #if !FIXES_Single + if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE) + #endif + { + if ((newkeys & KEY_CROUCH) && !(oldkeys & KEY_CROUCH) && GetPlayerState(playerid) == PLAYER_STATE_PASSENGER && GetPlayerCameraMode(playerid) == 55 && !(FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_DRIVE_BY)) + { + FIXES_gsDriveByWeapon[playerid] = GetPlayerWeapon(playerid), + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_DRIVE_BY, + SetPlayerArmedWeapon(playerid, 0), + ApplyAnimation(playerid, "PED", "CAR_GETIN_RHS", 4.1, 0, 0, 0, 0, 1, 1), + SetTimerEx(FIXES_gscDriveBy, 500, 0, FIXES_gscSpec@i, playerid); + } + } + #endif + // ============================= + // END: DriveBy + // ============================= + + return FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys); + } + + #if defined _ALS_OnPlayerKeyStateChange + #error _ALS_OnPlayerKeyStateChange defined + #endif + #define _ALS_OnPlayerKeyStateChange + #define OnPlayerKeyStateChange(%0) FIXES_OnPlayerKeyStateChange(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerKeyStateChange(playerid, newkeys, oldkeys); +#endif + +/* + * OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) + * + * FIXES: + * OnPlayerEnterVehicle_2 + */ + +#if FIX_OnPlayerEnterVehicle_2 + public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) + { + // =============================== + // BEGIN: OnPlayerEnterVehicle_2 + // =============================== + #if FIX_OnPlayerEnterVehicle_2 + if (0 < vehicleid < MAX_VEHICLES) + { + return FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger); + } + FIXES_BlockUpdate(playerid, true); + return 0; + #endif + // ============================= + // END: OnPlayerEnterVehicle_2 + // ============================= + } + + #if defined _ALS_OnPlayerEnterVehicle + #error _ALS_OnPlayerEnterVehicle defined + #endif + #define _ALS_OnPlayerEnterVehicle + #define OnPlayerEnterVehicle(%0) FIXES_OnPlayerEnterVehicle(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger); +#endif + +/* + * OnPlayerExitVehicle(playerid, vehicleid) + * + * FIXES: + * OnPlayerEnterVehicle_2 + */ + +#if FIX_OnPlayerEnterVehicle_2 + public OnPlayerExitVehicle(playerid, vehicleid) + { + // =============================== + // BEGIN: OnPlayerEnterVehicle_2 + // =============================== + #if FIX_OnPlayerEnterVehicle_2 + if (0 < vehicleid < MAX_VEHICLES) + { + return FIXES_OnPlayerExitVehicle(playerid, vehicleid); + } + FIXES_BlockUpdate(playerid, true); + return 0; + #endif + // ============================= + // END: OnPlayerEnterVehicle_2 + // ============================= + } + + #if defined _ALS_OnPlayerExitVehicle + #error _ALS_OnPlayerExitVehicle defined + #endif + #define _ALS_OnPlayerExitVehicle + #define OnPlayerExitVehicle(%0) FIXES_OnPlayerExitVehicle(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerExitVehicle(playerid, vehicleid); +#endif + +/* + * FIXES_BlockUpdate(playerid, bool:block) + * + * Block a player from using OnPlayerUpdate at all. + */ + +#if FIX_OnPlayerEnterVehicle || FIX_OnPlayerEnterVehicle_2 || FIX_Kick || FIX_OnVehicleMod + static stock FIXES_BlockUpdate(playerid, bool:block, kick = 6) + { + if (kick) + { + #if FIXES_SilentKick + new + ip[22]; + GetPlayerIp(playerid, ip, sizeof (ip)), + format(ip, sizeof (ip), "banip %s", ip), + SendRconCommand(ip), + FIXES_gsPlayerIP[playerid] = strval(ip[kick]) << 24, + kick = strfind(ip, FIXES_gscDot, false, kick) + 1, + FIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 16, + kick = strfind(ip, FIXES_gscDot, false, kick) + 1, + FIXES_gsPlayerIP[playerid] |= strval(ip[kick]) << 8, + kick = strfind(ip, FIXES_gscDot, false, kick) + 1, + FIXES_gsPlayerIP[playerid] |= strval(ip[kick]); + #else + Kick(playerid); + #endif + } + if (block) + { + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_BLOCK; + return 0; + } + else + { + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_BLOCK; + return 1; + } + } +#endif + +/* + * OnPlayerSelectedMenuRow(playerid, row) + * + * FIXES: + * GetPlayerMenu + */ + +#if FIX_GetPlayerMenu + public OnPlayerSelectedMenuRow(playerid, row) + { + // ====================== + // BEGIN: GetPlayerMenu + // ====================== + #if FIXES_Single + FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET; + new + ret = FIXES_OnPlayerSelectedMenuRow(playerid, row); + if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET)) + { + FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU; + } + return ret; + #else + new + Menu:cur = FIXES_gsCurrentMenu[playerid]; + _FIXES_IS_IN_CHARGE() + { + setproperty(5, FIXES_gscMenuProperty, _:cur); + CallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid); + FIXES_gsCurrentMenu[playerid] = cur; + new + ret = FIXES_OnPlayerSelectedMenuRow(playerid, row); + if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET)) + { + FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU; + } + return ret; + } + else + { + FIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty); + FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET; + new + ret = FIXES_OnPlayerSelectedMenuRow(playerid, row); + if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET)) + { + FIXES_gsCurrentMenu[playerid] = cur; + } + return ret; + } + #endif + // ====================== + // END: GetPlayerMenu + // ====================== + } + + #if defined _ALS_OnPlayerSelectedMenuRow + #error _ALS_OnPlayerSelectedMenuRow defined + #endif + #define _ALS_OnPlayerSelectedMenuRow + #define OnPlayerSelectedMenuRow(%0) FIXES_OnPlayerSelectedMenuRow(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerSelectedMenuRow(playerid, row); +#endif + +/* + * OnPlayerExitedMenu(playerid) + * + * FIXES: + * GetPlayerMenu + */ + +#if FIX_GetPlayerMenu + public OnPlayerExitedMenu(playerid) + { + // ====================== + // BEGIN: GetPlayerMenu + // ====================== + #if FIXES_Single + FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET; + new + ret = FIXES_OnPlayerExitedMenu(playerid); + if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET)) + { + FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU; + } + return ret; + #else + new + Menu:cur = FIXES_gsCurrentMenu[playerid]; + _FIXES_IS_IN_CHARGE() + { + setproperty(5, FIXES_gscMenuProperty, _:cur); + CallRemoteFunction(FIXES_gscClearPlayerMenu, FIXES_gscSpec@i, playerid); + FIXES_gsCurrentMenu[playerid] = cur; + new + ret = FIXES_OnPlayerExitedMenu(playerid); + if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET)) + { + FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU; + } + return ret; + } + else + { + FIXES_gsCurrentMenu[playerid] = Menu:getproperty(5, FIXES_gscMenuProperty); + FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET; + new + ret = FIXES_OnPlayerExitedMenu(playerid); + if (!(FIXES_gsSettings & e_FIXES_SETTINGS_MENU_SET)) + { + FIXES_gsCurrentMenu[playerid] = cur; + } + return ret; + } + #endif + // ====================== + // END: GetPlayerMenu + // ====================== + } + + #if defined _ALS_OnPlayerExitedMenu + #error _ALS_OnPlayerExitedMenu defined + #endif + #define _ALS_OnPlayerExitedMenu + #define OnPlayerExitedMenu(%0) FIXES_OnPlayerExitedMenu(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerExitedMenu(playerid); +#endif + +/* + * FIXES_IS_VALID_MENU(Menu:menuid) + * + * FIXES: + * Menus + */ + +#if _FIX_Menus + #define FIXES_IS_VALID_MENU(%0) (_FIXES_IN_RANGE(_:(%0), 0, MAX_MENUS) && (FIXES_gsValidMenus[_:(%0) >>> 5] & (1 << (_:(%0) & 0x1F)))) +#endif + +/* + * Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0) + * + * FIXES: + * Menus + */ + +#if defined _ALS_CreateMenu + #error _ALS_CreateMenu defined +#endif +native Menu:BAD_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0) = CreateMenu; + +#if _FIX_Menus + #if !FIXES_Single + forward _FIXES_CreateMenu(ret); + + public _FIXES_CreateMenu(ret) + { + FIXES_gsValidMenus[ret >>> 5] |= 1 << (ret & 0x1F); + } + #endif + + stock Menu:FIXES_CreateMenu(const title[], columns, Float:x, Float:y, Float:col1width, Float:col2width = 0.0) + { + new + Menu:ret = CreateMenu(title, columns, x, y, col1width, col2width); + if (_FIXES_IN_RANGE(_:ret, 0, MAX_MENUS)) + { + #if FIXES_Single + FIXES_gsValidMenus[_:ret >>> 5] |= 1 << (_:ret & 0x1F); + #else + CallRemoteFunction("_FIXES_CreateMenu", FIXES_gscSpec@i, _:ret); + #endif + } + return ret; + } + + #define _ALS_CreateMenu + #define CreateMenu FIXES_CreateMenu +#endif + +/* + * _FIXES_SetPlayerMenu(playerid, Menu:menuid) + * + * FIXES: + * GetPlayerMenu + */ + +#if FIX_GetPlayerMenu && !FIXES_Single + forward _FIXES_SetPlayerMenu(playerid, Menu:menuid); + + public _FIXES_SetPlayerMenu(playerid, Menu:menuid) + { + FIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET; + FIXES_gsCurrentMenu[playerid] = menuid; + } +#endif + +/* + * _FIXES_ClearPlayerMenu(playerid) + * + * FIXES: + * GetPlayerMenu + */ + +#if FIX_GetPlayerMenu && !FIXES_Single + forward _FIXES_ClearPlayerMenu(playerid); + + public _FIXES_ClearPlayerMenu(playerid) + { + FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET; + FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU; + } +#endif + +/* + * Menu:FIXES_DestroyMenu(Menu:menuid) + * + * FIXES: + * GetPlayerMenu + */ + +#if defined _ALS_DestroyMenu + #error _ALS_DestroyMenu defined +#endif +native BAD_DestroyMenu(Menu:menuid) = DestroyMenu; + +#if _FIX_Menus || FIX_GetPlayerMenu + #if _FIX_Menus && !FIXES_Single + forward _FIXES_DestroyMenu(ret); + + public _FIXES_DestroyMenu(ret) + { + FIXES_gsValidMenus[ret >>> 5] &= ~(1 << (ret & 0x1F)); + } + #endif + + stock FIXES_DestroyMenu(Menu:menuid) + { + #if _FIX_Menus + if (FIXES_IS_VALID_MENU(menuid)) + #endif + { + if (DestroyMenu(Menu:menuid)) + { + #if _FIX_Menus + #if FIXES_Single + FIXES_gsValidMenus[_:menuid >>> 5] &= ~(1 << (_:menuid & 0x1F)); + #else + CallRemoteFunction("_FIXES_DestroyMenu", FIXES_gscSpec@i, _:menuid); + #endif + #endif + _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid) + { + if (FIXES_gsCurrentMenu[playerid] == menuid) + { + if (HideMenuForPlayer(menuid, playerid)) + { + #if FIXES_Single + FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET; + FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU; + #else + CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU); + #endif + } + } + } + return 1; + } + } + return 0; + } + + #define _ALS_DestroyMenu + #define DestroyMenu FIXES_DestroyMenu +#endif + +/* + * FIXES_AddMenuItem(Menu:menuid, column, const menutext[]) + * + * FIXES: + * AddMenuItem + */ + +#if defined _ALS_AddMenuItem + #error _ALS_AddMenuItem defined +#endif +native BAD_AddMenuItem(Menu:menuid, column, const menutext[]) = AddMenuItem; + +#if FIX_AddMenuItem + stock FIXES_AddMenuItem(Menu:menuid, column, const menutext[]) + { + if (FIXES_IS_VALID_MENU(menuid)) + { + return AddMenuItem(menuid, column, menutext); + } + return 0; + } + + #define _ALS_AddMenuItem + #define AddMenuItem FIXES_AddMenuItem +#endif + +/* + * FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[]) + * + * FIXES: + * SetMenuColumnHeader + */ + +#if defined _ALS_SetMenuColumnHeader + #error _ALS_SetMenuColumnHeader defined +#endif +native BAD_SetMenuColumnHeader(Menu:menuid, column, const columnheader[]) = SetMenuColumnHeader; + +#if FIX_SetMenuColumnHeader + stock FIXES_SetMenuColumnHeader(Menu:menuid, column, const columnheader[]) + { + if (FIXES_IS_VALID_MENU(menuid)) + { + return SetMenuColumnHeader(menuid, column, columnheader); + } + return 0; + } + + #define _ALS_SetMenuColumnHeader + #define SetMenuColumnHeader FIXES_SetMenuColumnHeader +#endif + +/* + * FIXES_ShowMenuForPlayer(Menu:menuid, playerid) + * + * FIXES: + * ShowMenuForPlayer + * GetPlayerMenu + */ + +#if defined _ALS_ShowMenuForPlayer + #error _ALS_ShowMenuForPlayer defined +#endif +native BAD_ShowMenuForPlayer(Menu:menuid, playerid) = ShowMenuForPlayer; + +#if FIX_ShowMenuForPlayer || FIX_GetPlayerMenu + stock FIXES_ShowMenuForPlayer(Menu:menuid, playerid) + { + #if FIX_ShowMenuForPlayer + if (FIXES_IS_VALID_MENU(menuid)) + #endif + { + #if FIX_GetPlayerMenu + if (ShowMenuForPlayer(menuid, playerid)) + { + #if FIXES_Single + FIXES_gsSettings |= e_FIXES_SETTINGS_MENU_SET; + FIXES_gsCurrentMenu[playerid] = menuid; + #else + CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, _:menuid); + #endif + return 1; + } + #else + return ShowMenuForPlayer(menuid, playerid); + #endif + } + return 0; + } + + #define _ALS_ShowMenuForPlayer + #define ShowMenuForPlayer FIXES_ShowMenuForPlayer +#endif + +/* + * FIXES_HideMenuForPlayer(Menu:menuid, playerid) + * + * FIXES: + * HideMenuForPlayer + * HideMenuForPlayer_2 + * GetPlayerMenu + */ + +#if defined _ALS_HideMenuForPlayer + #error _ALS_HideMenuForPlayer defined +#endif +native BAD_HideMenuForPlayer(Menu:menuid, playerid) = HideMenuForPlayer; + +#if FIX_HideMenuForPlayer || FIX_GetPlayerMenu + stock FIXES_HideMenuForPlayer(Menu:menuid, playerid) + { + #if FIX_HideMenuForPlayer + if (FIXES_IS_VALID_MENU(menuid)) + #endif + { + #if FIX_GetPlayerMenu + #if FIX_HideMenuForPlayer_2 + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS) && FIXES_gsCurrentMenu[playerid] == menuid) + #else + if (FIXES_gsCurrentMenu[playerid] == menuid && HideMenuForPlayer(menuid, playerid)) + #endif + { + #if FIXES_Single + FIXES_gsSettings &= ~e_FIXES_SETTINGS_MENU_SET; + FIXES_gsCurrentMenu[playerid] = Menu:INVALID_MENU; + #else + CallRemoteFunction(FIXES_gscSetPlayerMenu, FIXES_gscSpec@ii, playerid, INVALID_MENU); + #endif + #if FIX_HideMenuForPlayer_2 + return HideMenuForPlayer(menuid, playerid); + #else + return 1; + #endif + } + #else + return HideMenuForPlayer(menuid, playerid); + #endif + } + return 0; + } + + #define _ALS_HideMenuForPlayer + #define HideMenuForPlayer FIXES_HideMenuForPlayer +#endif + +/* + * FIXES_DisableMenu(Menu:menuid) + * + * FIXES: + * DisableMenu + */ + +#if defined _ALS_DisableMenu + #error _ALS_DisableMenu defined +#endif +native BAD_DisableMenu(Menu:menuid) = DisableMenu; + +#if FIX_DisableMenu + stock FIXES_DisableMenu(Menu:menuid) + { + if (FIXES_IS_VALID_MENU(menuid)) + { + return DisableMenu(menuid); + } + return 0; + } + + #define _ALS_DisableMenu + #define DisableMenu FIXES_DisableMenu +#endif + +/* + * FIXES_DisableMenuRow(Menu:menuid, row) + * + * FIXES: + * DisableMenuRow + */ + +#if defined _ALS_DisableMenuRow + #error _ALS_DisableMenuRow defined +#endif +native BAD_DisableMenuRow(Menu:menuid, row) = DisableMenuRow; + +#if FIX_DisableMenuRow + stock FIXES_DisableMenuRow(Menu:menuid, row) + { + if (FIXES_IS_VALID_MENU(menuid)) + { + return DisableMenuRow(menuid, row); + } + return 0; + } + + #define _ALS_DisableMenuRow + #define DisableMenuRow FIXES_DisableMenuRow +#endif + +/* + * Menu:FIXES_GetPlayerMenu(playerid) + * + * FIXES: + * GetPlayerMenu + */ + +#if defined _ALS_GetPlayerMenu + #error _ALS_GetPlayerMenu defined +#endif +native BAD_GetPlayerMenu(playerid) = GetPlayerMenu; + +#if FIX_GetPlayerMenu + stock Menu:FIXES_GetPlayerMenu(playerid) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + return FIXES_gsCurrentMenu[playerid]; + } + return Menu:INVALID_MENU; + } + + #define _ALS_GetPlayerMenu + #define GetPlayerMenu FIXES_GetPlayerMenu +#endif + +/* + * OnPlayerStateChange(playerid, newstate, oldstate) + * + * FIXES: + * HydraSniper + * GetPlayerWeapon + * PutPlayerInVehicle + * TrainExit + */ + +#if FIX_HydraSniper || FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_OnPlayerEnterVehicle || FIX_TrainExit + public OnPlayerStateChange(playerid, newstate, oldstate) + { + #if !FIXES_Single + if (!(FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)) + { + return FIXES_OnPlayerStateChange(playerid, newstate, oldstate); + } + #endif + + // ============================= + // BEGIN: OnPlayerEnterVehicle + // ============================= + #if FIX_OnPlayerEnterVehicle + if (newstate == PLAYER_STATE_PASSENGER) + { + new + model = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400; + if (_FIXES_IN_RANGE(model, 0, 211 + 1)) + { + new + seat = GetPlayerVehicleSeat(playerid); + if (seat != 128) + { + model = (FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2)) & 0xF; + if (model == 0 || model == 15) + { + // Shouldn't be in this vehicle at all. + FIXES_BlockUpdate(playerid, true); + } + else if (!(0 < seat <= model)) // Slower with "_FIXES_NO_RANGE". + { + // In an out of range seat. + FIXES_BlockUpdate(playerid, true); + } + } + } + else + { + FIXES_BlockUpdate(playerid, true); + } + } + else if (newstate == PLAYER_STATE_DRIVER) + { + new + model = GetPlayerVehicleSeat(playerid); + if (model != 128) + { + if (model == 0) + { + model = GetVehicleModel(GetPlayerVehicleID(playerid)) - 400; + if (_FIXES_NO_RANGE(model, 0, 211 + 1) || FIXES_gscMaxPassengers[model >>> 3] >>> ((model & 7) << 2) & 0xF == 15) + { + // In an invalid vehicle (one you can't drive). + FIXES_BlockUpdate(playerid, true); + } + } + else + { + // They are a driver, but not in the driver's seat. + FIXES_BlockUpdate(playerid, true); + } + } + #if FIX_HydraSniper + else + { + model = GetVehicleModel(GetPlayerVehicleID(playerid)); + } + #endif + #if !FIX_HydraSniper + } + #endif + #endif + // ============================= + // END: OnPlayerEnterVehicle + // ============================= + + // ==================== + // BEGIN: HydraSniper + // ==================== + #if FIX_HydraSniper + #if !FIX_OnPlayerEnterVehicle + // Only called if the same check above isn't called. + if (newstate == PLAYER_STATE_DRIVER) + { + new + model = GetVehicleModel(GetPlayerVehicleID(playerid)); + #endif + if (GetPlayerWeapon(playerid) == 34 && (model == 520 || model == 425)) + { + SetPlayerArmedWeapon(playerid, 0); + #if FIX_GetPlayerWeapon + // This is the first cross-dependednt fix. + #if FIXES_Single + FIXES_gsPlayerWeapon[playerid] = 0; + #else + SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0); + #endif + #endif + } + } + #endif + // ==================== + // END: HydraSniper + // ==================== + + #if FIX_GetPlayerWeapon || FIX_PutPlayerInVehicle || FIX_TrainExit + #if PLAYER_STATE_PASSENGER != PLAYER_STATE_DRIVER + 1 + #error FIX_GetPlayerWeapon/FIX_PutPlayerInVehicle state assertation failed. + #endif + if (_FIXES_IN_RANGE(oldstate, PLAYER_STATE_DRIVER, PLAYER_STATE_PASSENGER + 1)) + { + #if FIX_PutPlayerInVehicle || FIX_TrainExit + new + e_FIXES_BOOLS:bools = FIXES_gsPlayerBools[playerid]; + #endif + + // ======================== + // BEGIN: GetPlayerWeapon + // ======================== + #if FIX_GetPlayerWeapon + #if FIXES_Single + FIXES_gsPlayerWeapon[playerid] = -1; + #else + SetPVarInt(playerid, FIXES_pvarPlayerWeapon, -1); + #endif + #endif + // ======================== + // END: GetPlayerWeapon + // ======================== + + // ================== + // BEGIN: TrainExit + // ================== + #if FIX_TrainExit + FIXES_PRINTF("train exit"); + if (bools & e_FIXES_BOOLS_PUT_IN_TRAIN) + { + FIXES_PRINTF("OK"); + SetCameraBehindPlayer(playerid), + bools &= ~e_FIXES_BOOLS_PUT_IN_TRAIN; + } + #endif + // ================== + // END: TrainExit + // ================== + + // =========================== + // BEGIN: PutPlayerInVehicle + // =========================== + #if FIX_PutPlayerInVehicle + // Update their vehicle once we KNOW the client has done the + // removal from the vehicle. + if (bools & e_FIXES_BOOLS_PUT_IN_VEHICLE) + { + new + vid = FIXES_gsVehicleSeatData[playerid] & 0x00FFFFFF; + // Limited to "only" 16777216 vehicles and 256 seats. + PutPlayerInVehicle(playerid, vid, FIXES_gsVehicleSeatData[playerid] >>> 24), + bools &= ~e_FIXES_BOOLS_PUT_IN_VEHICLE; + #if FIX_TrainExit + switch (GetVehicleModel(vid)) + { + case 449, 537, 538: + { + bools |= e_FIXES_BOOLS_PUT_IN_TRAIN; + } + } + #endif + } + #endif + // =========================== + // END: PutPlayerInVehicle + // =========================== + + #if FIX_PutPlayerInVehicle || FIX_TrainExit + FIXES_gsPlayerBools[playerid] = bools; + #endif + } + #endif + + return FIXES_OnPlayerStateChange(playerid, newstate, oldstate); + } + + #if defined _ALS_OnPlayerStateChange + #error _ALS_OnPlayerStateChange defined + #endif + #define _ALS_OnPlayerStateChange + #define OnPlayerStateChange(%0) FIXES_OnPlayerStateChange(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerStateChange(playerid, newstate, oldstate); +#endif + +/* + * FIXES_GivePlayerWeapon(playerid, weaponid, ammo) + * + * FIXES: + * HydraSniper + */ + +#if defined _ALS_GivePlayerWeapon + #error _ALS_GivePlayerWeapon defined +#endif +native BAD_GivePlayerWeapon(playerid, weaponid, ammo) = GivePlayerWeapon; + +#if FIX_HydraSniper + stock FIXES_GivePlayerWeapon(playerid, weaponid, ammo) + { + new + vid = GetPlayerVehicleID(playerid); + if (vid) + { + vid = GetVehicleModel(vid); + if (weaponid == 34 && (vid == 520 || vid == 425)) + { + vid = GivePlayerWeapon(playerid, weaponid, ammo), + SetPlayerArmedWeapon(playerid, 0); + #if FIX_GetPlayerWeapon + #if FIXES_Single + FIXES_gsPlayerWeapon[playerid] = 0; + #else + SetPVarInt(playerid, FIXES_pvarPlayerWeapon, 0); + #endif + #endif + return vid; + } + } + return GivePlayerWeapon(playerid, weaponid, ammo); + } + + #define _ALS_GivePlayerWeapon + #define GivePlayerWeapon FIXES_GivePlayerWeapon +#endif + +/* + * FIXES_SetPlayerArmedWeapon(playerid, weaponid) + * + * FIXES: + * GetPlayerWeapon + */ + +#if defined _ALS_SetPlayerArmedWeapon + #error _ALS_SetPlayerArmedWeapon defined +#endif +native BAD_SetPlayerArmedWeapon(playerid, weaponid) = SetPlayerArmedWeapon; + +#if FIX_GetPlayerWeapon + stock FIXES_SetPlayerArmedWeapon(playerid, weaponid) + { + #if FIX_AllowInteriorWeapons + if (FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR && GetPlayerInterior(playerid)) + { + // Not allowed weapons. + return 0; + } + #endif + new + vid = GetPlayerVehicleID(playerid); + if (vid) + { + #if FIX_HydraSniper + vid = GetVehicleModel(vid); + if (weaponid == 34 && (vid == 520 || vid == 425)) + { + return 0; + } + #endif + //FIXES_gsPlayerWeapon[playerid] = weaponid; + #if FIXES_Single + FIXES_gsPlayerWeapon[playerid] = weaponid; + #else + SetPVarInt(playerid, FIXES_pvarPlayerWeapon, weaponid); + #endif + } + return SetPlayerArmedWeapon(playerid, weaponid); + } + + #define _ALS_SetPlayerArmedWeapon + #define SetPlayerArmedWeapon FIXES_SetPlayerArmedWeapon +#endif + +/* + * FIXES_GetPlayerWeapon(playerid) + * + * FIXES: + * GetPlayerWeapon + */ + +#if defined _ALS_GetPlayerWeapon + #error _ALS_GetPlayerWeapon defined +#endif +native BAD_GetPlayerWeapon(playerid) = GetPlayerWeapon; + +#if FIX_GetPlayerWeapon + stock FIXES_GetPlayerWeapon(playerid) + { + #if FIXES_Single + new + ret = FIXES_gsPlayerWeapon[playerid]; + #else + new + ret = GetPVarInt(playerid, FIXES_pvarPlayerWeapon); + #endif + if (ret == -1) + { + return GetPlayerWeapon(playerid); + } + return ret; + } + + #define _ALS_GetPlayerWeapon + #define GetPlayerWeapon FIXES_GetPlayerWeapon +#endif + +/* + * FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid) + * + * FIXES: + * PutPlayerInVehicle + */ + +#if defined _ALS_PutPlayerInVehicle + #error _ALS_PutPlayerInVehicle defined +#endif +native BAD_PutPlayerInVehicle(playerid, vehicleid, seatid) = PutPlayerInVehicle; + +#if FIX_PutPlayerInVehicle || FIX_TrainExit + #if FIXES_Single + stock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid) + { + // ================== + // BEGIN: TrainExit + // ================== + #if FIX_TrainExit + FIXES_PRINTF("TrainExit %d", GetVehicleModel(vehicleid)); + switch (GetVehicleModel(vehicleid)) + { + case 449, 537, 538: + { + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN; + } + } + #endif + // ================== + // END: TrainExit + // ================== + + // =========================== + // BEGIN: PutPlayerInVehicle + // =========================== + #if FIX_PutPlayerInVehicle + new + vid = GetPlayerVehicleID(playerid); + if (vid) + { + new + Float:x, + Float:y, + Float:z; + // Remove them without the animation. + return + GetVehiclePos(vid, x, y, z), + SetPlayerPos(playerid, x, y, z), + FIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid, + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE, + 1; + } + #endif + // =========================== + // END: PutPlayerInVehicle + // =========================== + return PutPlayerInVehicle(playerid, vehicleid, seatid); + } + #else + forward _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data); + + stock FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid) + { + FIXES_PRINTF("NOT SINGLE"); + // =========================== + // BEGIN: PutPlayerInVehicle + // =========================== + #if FIX_PutPlayerInVehicle + new + vid = GetPlayerVehicleID(playerid); + if (vid) + { + new + Float:x, + Float:y, + Float:z; + // Remove them without the animation. + return + GetVehiclePos(vid, x, y, z), + SetPlayerPos(playerid, x, y, z), + CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 1, vid), + 1; + } + #endif + // =========================== + // END: PutPlayerInVehicle + // =========================== + + // ================== + // BEGIN: TrainExit + // ================== + #if FIX_TrainExit + new + model = GetVehicleModel(vehicleid); + switch (model) + { + case 449, 537, 538: + { + CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iiiii, playerid, vehicleid, seatid, 0, model); + //FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN; + } + } + #endif + // ================== + // END: TrainExit + // ================== + return PutPlayerInVehicle(playerid, vehicleid, seatid); + } + + public _FIXES_PutPlayerInVehicle(playerid, vehicleid, seatid, from, data) + { + FIXES_PRINTF("IN CHARGE: %d", (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE)); + _FIXES_IS_IN_CHARGE() + { + // =========================== + // BEGIN: PutPlayerInVehicle + // =========================== + #if FIX_PutPlayerInVehicle + if (from) + { + FIXES_gsVehicleSeatData[playerid] = seatid << 24 | vehicleid, + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_VEHICLE; + } + #endif + // =========================== + // END: PutPlayerInVehicle + // =========================== + + // ================== + // BEGIN: TrainExit + // ================== + #if FIX_TrainExit + #if FIX_PutPlayerInVehicle + else + #else + if (!from) + #endif + { + switch (data) + { + case 449, 537, 538: + { + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_PUT_IN_TRAIN; + } + } + } + #endif + // ================== + // END: TrainExit + // ================== + } + return 1; + } + #endif + + #define _ALS_PutPlayerInVehicle + #define PutPlayerInVehicle FIXES_PutPlayerInVehicle +#endif + +/* + * _FIXES_SetCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) + * + * FIXES: + * SetPlayerCheckpoint + */ + +#if FIX_SetPlayerCheckpoint + forward _FIXES_SetCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size); + + public _FIXES_SetCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) + { + #if FIXES_Single + if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_CP_DELAYED) + #else + if (GetPVarInt(playerid, FIXES_pvarPlayerCheckpoint)) + #endif + { + return + #if FIXES_Single + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_CP_DELAYED, + #else + DeletePVar(playerid, FIXES_pvarPlayerCheckpoint), + #endif + SetPlayerCheckpoint(playerid, x, y, z, size); + } + return 0; + } +#endif + +/* + * FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) + * + * FIXES: + * SetPlayerCheckpoint + */ + +#if defined _ALS_SetPlayerCheckpoint + #error _ALS_SetPlayerCheckpoint defined +#endif +native BAD_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) = SetPlayerCheckpoint; + +#if FIX_SetPlayerCheckpoint + stock FIXES_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size) + { + return + #if FIXES_Single + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_CP_DELAYED, + #else + SetPVarInt(playerid, FIXES_pvarPlayerCheckpoint, 1), + #endif + DisablePlayerCheckpoint(playerid), + SetTimerEx(FIXES_gscSetCheckpoint, 50, 0, FIXES_gscSpec@iffff, playerid, x, y, z, size), + 1; + } + + #define _ALS_SetPlayerCheckpoint + #define SetPlayerCheckpoint FIXES_SetPlayerCheckpoint +#endif + +/* + * FIXES_DisablePlayerCheckpoint(playerid) + * + * FIXES: + * SetPlayerCheckpoint + */ + +#if defined _ALS_DisablePlayerCheckpoint + #error _ALS_DisablePlayerCheckpoint defined +#endif +native BAD_DisablePlayerCheckpoint(playerid) = DisablePlayerCheckpoint; + +#if FIX_SetPlayerCheckpoint + stock FIXES_DisablePlayerCheckpoint(playerid) + { + return + #if FIXES_Single + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_CP_DELAYED, + #else + DeletePVar(playerid, FIXES_pvarPlayerCheckpoint), + #endif + DisablePlayerCheckpoint(playerid); + } + + #define _ALS_DisablePlayerCheckpoint + #define DisablePlayerCheckpoint FIXES_DisablePlayerCheckpoint +#endif + +/* + * _FIXES_SetRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) + * + * FIXES: + * SetPlayerRaceCheckpoint + */ + +#if FIX_SetPlayerRaceCheckpoint + forward _FIXES_SetRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size); + + public _FIXES_SetRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) + { + #if FIXES_Single + if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_RACE_CP_DELAYED) + #else + if (GetPVarInt(playerid, FIXES_pvarPlayerRaceCheckpoint)) + #endif + { + return + #if FIXES_Single + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_RACE_CP_DELAYED, + #else + DeletePVar(playerid, FIXES_pvarPlayerRaceCheckpoint), + #endif + SetPlayerRaceCheckpoint(playerid, type, x, y, z, nextx, nexty, nextz, size); + } + return 0; + } +#endif + +/* + * FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) + * + * FIXES: + * SetPlayerRaceCheckpoint + */ + +#if defined _ALS_SetPlayerRaceCheckpoint + #error _ALS_SetPlayerRaceCheckpoint defined +#endif +native BAD_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) = SetPlayerRaceCheckpoint; + +#if FIX_SetPlayerRaceCheckpoint + stock FIXES_SetPlayerRaceCheckpoint(playerid, type, Float:x, Float:y, Float:z, Float:nextx, Float:nexty, Float:nextz, Float:size) + { + return + #if FIXES_Single + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_RACE_CP_DELAYED, + #else + SetPVarInt(playerid, FIXES_pvarPlayerRaceCheckpoint, 1), + #endif + DisablePlayerRaceCheckpoint(playerid), + SetTimerEx(FIXES_gscSetRaceCheckpoint, 50, 0, FIXES_gscSpec@iifffffff, playerid, type, x, y, z, nextx, nexty, nextz, size), + 1; + } + + #define _ALS_SetPlayerRaceCheckpoint + #define SetPlayerRaceCheckpoint FIXES_SetPlayerRaceCheckpoint +#endif + +/* + * FIXES_DisablePlayerRaceCheckpoint(playerid) + * + * FIXES: + * SetPlayerRaceCheckpoint + */ + +#if defined _ALS_DisablePlayerRaceCP + #error _ALS_DisablePlayerRaceCP defined +#endif +native BAD_DisablePlayerRaceCheckpoint(playerid) = DisablePlayerRaceCheckpoint; + +#if FIX_SetPlayerRaceCheckpoint + stock FIXES_DisablePlayerRaceCP(playerid) + { + return + #if FIXES_Single + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_RACE_CP_DELAYED, + #else + DeletePVar(playerid, FIXES_pvarPlayerRaceCheckpoint), + #endif + DisablePlayerRaceCheckpoint(playerid); + } + + #define _ALS_DisablePlayerRaceCP + #define DisablePlayerRaceCheckpoint FIXES_DisablePlayerRaceCP +#endif + +/* + * _FIXES_HideGameTextForPlayer(playerid, style, parr[]) + * + * Hides a GameText style for one or more players, and accounts for the fact + * that they may have different messages being shown. + * + * FIXES: + * GameText + */ + +#if FIX_GameText + static stock _FIXES_HideGameTextForPlayer(playerid, style, parr[]) + { + switch (playerid) + { + case MAX_PLAYERS: + { + // Remove the global GameText for everyone that can see it. + TextDrawHideForAll(FIXES_gsGTStyle[style]); + } + case INVALID_PLAYER_ID: + { + // Hide any player-local ones. This is similar to "foreach". + playerid = parr[MAX_PLAYERS], + parr[MAX_PLAYERS] = MAX_PLAYERS; + for (new next; playerid != MAX_PLAYERS; playerid = next) + { + PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]), + next = parr[playerid], + parr[playerid] = 0; + } + } + default: + { + // Remove. + PlayerTextDrawHide(playerid, FIXES_gsPGTStyle[playerid][style]), + _FIXES_RemoveInternal(parr, playerid, MAX_PLAYERS); + } + } + } +#endif + +/* + * _FIXES_HideGameTextTimer(playerid, style) + * + * FIXES: + * GameText + */ + +#if FIX_GameText + forward _FIXES_HideGameTextTimer(playerid, style); + + public _FIXES_HideGameTextTimer(playerid, style) + { + if (GetTickCount() >= FIXES_gsGTTimer[style][playerid]) + { + // Only hide it if it hasn't been re-shown in the interim. + _FIXES_HideGameTextForPlayer(playerid, style, FIXES_gsPlayerPGTShown[style]); + } + } +#endif + +/* + * _FIXES_GameTextShow(playerid, string[], time, style) + * + * FIXES: + * GameText + */ + +#if FIX_GameText + forward _FIXES_GameTextShow(playerid, string[], time, style); + + public _FIXES_GameTextShow(playerid, string[], time, style) + { + _FIXES_IS_IN_CHARGE() + { + if (playerid == MAX_PLAYERS) + { + _FIXES_HideGameTextForPlayer(INVALID_PLAYER_ID, style, FIXES_gsPlayerPGTShown[style]), + TextDrawSetString(FIXES_gsGTStyle[style], string), + TextDrawShowForAll(FIXES_gsGTStyle[style]); + } + else + { + TextDrawHideForPlayer(playerid, FIXES_gsGTStyle[style]), + PlayerTextDrawSetString(playerid, FIXES_gsPGTStyle[playerid][style], string), + PlayerTextDrawShow(playerid, FIXES_gsPGTStyle[playerid][style]), + _FIXES_AddInternal(FIXES_gsPlayerPGTShown[style], playerid, MAX_PLAYERS); + } + if (time) + { + // Tiny offset because timers are inaccurate. + FIXES_gsGTTimer[style][playerid] = GetTickCount() + time - 10, + // Don't need to save the timer's ID. + SetTimerEx(FIXES_gscHideGameTextTimer, time, false, FIXES_gscSpec@ii, playerid, style); + } + } + return 1; + } +#endif + +/* + * FIXES_GameTextForAll(string[], time, style) + * + * FIXES: + * GameText + */ + +#if defined _ALS_GameTextForAll + #error _ALS_GameTextForAll defined +#endif +native BAD_GameTextForAll(const string[], time, style) = GameTextForAll; + +#if FIX_GameText + stock FIXES_GameTextForAll(string[], time, style) + { + if (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT)) + { + if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0')) + { + #if FIXES_Single + return _FIXES_GameTextShow(MAX_PLAYERS, FIXES_gscSpace, time, style); + #else + return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, FIXES_gscSpace, time, style); + #endif + } + else + { + #if FIXES_Single + return _FIXES_GameTextShow(MAX_PLAYERS, string, time, style); + #else + return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, MAX_PLAYERS, string, time, style); + #endif + } + } + return 0; + } + + #define _ALS_GameTextForAll + + #define GameTextForAll FIXES_GameTextForAll +#endif + +/* + * FIXES_GameTextForPlayer(playerid, string[], time, style) + * + * FIXES: + * GameText + */ + +#if defined _ALS_GameTextForPlayer + #error _ALS_GameTextForPlayer defined +#endif +native BAD_GameTextForPlayer(playerid, const string[], time, style) = GameTextForPlayer; + +#if FIX_GameText + stock FIXES_GameTextForPlayer(playerid, string[], time, style) + { + if (_FIXES_IN_RANGE(style, 0, FIXES_GT_STYLE_COUNT) && _FIXES_IS_PLAYER_CONNECTED(playerid)) + { + if ((string[0] <= '\0') || (string[0] == '\1' && string[1] == '\0')) + { + #if FIXES_Single + return _FIXES_GameTextShow(playerid, FIXES_gscSpace, time, style); + #else + return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, FIXES_gscSpace, time, style); + #endif + } + else + { + #if FIXES_Single + return _FIXES_GameTextShow(playerid, string, time, style); + #else + return CallRemoteFunction(FIXES_gscGameTextShow, FIXES_gscSpec@isii, playerid, string, time, style); + #endif + } + } + return 0; + } + + #define _ALS_GameTextForPlayer + + #define GameTextForPlayer FIXES_GameTextForPlayer +#endif + +/* + * HideGameTextForAll(style) + * + * FIXES: + * HideGameText + */ + +#if defined _ALS_HideGameTextForAll + #error _ALS_HideGameTextForAll defined +#endif +native BAD_HideGameTextForAll(style) = HideGameTextForAll; + +#if FIX_HideGameText + #define _ALS_HideGameTextForAll + + #define HideGameTextForAll(%0) GameTextForAll(FIXES_gscSpace, 0, (%0)) +#endif + +/* + * HideGameTextForPlayer(playerid, style) + * + * FIXES: + * HideGameText + */ + +#if defined _ALS_HideGameTextForPlayer + #error _ALS_HideGameTextForPlayer defined +#endif +native BAD_HideGameTextForPlayer(playerid, style) = HideGameTextForPlayer; + +#if FIX_HideGameText + #define _ALS_HideGameTextForPlayer + + #define HideGameTextForPlayer(%1,%0) GameTextForPlayer((%1), FIXES_gscSpace, 0, (%0)) +#endif + +/* + * PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[]) + * + * FIXES: + * CreatePlayerTextDraw + */ + +#if defined _ALS_CreatePlayerTextDraw + #error _ALS_CreatePlayerTextDraw defined +#endif +native Text:BAD_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[]) = CreatePlayerTextDraw; + +#if FIX_CreatePlayerTextDraw + stock PlayerText:FIXES_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[]) + { + if ((text[0] == '\0') || (text[0] == '\1' && text[1] == '\0')) + { + return CreatePlayerTextDraw(playerid, x, y, FIXES_gscSpace); + } + else + { + return CreatePlayerTextDraw(playerid, x, y, text); + } + } + + #define _ALS_CreatePlayerTextDraw + #define CreatePlayerTextDraw FIXES_CreatePlayerTextDraw +#endif + +/* + * FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[]) + * + * FIXES: + * PlayerTextDrawSetString + */ + +#if defined _ALS_PlayerTextDrawSetString + #error _ALS_PlayerTextDrawSetString defined +#endif +native BAD_PlayerTextDrawSetString(playerid, PlayerText:text, string[]) = PlayerTextDrawSetString; + +#if FIX_PlayerTextDrawSetString + stock FIXES_PlayerTextDrawSetString(playerid, PlayerText:text, string[]) + { + if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0')) + { + return PlayerTextDrawSetString(playerid, text, FIXES_gscSpace); + } + else + { + return PlayerTextDrawSetString(playerid, text, string); + } + } + + #define _ALS_PlayerTextDrawSetString + #define PlayerTextDrawSetString FIXES_PlayerTextDrawSetString +#endif + +/* + * Text:FIXES_TextDrawCreate(Float:x, Float:y, text[]) + * + * FIXES: + * TextDrawCreate + */ + + #if defined _ALS_TextDrawCreate + #error _ALS_TextDrawCreate defined +native Text:BAD_TextDrawCreate(Float:x, Float:y, text[]) = TextDrawCreate; + +#if FIX_TextDrawCreate + stock Text:FIXES_TextDrawCreate(Float:x, Float:y, text[]) + { + if ((text[0] == '\0') || (text[0] == '\1' && text[1] == '\0')) + { + return TextDrawCreate(x, y, FIXES_gscSpace); + } + else + { + return TextDrawCreate(x, y, text); + } + } + + #endif + #define _ALS_TextDrawCreate + #define TextDrawCreate FIXES_TextDrawCreate +#endif + +/* + * FIXES_TextDrawSetString(Text:text, string[]) + * + * FIXES: + * TextDrawSetString + */ + +#if defined _ALS_TextDrawSetString + #error _ALS_TextDrawSetString defined +#endif +native BAD_TextDrawSetString(Text:text, string[]) = TextDrawSetString; + +#if FIX_TextDrawSetString + stock FIXES_TextDrawSetString(Text:text, string[]) + { + if ((string[0] == '\0') || (string[0] == '\1' && string[1] == '\0')) + { + return TextDrawSetString(text, FIXES_gscSpace); + } + else + { + return TextDrawSetString(text, string); + } + } + + #define _ALS_TextDrawSetString + #define TextDrawSetString FIXES_TextDrawSetString +#endif + +/* + * FIXES_AllowInteriorWeapons(allow) + * + * FIXES: + * AllowInteriorWeapons + */ + +#if defined _ALS_AllowInteriorWeapons + #error _ALS_AllowInteriorWeapons defined +#endif +native BAD_AllowInteriorWeapons(allow) = AllowInteriorWeapons; + +#if FIX_AllowInteriorWeapons + #if FIXES_Single + stock FIXES_AllowInteriorWeapons(allow) + { + if (allow) + { + FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR; + _FIXES_FOREACH(FIXES_gsPlayersIterator, i) + { + FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR; + } + } + else + { + FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR; + _FIXES_FOREACH(FIXES_gsPlayersIterator, i) + { + if (GetPlayerInterior(i)) + { + FIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR; + } + } + } + return allow; + } + #else + forward _FIXES_AllowInteriorWeapons(allow); + + stock FIXES_AllowInteriorWeapons(allow) + { + CallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, allow); + return allow; + } + + public _FIXES_AllowInteriorWeapons(allow) + { + if (allow) + { + FIXES_gsSettings &= ~e_FIXES_SETTINGS_INTERIOR; + _FIXES_FOREACH(FIXES_gsPlayersIterator, i) + { + FIXES_gsPlayerBools[i] &= ~e_FIXES_BOOLS_INTERIOR; + } + } + else + { + FIXES_gsSettings |= e_FIXES_SETTINGS_INTERIOR; + _FIXES_FOREACH(FIXES_gsPlayersIterator, i) + { + if (GetPlayerInterior(i)) + { + FIXES_gsPlayerBools[i] |= e_FIXES_BOOLS_INTERIOR; + } + } + } + return allow; + } + #endif + + #define _ALS_AllowInteriorWeapons + #define AllowInteriorWeapons FIXES_AllowInteriorWeapons +#endif + +/* + * FIXES_GetPlayerInterior(playerid) + * + * FIXES: + * GetPlayerInterior + */ + +#if defined _ALS_GetPlayerInterior + #error _ALS_GetPlayerInterior defined +#endif +native BAD_GetPlayerInterior(playerid) = GetPlayerInterior; + +#if FIX_GetPlayerInterior + stock FIXES_GetPlayerInterior(playerid) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + #if FIXES_Single + return FIXES_gsInterior[playerid]; + #else + return GetPVarInt(playerid, FIXES_pvarPlayerInterior); + #endif + } + return 0; + } + + #define _ALS_GetPlayerInterior + #define GetPlayerInterior FIXES_GetPlayerInterior +#endif + +/* + * FIXES_SetPlayerInterior(playerid, interiorid) + * + * FIXES: + * GetPlayerInterior + */ + +#if defined _ALS_SetPlayerInterior + #error _ALS_SetPlayerInterior defined +#endif +native BAD_SetPlayerInterior(playerid, interiorid) = SetPlayerInterior; + +#if FIX_GetPlayerInterior + stock FIXES_SetPlayerInterior(playerid, interiorid) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + #if FIXES_Single + FIXES_gsInterior[playerid] = interiorid; + #else + SetPVarInt(playerid, FIXES_pvarPlayerInterior, interiorid); + #endif + return SetPlayerInterior(playerid, interiorid); + } + return 0; + } + + #define _ALS_SetPlayerInterior + #define SetPlayerInterior FIXES_SetPlayerInterior +#endif + +/* + * OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ) + * + * FIXES: + * AllowTeleport + */ + +#if FIX_AllowTeleport && !defined FILTERSCRIPT + forward _FIXES_AllowTeleport(playerid, allow); + + public OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ) + { + // ====================== + // BEGIN: AllowTeleport + // ====================== + #if FIX_AllowTeleport + if (!_FIXES_gIsFilterscript) + { + // Unusually, the call order here is always Game Mode first - + // most callbacks are Filter Script first. + if ((FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_TELEPORT) || ((FIXES_gsSettings & e_FIXES_SETTINGS_ADMIN_TELEPORT) && (IsPlayerAdmin(playerid)))) + { + SetPlayerPosFindZ(playerid, fX, fY, fZ); + } + } + #endif + // ====================== + // END: AllowTeleport + // ====================== + return FIXES_OnPlayerClickMap(playerid, fX, fY, fZ); + } + + #if defined _ALS_OnPlayerClickMap + #error _ALS_OnPlayerClickMap defined + #endif + #define _ALS_OnPlayerClickMap + #define OnPlayerClickMap(%0) FIXES_OnPlayerClickMap(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnPlayerClickMap(playerid, Float:fX, Float:fY, Float:fZ); +#endif + +/* + * FIXES_AllowPlayerTeleport(playerid, allow) + * + * FIXES: + * AllowTeleport + */ + +#if defined _ALS_AllowPlayerTeleport + #error _ALS_AllowPlayerTeleport defined +#endif +native BAD_AllowPlayerTeleport(playerid, allow) = AllowPlayerTeleport; + +#if FIX_AllowTeleport + #if FIXES_Single + stock FIXES_AllowPlayerTeleport(playerid, allow) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + if (allow) + { + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT; + } + else + { + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT; + } + } + return 0; + } + #else + stock FIXES_AllowPlayerTeleport(playerid, allow) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, playerid, allow); + } + return 0; + } + #endif + + #define _ALS_AllowPlayerTeleport + #define AllowPlayerTeleport FIXES_AllowPlayerTeleport +#endif + +/* + * FIXES_AllowAdminTeleport(allow) + * + * FIXES: + * AllowTeleport + */ + +#if defined _ALS_AllowAdminTeleport + #error _ALS_AllowAdminTeleport defined +#endif +native BAD_AllowAdminTeleport(allow) = AllowAdminTeleport; + +#if FIX_AllowTeleport + #if FIXES_Single + stock FIXES_AllowAdminTeleport(allow) + { + if (allow) + { + FIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT; + } + else + { + FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT; + } + return allow; + } + #else + stock FIXES_AllowAdminTeleport(allow) + { + return + CallRemoteFunction(FIXES_gscAllowTeleport, FIXES_gscSpec@ii, INVALID_PLAYER_ID, allow), + allow; + } + #endif + + #define _ALS_AllowAdminTeleport + #define AllowAdminTeleport FIXES_AllowAdminTeleport +#endif + +/* + * FIXES_AllowAdminTeleport(allow) + * + * FIXES: + * AllowTeleport + */ + +#if FIX_AllowTeleport && !defined FILTERSCRIPT && !FIXES_Single + public _FIXES_AllowTeleport(playerid, allow) + { + if (!_FIXES_gIsFilterscript) + { + if (playerid == INVALID_PLAYER_ID) + { + if (allow) + { + FIXES_gsSettings |= e_FIXES_SETTINGS_ADMIN_TELEPORT; + } + else + { + FIXES_gsSettings &= ~e_FIXES_SETTINGS_ADMIN_TELEPORT; + } + } + else + { + if (allow) + { + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_TELEPORT; + } + else + { + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_TELEPORT; + } + } + } + } +#endif + +/* + * FIXES_SetPlayerSpecialAction(playerid, actionid) + * + * FIXES: + * SetPlayerSpecialAction + */ + +#if defined _ALS_SetPlayerSpecialAction + #error _ALS_SetPlayerSpecialAction defined +#endif +native BAD_SetPlayerSpecialAction(playerid, actionid) = SetPlayerSpecialAction; + +#if FIX_SetPlayerSpecialAction + stock FIXES_SetPlayerSpecialAction(playerid, actionid) + { + if (GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK) + { + ClearAnimations(playerid); + } + SetPlayerSpecialAction(playerid, actionid); + return 1; + } + + #define _ALS_SetPlayerSpecialAction + #define SetPlayerSpecialAction FIXES_SetPlayerSpecialAction +#endif + +/* + * FIXES_ClearAnimations(playerid, forcesync = 0) + * + * FIXES: + * ClearAnimations + */ + +#if defined _ALS_ClearAnimations + #error _ALS_ClearAnimations defined +#endif +native BAD_ClearAnimations(playerid, forcesync = 0) = ClearAnimations; + +#if FIX_ClearAnimations || FIX_ClearAnimations_2 + stock FIXES_ClearAnimations(playerid, forcesync = 0) + { + #if FIX_ClearAnimations || FIX_ClearAnimations_2 + if (IsPlayerInAnyVehicle(playerid)) + #endif + #if FIX_ClearAnimations + { + return ApplyAnimation(playerid, "PED", "CAR_SIT", 4.0, 0, 0, 0, 0, 1, forcesync); + } + #endif + #if FIX_ClearAnimations + FIX_ClearAnimations_2 == 1 // XOR + { + return ClearAnimations(playerid, forcesync); + } + #endif + #if FIX_ClearAnimations_2 + new + ret = ClearAnimations(playerid, forcesync); + ApplyAnimation(playerid, "PED", "IDLE_STANCE", 4.0, 0, 0, 0, 0, 1, forcesync); + ApplyAnimation(playerid, "PED", "IDLE_CHAT", 4.0, 0, 0, 0, 0, 1, forcesync); + ApplyAnimation(playerid, "PED", "WALK_PLAYER", 4.0, 0, 0, 0, 0, 1, forcesync); + return ret; + #endif + } + + #define _ALS_ClearAnimations + #define ClearAnimations FIXES_ClearAnimations +#endif + +/* + * FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy) + * + * FIXES: + * GangZoneCreate + */ + +#if defined _ALS_GangZoneCreate + #error _ALS_GangZoneCreate defined +#endif +native BAD_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy) = GangZoneCreate; + +#if FIX_GangZoneCreate + stock FIXES_GangZoneCreate(Float:minx, Float:miny, Float:maxx, Float:maxy) + { + return GangZoneCreate(floatsub(minx, floatfract(minx)), floatsub(miny, floatfract(miny)), floatsub(maxx, floatfract(maxx)), floatsub(maxy, floatfract(maxy))); + } + + #define _ALS_GangZoneCreate + #define GangZoneCreate FIXES_GangZoneCreate +#endif + +/* + * FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) + * + * FIXES: + * OnDialogResponse + * GetPlayerDialog + */ + +#if defined _ALS_ShowPlayerDialog + #error _ALS_ShowPlayerDialog defined +#endif +native BAD_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) = ShowPlayerDialog; + +#if FIX_OnDialogResponse || FIX_GetPlayerDialog + stock FIXES_ShowPlayerDialog(playerid, dialog, style, title[], caption[], button1[], button2[]) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + #if FIXES_Single + FIXES_gsDialogID[playerid] = dialog; + #else + SetPVarInt(playerid, FIXES_pvarPlayerDialog, dialog); + #endif + return ShowPlayerDialog(playerid, dialog, style, title, caption, button1, button2); + } + return 0; + } + + #define _ALS_ShowPlayerDialog + #define ShowPlayerDialog FIXES_ShowPlayerDialog +#endif + +/* + * OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) + * + * FIXES: + * OnDialogResponse + * GetPlayerDialog + */ + +#if FIX_OnDialogResponse || FIX_GetPlayerDialog + public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) + { + // ========================= + // BEGIN: OnDialogResponse + // ========================= + #if FIX_OnDialogResponse || FIX_GetPlayerDialog + #if FIXES_Single + #if FIX_OnDialogResponse + dialogid = FIXES_gsDialogID[playerid]; + #endif + FIXES_gsDialogID[playerid] = INVALID_DIALOG_ID; + #elseif FIX_OnDialogResponse + _FIXES_IS_IN_CHARGE() + { + // If there are multiple scripts, we can't just wipe the + // current dialog data or subsequent scripts will display + // the wrong value. + dialogid = GetPVarInt(playerid, FIXES_pvarPlayerDialog), + SetPVarInt(playerid, FIXES_pvarCurrentDialog, dialogid), + SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID); + } + else + { + dialogid = GetPVarInt(playerid, FIXES_pvarCurrentDialog); + } + #else + SetPVarInt(playerid, FIXES_pvarPlayerDialog, INVALID_DIALOG_ID); + #endif + if (inputtext[0]) + { + return FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext); + } + else + { + return FIXES_OnDialogResponse(playerid, dialogid, response, listitem, FIXES_gscNULL); + } + #endif + // ========================= + // END: OnDialogResponse + // ========================= + } + + #if defined _ALS_OnDialogResponse + #error _ALS_OnDialogResponse defined + #endif + #define _ALS_OnDialogResponse + #define OnDialogResponse(%0) FIXES_OnDialogResponse(%0) <_ALS : _ALS_go> + + _FIXES_FORWARD FIXES_OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]); +#endif + +/* + * FIXES_GetPlayerDialog(playerid) + * + * FIXES: + * GetPlayerDialog + */ + +#if defined _ALS_GetPlayerDialog + #error _ALS_GetPlayerDialog defined +#endif +native BAD_GetPlayerDialog(playerid) = GetPlayerDialog; + +#if FIX_GetPlayerDialog + stock FIXES_GetPlayerDialog(playerid) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + #if FIXES_Single + return FIXES_gsDialogID[playerid]; + #else + return GetPVarInt(playerid, FIXES_pvarPlayerDialog); + #endif + } + return -1; + } + + #define _ALS_GetPlayerDialog + #define GetPlayerDialog FIXES_GetPlayerDialog +#endif + +/* + * FIXES_valstr(dest[], value, bool:pack = false) + * + * FIXES: + * valstr + */ + +#if defined _ALS_valstr + #error _ALS_valstr defined +#endif +native BAD_valstr(dest[], value, bool:pack = false) = valstr; + +#if FIX_valstr + stock FIXES_valstr(dest[], value, bool:pack = false) + { + // "format" can't handle cellmin properly. + static const + sc_szCellmin[] = !"-2147483648"; + if (value == cellmin) + { + pack && strpack(dest, sc_szCellmin, 12) || strunpack(dest, sc_szCellmin, 12); + } + else + { + format(dest, 12, "%d", value), + pack && strpack(dest, dest, 12); + } + return 0; + } + + #define _ALS_valstr + #define valstr FIXES_valstr +#endif + +/* + * FIXES_fclose(File:handle) + * + * FIXES: + * fclose + */ + +#if defined _ALS_fclose + #error _ALS_fclose defined +#endif +native BAD_fclose(File:handle) = fclose; + +#if FIX_fclose + stock bool:FIXES_fclose(File:handle) + { + return handle && fclose(handle); + } + + #define _ALS_fclose + #define fclose FIXES_fclose +#endif + +/* + * FIXES_fwrite(File:handle, const string[]) + * + * FIXES: + * fwrite + */ + +#if defined _ALS_fwrite + #error _ALS_fwrite defined +#endif +native BAD_fwrite(File:handle, const string[]) = fwrite; + +#if FIX_fwrite + stock FIXES_fwrite(File:handle, const string[]) + { + return handle && fwrite(handle, string); + } + + #define _ALS_fwrite + #define fwrite FIXES_fwrite +#endif + +/* + * FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false) + * + * FIXES: + * fread + */ + +#if defined _ALS_fread + #error _ALS_fread defined +#endif +native BAD_fread(File:handle, string[], size = sizeof (string), bool:pack = false) = fread; + +#if FIX_fread + stock FIXES_fread(File:handle, string[], size = sizeof (string), bool:pack = false) + { + return handle && fread(handle, string, size, pack); + } + + #define _ALS_fread + #define fread FIXES_fread +#endif + +/* + * FIXES_fputchar(File:handle, value, bool:utf8 = true) + * + * FIXES: + * fputchar + */ + +#if defined _ALS_fputchar + #error _ALS_fputchar defined +#endif +native BAD_fputchar(File:handle, value, bool:utf8 = true) = fputchar; + +#if FIX_fputchar + stock bool:FIXES_fputchar(File:handle, value, bool:utf8 = true) + { + return handle && fputchar(handle, value, utf8); + } + + #define _ALS_fputchar + #define fputchar FIXES_fputchar +#endif + +/* + * FIXES_fgetchar(File:handle, value, bool:utf8 = true) + * + * FIXES: + * fgetchar + */ + +#if defined _ALS_fgetchar + #error _ALS_fgetchar defined +#endif +native BAD_fgetchar(File:handle, value, bool:utf8 = true) = fgetchar; + +#if FIX_fgetchar + stock FIXES_fgetchar(File:handle, value, bool:utf8 = true) + { + return handle && fgetchar(handle, value, utf8); + } + + #define _ALS_fgetchar + #define fgetchar FIXES_fgetchar +#endif + +/* + * FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) + * + * FIXES: + * fblockwrite + */ + +#if defined _ALS_fblockwrite + #error _ALS_fblockwrite defined +#endif +native BAD_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) = fblockwrite; + +#if FIX_fblockwrite + stock FIXES_fblockwrite(File:handle, const buffer[], size = sizeof (buffer)) + { + return handle && fblockwrite(handle, buffer, size); + } + + #define _ALS_fblockwrite + #define fblockwrite FIXES_fblockwrite +#endif + +/* + * FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer)) + * + * FIXES: + * fblockread + */ + +#if defined _ALS_fblockread + #error _ALS_fblockread defined +#endif +native BAD_fblockread(File:handle, buffer[], size = sizeof (buffer)) = fblockread; + +#if FIX_fblockread + stock FIXES_fblockread(File:handle, buffer[], size = sizeof (buffer)) + { + return handle && fblockread(handle, buffer, size); + } + + #define _ALS_fblockread + #define fblockread FIXES_fblockread +#endif + +/* + * FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start) + * + * FIXES: + * fseek + */ + +#if defined _ALS_fseek + #error _ALS_fseek defined +#endif +native BAD_fseek(File:handle, position = 0, seek_whence:whence = seek_start) = fseek; + +#if FIX_fseek + stock FIXES_fseek(File:handle, position = 0, seek_whence:whence = seek_start) + { + return handle && fseek(handle, position, whence); + } + + #define _ALS_fseek + #define fseek FIXES_fseek +#endif + +/* + * FIXES_flength(File:handle) + * + * FIXES: + * flength + */ + +#if defined _ALS_flength + #error _ALS_flength defined +#endif +native BAD_flength(File:handle) = flength; + +#if FIX_flength + stock FIXES_flength(File:handle) + { + return handle && flength(handle); + } + + #define _ALS_flength + #define flength FIXES_flength +#endif + +/* + * FIXES_Kick(playerid) + * + * FIXES: + * Kick + */ + +#if defined _ALS_Kick + #error _ALS_Kick defined +#endif +native BAD_Kick(playerid) = Kick; + +#if FIX_Kick + forward _FIXES_Kick(playerid); + + public _FIXES_Kick(playerid) + { + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_KICKED, + Kick(playerid); + } + + #if !FIXES_Single + forward @FIXES_Kick(playerid); + + public @FIXES_Kick(playerid) + { + FIXES_BlockUpdate(playerid, true, 0); + } + #endif + + stock FIXES_Kick(playerid) + { + if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT) + { + // Disable as much of the server as possible quickly. + return + #if FIXES_Single + FIXES_BlockUpdate(playerid, true, 0), + #else + CallRemoteFunction("@FIXES_Kick", "i", playerid), + #endif + TogglePlayerSpectating(playerid, true), + TogglePlayerControllable(playerid, false), + SetPVarInt(playerid, FIXES_pvarKick, SetTimerEx(FIXES_gscKick, 1000, 0, FIXES_gscSpec@i, playerid)), + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_KICKED, + 1; + } + else + { + return Kick(playerid); + } + } + + #define _ALS_Kick + #define Kick FIXES_Kick +#endif + +/* + * FIXES_IsPAttachedObjectSlotUsed(playerid, index) + * + * FIXES: + * IsPlayerAttachedObjectSlotUsed + */ + +#if defined _ALS_IsPAttachedObjSlotUsed + #error _ALS_IsPAttachedObjSlotUsed defined +#endif +native BAD_IsPlayerAttachedObjSlotUsed(playerid, index) = IsPlayerAttachedObjectSlotUsed; + +#if FIX_IsPlayerAttachedObjSlotUsed + stock FIXES_IsPAttachedObjectSlotUsed(playerid, index) + { + if (_FIXES_IS_PLAYER_CONNECTED(playerid)) + { + return FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] & 1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index; + } + return 0; + } + + #define _ALS_IsPAttachedObjSlotUsed + #define IsPlayerAttachedObjectSlotUsed FIXES_IsPAttachedObjectSlotUsed +#endif + +/* + * _FIXES_SetPlayerAttachedObject(slot, to) + * + * FIXES: + * IsPlayerAttachedObjectSlotUsed + */ + +#if (FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject) && !FIXES_Single + forward _FIXES_SetPlayerAttachedObject(slot, to); + + public _FIXES_SetPlayerAttachedObject(slot, to) + { + FIXES_gsObjectSlots[slot] = to; + } +#endif + +/* + * FIXES_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0) + * + * FIXES: + * IsPlayerAttachedObjectSlotUsed + * SetPlayerAttachedObject + */ + +#if defined _ALS_SetPlayerAttachedObject + #error _ALS_SetPlayerAttachedObject defined +#endif +native BAD_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0, materialcolor1 = 0, materialcolor2 = 0) = SetPlayerAttachedObject; + +#if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject + stock FIXES_SetPlayerAttachedObject(playerid, index, modelid, bone, Float:fOffsetX = 0.0, Float:fOffsetY = 0.0, Float:fOffsetZ = 0.0, Float:fRotX = 0.0, Float:fRotY = 0.0, Float:fRotZ = 0.0, Float:fScaleX = 1.0, Float:fScaleY = 1.0, Float:fScaleZ = 1.0, materialcolor1 = 0, materialcolor2 = 0) + { + if (SetPlayerAttachedObject(playerid, index, modelid, bone, fOffsetX, fOffsetY, fOffsetZ, fRotX, fRotY, fRotZ, fScaleX, fScaleY, fScaleZ, materialcolor1, materialcolor2)) + { + #if FIXES_Single + FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] |= (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index); + #else + new + slot = playerid / _FIXES_ATTACHMENTS; + CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] | (1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index)); + #endif + return 1; + } + return 0; + } + + #define _ALS_SetPlayerAttachedObject + #define SetPlayerAttachedObject FIXES_SetPlayerAttachedObject +#endif + +/* + * FIXES_RemovePlayerAttachedObj(playerid, index) + * + * FIXES: + * IsPlayerAttachedObjectSlotUsed + */ + +#if defined _ALS_RemovePlayerAttachedObject + #error _ALS_RemovePlayerAttachedObject defined +#endif +native BAD_RemovePlayerAttachedObject(playerid, index) = RemovePlayerAttachedObject; + +#if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject + stock FIXES_RemovePlayerAttachedObj(playerid, index) + { + if (RemovePlayerAttachedObject(playerid, index)) + { + #if FIXES_Single + FIXES_gsObjectSlots[playerid / _FIXES_ATTACHMENTS] &= ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index); + #else + new + slot = playerid / _FIXES_ATTACHMENTS; + CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, slot, FIXES_gsObjectSlots[slot] & ~(1 << playerid % _FIXES_ATTACHMENTS * MAX_PLAYER_ATTACHED_OBJECTS + index)); + #endif + return 1; + } + return 0; + } + + #define _ALS_RemovePlayerAttachedObject + #define RemovePlayerAttachedObject FIXES_RemovePlayerAttachedObj +#endif + +/* + * _FIXES_DetermineOrder() + * + * Figure out which the first filterscript to be called is so that it can do the + * majority of the work. More detail: Several pieces of code for some fixes + * rely on things like blocking "OnPlayerUpdate". This should be done in the + * first script in which "OnPlayerUpdate" is called only, so we need to find out + * in advance which script will be called first (at least out of all the fixed + * scripts). + */ + +#if !FIXES_Single + public _FIXES_DetermineOrder() + { + // TODO: Graceful handoff. I thought I was past all this rubbish! + if (!_FIXES_gIsFilterscript) + { + if (existproperty(5, FIXES_gscNoGMProperty)) + { + return 0; + } + // Make sure certain data is synced with what the GM thinks it is. + // ============================= + // BEGIN: AllowInteriorWeapons + // ============================= + #if FIX_AllowInteriorWeapons + CallRemoteFunction(FIXES_gscAllowInteriorWeapons, FIXES_gscSpec@i, !(FIXES_gsSettings & e_FIXES_SETTINGS_INTERIOR)); + #endif + // ============================= + // END: AllowInteriorWeapons + // ============================= + + // ================================ + // BEGIN: SetPlayerAttachedObject + // ================================ + #if FIX_IsPlayerAttachedObjSlotUsed || FIX_SetPlayerAttachedObject + for (new i = 0; i != _FIXES_ATTACHMENTS; ++i) + { + CallRemoteFunction(FIXES_gscSetPlayerAttachedObj, FIXES_gscSpec@ii, i, FIXES_gsObjectSlots[i]); + } + #endif + // ============================== + // END: SetPlayerAttachedObject + // ============================== + } + if (existproperty(5, FIXES_gscOrderProperty)) + { + // Either this is a Filter Script (1) and we don't want gamemodes + // (1) or this isn't a filterscript (0) and we do want gamemodes + // (0). All other cases return here due to a logic mismatch. This + // is to rectify the difference in call orders between + // "CallRemoteFunction" and normal callbacks. Now DOESN'T end on + // the second time round for filterscripts to correctly pass on the + // data to GameModes. + if (!existproperty(5, FIXES_gscNoGMProperty) && _FIXES_gIsFilterscript == bool:getproperty(5, FIXES_gscOrderProperty)) + { + // The game mode is not in charge, which means we are checking + // the filterscripts a second time and shouldn't be. + return 0; + } + // If this script was previously the owner, and we are not ending + // the game mode (in which case discard all data), and if we are + // only dealing with filterscripts or the gamemode is now the + // master. + if (FIXES_gsSettings & (e_FIXES_SETTINGS_IN_CHARGE | e_FIXES_SETTINGS_DROP_ALL_DATA) == e_FIXES_SETTINGS_IN_CHARGE) + { + FIXES_PRINTF("_FIXES_DetermineOrder: Was in charge"); + // This script is currently in charge, but a new script has + // usurped it! Pass all relevant data over to the new script. + // Also, this wasn't triggered by a game mode change (where we + // just want to dump and reset all data). There is no need to + // reset the admin teleport data as that is always handled by + // the Game Mode, so it will either be correct, or it will be + // blank. + FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE; + #if FIX_SetPlayerWorldBounds || FIX_TogglePlayerControllable + _FIXES_FOREACH(FIXES_gsPlayersIterator, i) + { + // ================= + // BEGIN: GameText + // ================= + #if FIX_GameText + for (new j = 0; j != FIXES_GT_STYLE_COUNT; ++j) + { + PlayerTextDrawDestroy(i, FIXES_gsPGTStyle[i][j]); + } + #endif + // ================= + // END: GameText + // ================= + + // ============================= + // BEGIN: SetPlayerWorldBounds + // ============================= + #if FIX_SetPlayerWorldBounds + // I realised that you could have the GM in charge, + // set their bounds, load an FS, remove their bounds + // then unload the FS again and it would result in + // the old GM setting of them HAVING bounds being + // re-applied, so the check is removed. + CallRemoteFunction(FIXES_gscSetPlayerWorldBounds, FIXES_gscSpec@iffff, i, FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_UX], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_LX], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_UY], FIXES_gsWorldbounds[i][E_FIXES_WORLDBOUND_DATA_LY]); + #endif + // ============================= + // END: SetPlayerWorldBounds + // ============================= + + // ================================= + // BEGIN: TogglePlayerControllable + // ================================= + #if FIX_TogglePlayerControllable + CallRemoteFunction(FIXES_gscTogglePlayerControl, FIXES_gscSpec@ii, i, !(FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_UNCONTROLLABLE)); + #endif + // ================================= + // END: TogglePlayerControllable + // ================================= + + // =========================== + // BEGIN: PutPlayerInVehicle + // =========================== + #if FIX_PutPlayerInVehicle + if (FIXES_gsPlayerBools[i] & e_FIXES_BOOLS_PUT_IN_VEHICLE) + { + CallRemoteFunction(FIXES_gscPutPlayerInVehicle, FIXES_gscSpec@iii, i, FIXES_gsVehicleSeatData[i] & 0x00FFFFFF, FIXES_gsVehicleSeatData[i] >>> 24); + } + #endif + // =========================== + // END: PutPlayerInVehicle + // =========================== + } + #endif + + // ================= + // BEGIN: GameText + // ================= + #if FIX_GameText + #if FIX_GameTextStyles + TextDrawDestroy(FIXES_gsGTStyle[13]), + TextDrawDestroy(FIXES_gsGTStyle[12]), + TextDrawDestroy(FIXES_gsGTStyle[11]), + TextDrawDestroy(FIXES_gsGTStyle[10]), + TextDrawDestroy(FIXES_gsGTStyle[9]), + TextDrawDestroy(FIXES_gsGTStyle[8]), + TextDrawDestroy(FIXES_gsGTStyle[7]), + #endif + TextDrawDestroy(FIXES_gsGTStyle[6]), + TextDrawDestroy(FIXES_gsGTStyle[5]), + TextDrawDestroy(FIXES_gsGTStyle[4]), + TextDrawDestroy(FIXES_gsGTStyle[3]), + TextDrawDestroy(FIXES_gsGTStyle[2]), + TextDrawDestroy(FIXES_gsGTStyle[1]), + TextDrawDestroy(FIXES_gsGTStyle[0]); + #endif + // ================= + // END: GameText + // ================= + + FIXES_PRINTF("_FIXES_DetermineOrder: Not in charge"); + return 0; + } + else + { + FIXES_gsSettings &= ~e_FIXES_SETTINGS_IN_CHARGE; + FIXES_PRINTF("_FIXES_DetermineOrder: Not in charge"); + return 0; + } + } + else if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDING)) + { + setproperty(5, FIXES_gscOrderProperty, _FIXES_gIsFilterscript); + #if FIXES_Debug + if (FIXES_gsSettings & e_FIXES_SETTINGS_IN_CHARGE) + { + FIXES_PRINTF("_FIXES_DetermineOrder: Already in charge"); + } + #endif + FIXES_gsSettings |= e_FIXES_SETTINGS_IN_CHARGE; + FIXES_PRINTF("_FIXES_DetermineOrder: Now in charge"); + + // ================= + // BEGIN: GameText + // ================= + #if FIX_GameText + // Create all the relevant TextDraws. + _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid) + { + _FIXES_CreateGameTextDraws(playerid); + } + _FIXES_CreateGameTextDraws(INVALID_PLAYER_ID); + #endif + // ================= + // END: GameText + // ================= + return 1; + } + else if (!(FIXES_gsSettings & e_FIXES_SETTINGS_ENDED)) + { + // Only called when a filterscript that is currently master (and + // thus called first by "CallRemoteFunction") ends. This doesn't + // get triggered when a gamemode is master, but that doesn't matter + // because in that case all the textdraws are destroyed anyway. + + // ================= + // BEGIN: GameText + // ================= + #if FIX_GameText + // Destroy all the relevant TextDraws. + _FIXES_FOREACH(FIXES_gsPlayersIterator, playerid) + { + #if FIX_GameTextStyles + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][13]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][12]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][11]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][10]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][9]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][8]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][7]), + #endif + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][6]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][5]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][4]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][3]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][2]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][1]), + PlayerTextDrawDestroy(playerid, FIXES_gsPGTStyle[playerid][0]); + } + #if FIX_GameTextStyles + TextDrawDestroy(FIXES_gsGTStyle[13]), + TextDrawDestroy(FIXES_gsGTStyle[12]), + TextDrawDestroy(FIXES_gsGTStyle[11]), + TextDrawDestroy(FIXES_gsGTStyle[10]), + TextDrawDestroy(FIXES_gsGTStyle[9]), + TextDrawDestroy(FIXES_gsGTStyle[8]), + TextDrawDestroy(FIXES_gsGTStyle[7]), + #endif + TextDrawDestroy(FIXES_gsGTStyle[6]), + TextDrawDestroy(FIXES_gsGTStyle[5]), + TextDrawDestroy(FIXES_gsGTStyle[4]), + TextDrawDestroy(FIXES_gsGTStyle[3]), + TextDrawDestroy(FIXES_gsGTStyle[2]), + TextDrawDestroy(FIXES_gsGTStyle[1]), + TextDrawDestroy(FIXES_gsGTStyle[0]); + #endif + // ================= + // END: GameText + // ================= + + #if FIXES_Debug + FIXES_PRINTF("_FIXES_DetermineOrder: Ending"); + #endif + + FIXES_gsSettings |= e_FIXES_SETTINGS_ENDED; + } + return 0; + } +#endif + +/* + * FIXES_strins(string[], const substr[], pos, maxlength = sizeof string) + * + * FIXES: + * strins + */ + +#if defined _ALS_strins + #error _ALS_strins defined +#endif +native BAD_strins(string[], const substr[], pos, maxlength = sizeof string) = strins; + +#if FIX_strins + stock FIXES_strins(string[], const substr[], pos, maxlength = sizeof string) + { + if (string[0] > 255) + { + new + strlength = strlen(string), + sublength = strlen(substr), + m4 = maxlength * 4; + // Packed - format doesn't like these strings. + if (strlength + sublength >= m4) + { + if (pos + sublength >= m4) + { + return + string{pos} = '\0', + // Hopefully this doesn't ignore maxlength and does packed. + strcat(string, substr, maxlength); + } + else + { + // pos + sublength is less than maxlength, so this sum MUST + // be positive and gte than "pos", so there's no need for + // additional checks. + string{maxlength - sublength - 1} = '\0'; + } + } + return strins(string, substr, pos, maxlength); + } + else if (substr[0] > 255) + { + new + strlength = strlen(string), + sublength = strlen(substr); + // Packed - format doesn't like these strings. + if (strlength + sublength >= maxlength) + { + if (pos + sublength >= maxlength) + { + return + string[pos] = '\0', + // Hopefully this doesn't ignore maxlength and does packed. + strcat(string, substr, maxlength); + } + else + { + // pos + sublength is less than maxlength, so this sum MUST + // be positive and gte than "pos", so there's no need for + // additional checks. + string[maxlength - sublength - 1] = '\0'; + } + } + return strins(string, substr, pos, maxlength); + } + else + { + return format(string, maxlength, "%.*s%s%s", pos, string, substr, string[pos]); + } + } + + #define _ALS_strins + #define strins FIXES_strins +#endif + +/* + * _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync) + * + * FIXES: + * ApplyAnimation_2 + */ + +#if FIX_ApplyAnimation_2 + forward _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync); + + public _FIXES_ApplyAnimation(playerid, animlib, Float:fDelta, loop, lockx, locky, freeze, time, forcesync) + { + ApplyAnimation(playerid, FIXES_gscAnimLib[animlib], FIXES_gsClassAnimName[playerid], fDelta, loop, lockx, locky, freeze, time, forcesync), + FIXES_gsAnimTimer[playerid] = 0; + } +#endif + +/* + * FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0) + * + * FIXES: + * ApplyAnimation + * ApplyAnimation_2 + */ + +#if defined _ALS_ApplyAnimation + #error _ALS_ApplyAnimation defined +#endif +native BAD_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0) = ApplyAnimation; + +#if FIX_ApplyAnimation || FIX_ApplyAnimation_2 + stock FIXES_ApplyAnimation(playerid, animlib[], animname[], Float:fDelta, loop, lockx, locky, freeze, time, forcesync = 0) + { + new + diff, + idx = animlib[0] & ~0x20; + // Uses a sort of optimised binary search. The code first identifies the area in the array + // in which libraries with this first letter are, then does a binary search using only that + // subset of the array. This used to use an N-ary search that just went linearly through + // the identified subset of the array, and that was 5x faster than a simple linear loop over + // the whole array. This new version is 50% faster than even that was. "E" has no + // libraries, but we don't check for that explicitly as it would slow down the more common + // code path - and it ends fairly quickly anyway as "upper == lower". + if (_FIXES_IN_RANGE(idx, 'A', 'W' + 1)) + { + new + upper = FIXES_gscAnimIndexes[idx - ('A' - 1)], + lower = FIXES_gscAnimIndexes[idx - 'A']; + while (upper != lower) + { + idx = (upper - lower) / 2 + lower; + if ((diff = strcmp(FIXES_gscAnimLib[idx], animlib, true))) + { + if (diff > 0) upper = idx; + else lower = idx + 1; + } + else + { + // If we hit the "else" branch, we have found the correct + // animation library from the n-ary search. + #if FIX_ApplyAnimation_2 + if (FIXES_gsAnimTimer[playerid]) + { + KillTimer(FIXES_gsAnimTimer[playerid]), + FIXES_gsAnimTimer[playerid] = 0; + } + if (FIXES_gsPlayerAnimLibs[playerid][idx >>> 5] & (1 << (idx & 0x1F))) + { + FIXES_gsPlayerAnimLibs[playerid][idx >>> 5] &= ~(1 << (idx & 0x1F)), + FIXES_gsClassAnimName[playerid][0] = '\0', + strcat(FIXES_gsClassAnimName[playerid], animname), + FIXES_gsAnimTimer[playerid] = SetTimerEx("_FIXES_ApplyAnimation", 350, false, "ddfdddddd", playerid, idx, fDelta, loop, lockx, locky, freeze, time, forcesync); + } + #endif + return ApplyAnimation(playerid, animlib, animname, fDelta, loop, lockx, locky, freeze, time, forcesync); + } + } + } + return 0; + } + + #define _ALS_ApplyAnimation + #define ApplyAnimation FIXES_ApplyAnimation +#endif + +/* + * FIXES_random(max) + * + * FIXES: + * random + */ + +#if defined _ALS_random + #error _ALS_random defined +#endif +native BAD_random(max) = random; + +#if FIX_random + stock FIXES_random(max) + { + if (max < 0) + { + return -random(-max); + } + else + { + return random(max); + } + } + + #define _ALS_random + #define random FIXES_random +#endif + +/* + * _FIXES_SetCamera + * + * FIXES: + * SetPlayerCamera + */ + +#if FIX_SetPlayerCamera + forward _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z); + + public _FIXES_SetCamera(playerid, type, Float:x, Float:y, Float:z) + { + if (type) + { + SetPlayerCameraPos(playerid, x, y, z); + } + else + { + SetPlayerCameraLookAt(playerid, x, y, z); + } + return 0; + } +#endif + +/* + * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z) + * + * FIXES: + * SetPlayerCamera + */ + +#if defined _ALS_SetPlayerCameraPos + #error _ALS_SetPlayerCameraPos defined +#endif +native BAD_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraPos; + +#if FIX_SetPlayerCamera + stock FIXES_SetPlayerCameraPos(playerid, Float:x, Float:y, Float:z) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + #if FIXES_Single + if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING) + #else + if (GetPVarInt(playerid, FIXES_pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING) + #endif + { + SetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 1, x, y, z); + } + else + { + SetPlayerCameraPos(playerid, x, y, z); + } + } + return 0; + } + + #define _ALS_SetPlayerCameraPos + #define SetPlayerCameraPos FIXES_SetPlayerCameraPos +#endif + +/* + * FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z) + * + * FIXES: + * SetPlayerCamera + */ + +#if defined _ALS_SetPlayerCameraLookAt + #error _ALS_SetPlayerCameraLookAt defined +#endif +native BAD_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z) = SetPlayerCameraLookAt; + +#if FIX_SetPlayerCamera + stock FIXES_SetPlayerCameraLookAt(playerid, Float:x, Float:y, Float:z) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + #if FIXES_Single + if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_SPECTATING || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING) + #else + if (GetPVarInt(playerid, FIXES_pvarPlayerSpectate) || GetPlayerState(playerid) == PLAYER_STATE_SPECTATING) + #endif + { + SetTimerEx(FIXES_gscSetCamera, 300, 0, FIXES_gscSpec@iifff, playerid, 0, x, y, z); + } + else + { + SetPlayerCameraLookAt(playerid, x, y, z); + } + } + return 0; + } + + #define _ALS_SetPlayerCameraLookAt + #define SetPlayerCameraLookAt FIXES_SetPlayerCameraLookAt +#endif + +/* + * FIXES_TogglePlayerSpectating(playerid, toggle) + * + * FIXES: + * SetPlayerCamera + */ + +#if defined _ALS_TogglePlayerSpectating + #error _ALS_TogglePlayerSpectating defined +#endif +native BAD_TogglePlayerSpectating(playerid, toggle) = TogglePlayerSpectating; + +#if FIX_SetPlayerCamera + stock FIXES_TogglePlayerSpectating(playerid, toggle) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + if (toggle) + { + #if FIXES_Single + FIXES_gsPlayerBools[playerid] |= e_FIXES_BOOLS_SPECTATING; + #else + SetPVarInt(playerid, FIXES_pvarPlayerSpectate, 1); + #endif + } + else + { + #if FIXES_Single + FIXES_gsPlayerBools[playerid] &= ~e_FIXES_BOOLS_SPECTATING; + #else + DeletePVar(playerid, FIXES_pvarPlayerSpectate); + #endif + } + return TogglePlayerSpectating(playerid, toggle); + } + return 0; + } + + #define _ALS_TogglePlayerSpectating + #define TogglePlayerSpectating FIXES_TogglePlayerSpectating +#endif + +/* + * FIXES_SetPlayerTime(playerid, hour, minute) + * + * FIXES: + * SetPlayerTime + */ + +#if defined _ALS_SetPlayerTime + #error _ALS_SetPlayerTime defined +#endif +native BAD_SetPlayerTime(playerid, hour, minute) = SetPlayerTime; + +#if FIX_SetPlayerTime + forward _FIXES_SetTime(playerid, hour, minute); + + public _FIXES_SetTime(playerid, hour, minute) + { + if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT) + { + return SetPlayerTime(playerid, hour, minute); + } + return 0; + } + + stock FIXES_SetPlayerTime(playerid, hour, minute) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT) + { + return SetTimerEx(FIXES_gscSetTime, 250, 0, FIXES_gscSpec@iii, playerid, hour, minute); + } + return SetPlayerTime(playerid, hour, minute); + } + return 0; + } + + #define _ALS_SetPlayerTime + #define SetPlayerTime FIXES_SetPlayerTime +#endif + +/* + * FIXES_SetPlayerColor(playerid, color) + * + * FIXES: + * SetPlayerColor + */ + +#if defined _ALS_SetPlayerColor + #error _ALS_SetPlayerColor defined +#endif +native BAD_SetPlayerColor(playerid, color) = SetPlayerColor; + +#if FIX_SetPlayerColour + forward _FIXES_SetColor(playerid, color); + + public _FIXES_SetColor(playerid, color) + { + if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT) + { + return SetPlayerColor(playerid, color); + } + return 0; + } + + stock FIXES_SetPlayerColor(playerid, color) + { + if (_FIXES_IN_RANGE(playerid, 0, MAX_PLAYERS)) + { + if (FIXES_gsPlayerBools[playerid] & e_FIXES_BOOLS_ON_PLAYER_CONNECT) + { + return SetTimerEx(FIXES_gscSetColor, 300, 0, FIXES_gscSpec@ii, playerid, color); + } + return SetPlayerColor(playerid, color); + } + return 0; + } + + #define _ALS_SetPlayerColor + #define SetPlayerColor FIXES_SetPlayerColor +#endif + +/* + * FIXES_GetPlayerWeaponData(playerid, slot, &weapons, &ammo) + * + * FIXES: + * GetPlayerWeaponData + */ + +#if defined _ALS_GetPlayerWeaponData + #error _ALS_GetPlayerWeaponData defined +#endif +native BAD_GetPlayerWeaponData(playerid, slot, &weapons, &ammo) = GetPlayerWeaponData; + +#if FIX_GetPlayerWeaponData + stock FIXES_GetPlayerWeaponData(playerid, slot, &weapons, &ammo) + { + // This reuses the "slot" variable so we don't have to declare a new one + // and can put all the code in a single statement. + return + slot = GetPlayerWeaponData(playerid, slot, weapons, ammo), + weapons = ammo ? weapons : 0, + slot; + } + + #define _ALS_GetPlayerWeaponData + #define GetPlayerWeaponData FIXES_GetPlayerWeaponData +#endif + +/* + * FIXES_sleep(const time) + * + * FIXES: + * sleep + */ + +// Uses a little trick to consume part of the line and thus not match +// our hooked version. +#if defined _ALS_sleep + #error _ALS_sleep defined +#endif +#define BAD_sleep%0\n%9 sleep%0 + +#if FIX_sleep + stock FIXES_sleep(ms) + { + // Call a native function that does very little, but saves the current + // heap pointer. Then return to save the accurate stack pointer. + return heapspace(), ms; + } + + #define _ALS_sleep + + #define sleep%0\n%9 sleep FIXES_sleep(%0) + // This fixes another BIZZARE bug. Just doing: + // + // #define FIXES_sleep(%0;) FIXES_sleep(%0) + // + // Results in: + // + // FIXES_sleep(n)); + // + // Which clearly it shouldn't. I've stepped through the compilation and that + // extra bracket comes from nowhere! + #define FIXES_sleep(%0;) FIXES_sleep _FIXES_SLEEP_BRACKET %0); + #define _FIXES_SLEEP_BRACKET ( +#endif + +/* + * _FIXES_AddInternal(array[], value, size) + * + * Add something to an internal linked list. + */ + +static stock _FIXES_AddInternal(array[], value, size) +{ + if (array[value] <= value) + { + new + last = size, + next = array[last]; + while (next < value) + { + last = next, + next = array[last]; + } + array[next - 1] = value + 1, + array[(value - 1) % (size + 1)] = (last + 1) % (size + 1), + array[last] = value, + array[value] = next; + } +} + +/* + * _FIXES_RemoveInternal(array[], value, size) + * + * Remove something from an internal linked list. + */ + +static stock _FIXES_RemoveInternal(array[], value, size) +{ + if (array[value] > value) + { + static + last; + // Adjustment for easier "mod"ing. + ++size, + last = (array[(value - 1) % size] - 1) % size, + // Store the reverse value here as well as in the previous slot. + array[value] = + // Copy the next value to the last value. + array[(array[last] = array[value]) - 1] = + // Set the reverse iterator value. + (last + 1) % size; + } +} + +#undef _FIXES_CEILDIV +#undef _FIXES_INFINITY +#undef _FIXES_N_INFINITY +#undef _FIXES_ATTACHMENTS +#undef _FIXES_FOREACH +#undef _FIXES_IS_UNSET +#undef _FIXES_IS_IN_CHARGE +#undef _FIXES_IN_RANGE +#undef _FIXES_NO_RANGE +#undef _FIXES_FORWARD +#undef _FIXES_IS_PLAYER_CONNECTED +#undef FIXES_PRINTF + +#endinput + +// Fix inclusion template. + +#if !defined FIX_NameOfFixHere + #define FIX_NameOfFixHere (1) +#elseif _FIXES_IS_UNSET(FIX_NameOfFixHere) + #undef FIX_NameOfFixHere + #define FIX_NameOfFixHere (2) +#endif + +// Fix function template. + +/* + * FIXES_NameOfFixHere + * + * FIXES: + * NameOfFixHere + */ + +#if defined _ALS_NameOfFixHere + #error _ALS_NameOfFixHere defined +#endif +native BAD_NameOfFixHere(params) = NameOfFixHere; + +#if FIX_NameOfFixHere + stock FIXES_NameOfFixHere(params) + { + return 0; + } + + #define _ALS_NameOfFixHere + #define NameOfFixHere FIXES_NameOfFixHere +#endif + diff --git a/samples/Pawn/grandlarc.pwn b/samples/Pawn/grandlarc.pwn deleted file mode 100644 index 76e96c66..00000000 --- a/samples/Pawn/grandlarc.pwn +++ /dev/null @@ -1,520 +0,0 @@ -//---------------------------------------------------------- -// -// GRAND LARCENY 1.0 -// A freeroam gamemode for SA-MP 0.3 -// -//---------------------------------------------------------- - -#include -#include -#include -#include "../include/gl_common.inc" -#include "../include/gl_spawns.inc" - -#pragma tabsize 0 - -//---------------------------------------------------------- - -#define COLOR_WHITE 0xFFFFFFFF -#define COLOR_NORMAL_PLAYER 0xFFBB7777 - -#define CITY_LOS_SANTOS 0 -#define CITY_SAN_FIERRO 1 -#define CITY_LAS_VENTURAS 2 - -new total_vehicles_from_files=0; - -// Class selection globals -new gPlayerCitySelection[MAX_PLAYERS]; -new gPlayerHasCitySelected[MAX_PLAYERS]; -new gPlayerLastCitySelectionTick[MAX_PLAYERS]; - -new Text:txtClassSelHelper; -new Text:txtLosSantos; -new Text:txtSanFierro; -new Text:txtLasVenturas; - -new thisanimid=0; -new lastanimid=0; - -//---------------------------------------------------------- - -main() -{ - print("\n---------------------------------------"); - print("Running Grand Larceny - by the SA-MP team\n"); - print("---------------------------------------\n"); -} - -//---------------------------------------------------------- - -public OnPlayerConnect(playerid) -{ - GameTextForPlayer(playerid,"~w~Grand Larceny",3000,4); - SendClientMessage(playerid,COLOR_WHITE,"Welcome to {88AA88}G{FFFFFF}rand {88AA88}L{FFFFFF}arceny"); - - // class selection init vars - gPlayerCitySelection[playerid] = -1; - gPlayerHasCitySelected[playerid] = 0; - gPlayerLastCitySelectionTick[playerid] = GetTickCount(); - - //SetPlayerColor(playerid,COLOR_NORMAL_PLAYER); - - //Kick(playerid); - - /* - Removes vending machines - RemoveBuildingForPlayer(playerid, 1302, 0.0, 0.0, 0.0, 6000.0); - RemoveBuildingForPlayer(playerid, 1209, 0.0, 0.0, 0.0, 6000.0); - RemoveBuildingForPlayer(playerid, 955, 0.0, 0.0, 0.0, 6000.0); - RemoveBuildingForPlayer(playerid, 1775, 0.0, 0.0, 0.0, 6000.0); - RemoveBuildingForPlayer(playerid, 1776, 0.0, 0.0, 0.0, 6000.0); - */ - - /* - new ClientVersion[32]; - GetPlayerVersion(playerid, ClientVersion, 32); - printf("Player %d reports client version: %s", playerid, ClientVersion);*/ - - return 1; -} - -//---------------------------------------------------------- - -public OnPlayerSpawn(playerid) -{ - if(IsPlayerNPC(playerid)) return 1; - - new randSpawn = 0; - - SetPlayerInterior(playerid,0); - TogglePlayerClock(playerid,0); - ResetPlayerMoney(playerid); - GivePlayerMoney(playerid, 30000); - - if(CITY_LOS_SANTOS == gPlayerCitySelection[playerid]) { - randSpawn = random(sizeof(gRandomSpawns_LosSantos)); - SetPlayerPos(playerid, - gRandomSpawns_LosSantos[randSpawn][0], - gRandomSpawns_LosSantos[randSpawn][1], - gRandomSpawns_LosSantos[randSpawn][2]); - SetPlayerFacingAngle(playerid,gRandomSpawns_LosSantos[randSpawn][3]); - } - else if(CITY_SAN_FIERRO == gPlayerCitySelection[playerid]) { - randSpawn = random(sizeof(gRandomSpawns_SanFierro)); - SetPlayerPos(playerid, - gRandomSpawns_SanFierro[randSpawn][0], - gRandomSpawns_SanFierro[randSpawn][1], - gRandomSpawns_SanFierro[randSpawn][2]); - SetPlayerFacingAngle(playerid,gRandomSpawns_SanFierro[randSpawn][3]); - } - else if(CITY_LAS_VENTURAS == gPlayerCitySelection[playerid]) { - randSpawn = random(sizeof(gRandomSpawns_LasVenturas)); - SetPlayerPos(playerid, - gRandomSpawns_LasVenturas[randSpawn][0], - gRandomSpawns_LasVenturas[randSpawn][1], - gRandomSpawns_LasVenturas[randSpawn][2]); - SetPlayerFacingAngle(playerid,gRandomSpawns_LasVenturas[randSpawn][3]); - } - - //SetPlayerColor(playerid,COLOR_NORMAL_PLAYER); - - SetPlayerSkillLevel(playerid,WEAPONSKILL_PISTOL,200); - SetPlayerSkillLevel(playerid,WEAPONSKILL_PISTOL_SILENCED,200); - SetPlayerSkillLevel(playerid,WEAPONSKILL_DESERT_EAGLE,200); - SetPlayerSkillLevel(playerid,WEAPONSKILL_SHOTGUN,200); - SetPlayerSkillLevel(playerid,WEAPONSKILL_SAWNOFF_SHOTGUN,200); - SetPlayerSkillLevel(playerid,WEAPONSKILL_SPAS12_SHOTGUN,200); - SetPlayerSkillLevel(playerid,WEAPONSKILL_MICRO_UZI,200); - SetPlayerSkillLevel(playerid,WEAPONSKILL_MP5,200); - SetPlayerSkillLevel(playerid,WEAPONSKILL_AK47,200); - SetPlayerSkillLevel(playerid,WEAPONSKILL_M4,200); - SetPlayerSkillLevel(playerid,WEAPONSKILL_SNIPERRIFLE,200); - - GivePlayerWeapon(playerid,WEAPON_COLT45,100); - //GivePlayerWeapon(playerid,WEAPON_MP5,100); - TogglePlayerClock(playerid, 0); - - return 1; -} - -//---------------------------------------------------------- - -public OnPlayerDeath(playerid, killerid, reason) -{ - new playercash; - - // if they ever return to class selection make them city - // select again first - gPlayerHasCitySelected[playerid] = 0; - - if(killerid == INVALID_PLAYER_ID) { - ResetPlayerMoney(playerid); - } else { - playercash = GetPlayerMoney(playerid); - if(playercash > 0) { - GivePlayerMoney(killerid, playercash); - ResetPlayerMoney(playerid); - } - } - return 1; -} - -//---------------------------------------------------------- - -ClassSel_SetupCharSelection(playerid) -{ - if(gPlayerCitySelection[playerid] == CITY_LOS_SANTOS) { - SetPlayerInterior(playerid,11); - SetPlayerPos(playerid,508.7362,-87.4335,998.9609); - SetPlayerFacingAngle(playerid,0.0); - SetPlayerCameraPos(playerid,508.7362,-83.4335,998.9609); - SetPlayerCameraLookAt(playerid,508.7362,-87.4335,998.9609); - } - else if(gPlayerCitySelection[playerid] == CITY_SAN_FIERRO) { - SetPlayerInterior(playerid,3); - SetPlayerPos(playerid,-2673.8381,1399.7424,918.3516); - SetPlayerFacingAngle(playerid,181.0); - SetPlayerCameraPos(playerid,-2673.2776,1394.3859,918.3516); - SetPlayerCameraLookAt(playerid,-2673.8381,1399.7424,918.3516); - } - else if(gPlayerCitySelection[playerid] == CITY_LAS_VENTURAS) { - SetPlayerInterior(playerid,3); - SetPlayerPos(playerid,349.0453,193.2271,1014.1797); - SetPlayerFacingAngle(playerid,286.25); - SetPlayerCameraPos(playerid,352.9164,194.5702,1014.1875); - SetPlayerCameraLookAt(playerid,349.0453,193.2271,1014.1797); - } - -} - -//---------------------------------------------------------- -// Used to init textdraws of city names - -ClassSel_InitCityNameText(Text:txtInit) -{ - TextDrawUseBox(txtInit, 0); - TextDrawLetterSize(txtInit,1.25,3.0); - TextDrawFont(txtInit, 0); - TextDrawSetShadow(txtInit,0); - TextDrawSetOutline(txtInit,1); - TextDrawColor(txtInit,0xEEEEEEFF); - TextDrawBackgroundColor(txtClassSelHelper,0x000000FF); -} - -//---------------------------------------------------------- - -ClassSel_InitTextDraws() -{ - // Init our observer helper text display - txtLosSantos = TextDrawCreate(10.0, 380.0, "Los Santos"); - ClassSel_InitCityNameText(txtLosSantos); - txtSanFierro = TextDrawCreate(10.0, 380.0, "San Fierro"); - ClassSel_InitCityNameText(txtSanFierro); - txtLasVenturas = TextDrawCreate(10.0, 380.0, "Las Venturas"); - ClassSel_InitCityNameText(txtLasVenturas); - - // Init our observer helper text display - txtClassSelHelper = TextDrawCreate(10.0, 415.0, - " Press ~b~~k~~GO_LEFT~ ~w~or ~b~~k~~GO_RIGHT~ ~w~to switch cities.~n~ Press ~r~~k~~PED_FIREWEAPON~ ~w~to select."); - TextDrawUseBox(txtClassSelHelper, 1); - TextDrawBoxColor(txtClassSelHelper,0x222222BB); - TextDrawLetterSize(txtClassSelHelper,0.3,1.0); - TextDrawTextSize(txtClassSelHelper,400.0,40.0); - TextDrawFont(txtClassSelHelper, 2); - TextDrawSetShadow(txtClassSelHelper,0); - TextDrawSetOutline(txtClassSelHelper,1); - TextDrawBackgroundColor(txtClassSelHelper,0x000000FF); - TextDrawColor(txtClassSelHelper,0xFFFFFFFF); -} - -//---------------------------------------------------------- - -ClassSel_SetupSelectedCity(playerid) -{ - if(gPlayerCitySelection[playerid] == -1) { - gPlayerCitySelection[playerid] = CITY_LOS_SANTOS; - } - - if(gPlayerCitySelection[playerid] == CITY_LOS_SANTOS) { - SetPlayerInterior(playerid,0); - SetPlayerCameraPos(playerid,1630.6136,-2286.0298,110.0); - SetPlayerCameraLookAt(playerid,1887.6034,-1682.1442,47.6167); - - TextDrawShowForPlayer(playerid,txtLosSantos); - TextDrawHideForPlayer(playerid,txtSanFierro); - TextDrawHideForPlayer(playerid,txtLasVenturas); - } - else if(gPlayerCitySelection[playerid] == CITY_SAN_FIERRO) { - SetPlayerInterior(playerid,0); - SetPlayerCameraPos(playerid,-1300.8754,68.0546,129.4823); - SetPlayerCameraLookAt(playerid,-1817.9412,769.3878,132.6589); - - TextDrawHideForPlayer(playerid,txtLosSantos); - TextDrawShowForPlayer(playerid,txtSanFierro); - TextDrawHideForPlayer(playerid,txtLasVenturas); - } - else if(gPlayerCitySelection[playerid] == CITY_LAS_VENTURAS) { - SetPlayerInterior(playerid,0); - SetPlayerCameraPos(playerid,1310.6155,1675.9182,110.7390); - SetPlayerCameraLookAt(playerid,2285.2944,1919.3756,68.2275); - - TextDrawHideForPlayer(playerid,txtLosSantos); - TextDrawHideForPlayer(playerid,txtSanFierro); - TextDrawShowForPlayer(playerid,txtLasVenturas); - } -} - -//---------------------------------------------------------- - -ClassSel_SwitchToNextCity(playerid) -{ - gPlayerCitySelection[playerid]++; - if(gPlayerCitySelection[playerid] > CITY_LAS_VENTURAS) { - gPlayerCitySelection[playerid] = CITY_LOS_SANTOS; - } - PlayerPlaySound(playerid,1052,0.0,0.0,0.0); - gPlayerLastCitySelectionTick[playerid] = GetTickCount(); - ClassSel_SetupSelectedCity(playerid); -} - -//---------------------------------------------------------- - -ClassSel_SwitchToPreviousCity(playerid) -{ - gPlayerCitySelection[playerid]--; - if(gPlayerCitySelection[playerid] < CITY_LOS_SANTOS) { - gPlayerCitySelection[playerid] = CITY_LAS_VENTURAS; - } - PlayerPlaySound(playerid,1053,0.0,0.0,0.0); - gPlayerLastCitySelectionTick[playerid] = GetTickCount(); - ClassSel_SetupSelectedCity(playerid); -} - -//---------------------------------------------------------- - -ClassSel_HandleCitySelection(playerid) -{ - new Keys,ud,lr; - GetPlayerKeys(playerid,Keys,ud,lr); - - if(gPlayerCitySelection[playerid] == -1) { - ClassSel_SwitchToNextCity(playerid); - return; - } - - // only allow new selection every ~500 ms - if( (GetTickCount() - gPlayerLastCitySelectionTick[playerid]) < 500 ) return; - - if(Keys & KEY_FIRE) { - gPlayerHasCitySelected[playerid] = 1; - TextDrawHideForPlayer(playerid,txtClassSelHelper); - TextDrawHideForPlayer(playerid,txtLosSantos); - TextDrawHideForPlayer(playerid,txtSanFierro); - TextDrawHideForPlayer(playerid,txtLasVenturas); - TogglePlayerSpectating(playerid,0); - return; - } - - if(lr > 0) { - ClassSel_SwitchToNextCity(playerid); - } - else if(lr < 0) { - ClassSel_SwitchToPreviousCity(playerid); - } -} - -//---------------------------------------------------------- - -public OnPlayerRequestClass(playerid, classid) -{ - if(IsPlayerNPC(playerid)) return 1; - - if(gPlayerHasCitySelected[playerid]) { - ClassSel_SetupCharSelection(playerid); - return 1; - } else { - if(GetPlayerState(playerid) != PLAYER_STATE_SPECTATING) { - TogglePlayerSpectating(playerid,1); - TextDrawShowForPlayer(playerid, txtClassSelHelper); - gPlayerCitySelection[playerid] = -1; - } - } - - return 0; -} - -//---------------------------------------------------------- - -public OnGameModeInit() -{ - SetGameModeText("Grand Larceny"); - ShowPlayerMarkers(PLAYER_MARKERS_MODE_GLOBAL); - ShowNameTags(1); - SetNameTagDrawDistance(40.0); - EnableStuntBonusForAll(0); - DisableInteriorEnterExits(); - SetWeather(2); - SetWorldTime(11); - - //UsePlayerPedAnims(); - //ManualVehicleEngineAndLights(); - //LimitGlobalChatRadius(300.0); - - ClassSel_InitTextDraws(); - - // Player Class - AddPlayerClass(281,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(282,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(283,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(284,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(285,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(286,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(287,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(288,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(289,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(265,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(266,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(267,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(268,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(269,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(270,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(1,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(2,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(3,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(4,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(5,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(6,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(8,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(42,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(65,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - //AddPlayerClass(74,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(86,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(119,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(149,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(208,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(273,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(289,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - - AddPlayerClass(47,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(48,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(49,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(50,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(51,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(52,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(53,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(54,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(55,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(56,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(57,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(58,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(68,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(69,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(70,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(71,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(72,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(73,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(75,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(76,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(78,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(79,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(80,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(81,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(82,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(83,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(84,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(85,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(87,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(88,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(89,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(91,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(92,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(93,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(95,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(96,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(97,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(98,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - AddPlayerClass(99,1759.0189,-1898.1260,13.5622,266.4503,-1,-1,-1,-1,-1,-1); - - // SPECIAL - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/trains.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/pilots.txt"); - - // LAS VENTURAS - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_law.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_airport.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/lv_gen.txt"); - - // SAN FIERRO - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_law.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_airport.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/sf_gen.txt"); - - // LOS SANTOS - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_law.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_airport.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_gen_inner.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/ls_gen_outer.txt"); - - // OTHER AREAS - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/whetstone.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/bone.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/flint.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/tierra.txt"); - total_vehicles_from_files += LoadStaticVehiclesFromFile("vehicles/red_county.txt"); - - printf("Total vehicles from files: %d",total_vehicles_from_files); - - return 1; -} - -//---------------------------------------------------------- - -public OnPlayerUpdate(playerid) -{ - if(!IsPlayerConnected(playerid)) return 0; - if(IsPlayerNPC(playerid)) return 1; - - // changing cities by inputs - if( !gPlayerHasCitySelected[playerid] && - GetPlayerState(playerid) == PLAYER_STATE_SPECTATING ) { - ClassSel_HandleCitySelection(playerid); - return 1; - } - - // No weapons in interiors - if(GetPlayerInterior(playerid) != 0 && GetPlayerWeapon(playerid) != 0) { - SetPlayerArmedWeapon(playerid,0); // fists - return 0; // no syncing until they change their weapon - } - - // Don't allow minigun - if(GetPlayerWeapon(playerid) == WEAPON_MINIGUN) { - Kick(playerid); - return 0; - } - - /* No jetpacks allowed - if(GetPlayerSpecialAction(playerid) == SPECIAL_ACTION_USEJETPACK) { - Kick(playerid); - return 0; - }*/ - - /* For testing animations - new msg[128+1]; - new animlib[32+1]; - new animname[32+1]; - - thisanimid = GetPlayerAnimationIndex(playerid); - if(lastanimid != thisanimid) - { - GetAnimationName(thisanimid,animlib,32,animname,32); - format(msg, 128, "anim(%d,%d): %s %s", lastanimid, thisanimid, animlib, animname); - lastanimid = thisanimid; - SendClientMessage(playerid, 0xFFFFFFFF, msg); - }*/ - - return 1; -} - -//---------------------------------------------------------- \ No newline at end of file diff --git a/samples/Pawn/timertest.pwn b/samples/Pawn/timertest.pwn new file mode 100644 index 00000000..73f9b98c --- /dev/null +++ b/samples/Pawn/timertest.pwn @@ -0,0 +1,36 @@ +#include + +forward OneSecTimer(); + +new lasttick = 0; + +main() +{ + print("\n----------------------------------"); + print(" This is a blank GameModeScript"); + print("----------------------------------\n"); +} + +public OnGameModeInit() +{ + // Set timer of 1 second. + SetTimer("OneSecTimer", 1000, 1); + print("GameModeInit()"); + SetGameModeText("Timer Test"); + AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); + return 1; +} + +public OneSecTimer() { + + if(lasttick == 0) { + lasttick = GetTickCount(); + return; + } + new sText[256]; + format(sText,sizeof(sText),"GetTickCountOffset = %d",GetTickCount() - lasttick); + print(sText); + SendClientMessageToAll(0xFF0000, sText); + lasttick = GetTickCount(); +} + From f05c4372219c27640d207bdfb79a0a6a40827159 Mon Sep 17 00:00:00 2001 From: ziggi Date: Mon, 20 Jul 2015 10:05:11 +0300 Subject: [PATCH 008/205] Update submodule --- vendor/grammars/pawn-sublime-language | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/grammars/pawn-sublime-language b/vendor/grammars/pawn-sublime-language index 68c752d7..cd22881d 160000 --- a/vendor/grammars/pawn-sublime-language +++ b/vendor/grammars/pawn-sublime-language @@ -1 +1 @@ -Subproject commit 68c752d7d47adb9bfc27a1ce393b133d89065594 +Subproject commit cd22881d2574aa3fa7d88ff7258e0c69a3d3ae28 From ed4bbe97d16dab462faca17b26a4882e6b2496bb Mon Sep 17 00:00:00 2001 From: ziggi Date: Mon, 20 Jul 2015 12:07:27 +0300 Subject: [PATCH 009/205] Back to uppercase name --- lib/linguist/languages.yml | 18 +++++++++--------- samples/{Pawn => PAWN}/fixes.inc | 0 samples/{Pawn => PAWN}/timertest.pwn | 0 3 files changed, 9 insertions(+), 9 deletions(-) rename samples/{Pawn => PAWN}/fixes.inc (100%) rename samples/{Pawn => PAWN}/timertest.pwn (100%) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 98efa92d..c6ca3d4f 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2374,6 +2374,15 @@ Oz: tm_scope: source.oz ace_mode: text +PAWN: + type: programming + color: "#dbb284" + extensions: + - .pwn + - .inc + tm_scope: source.pawn + ace_mode: text + PHP: type: programming tm_scope: text.html.php @@ -2477,15 +2486,6 @@ Pascal: - .pp ace_mode: pascal -Pawn: - type: programming - color: "#dbb284" - extensions: - - .pwn - - .inc - tm_scope: source.pawn - ace_mode: text - Perl: type: programming tm_scope: source.perl diff --git a/samples/Pawn/fixes.inc b/samples/PAWN/fixes.inc similarity index 100% rename from samples/Pawn/fixes.inc rename to samples/PAWN/fixes.inc diff --git a/samples/Pawn/timertest.pwn b/samples/PAWN/timertest.pwn similarity index 100% rename from samples/Pawn/timertest.pwn rename to samples/PAWN/timertest.pwn From eca10056a87b6d82d1292aee746d3dfdee0c5b23 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 19 Aug 2015 17:29:35 +0200 Subject: [PATCH 010/205] Rename MemoryBlob to Blob --- lib/linguist/{memory_blob.rb => blob.rb} | 2 +- lib/linguist/file_blob.rb | 4 ++-- test/helper.rb | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) rename lib/linguist/{memory_blob.rb => blob.rb} (98%) diff --git a/lib/linguist/memory_blob.rb b/lib/linguist/blob.rb similarity index 98% rename from lib/linguist/memory_blob.rb rename to lib/linguist/blob.rb index c17cf3e2..8131d9b8 100644 --- a/lib/linguist/memory_blob.rb +++ b/lib/linguist/blob.rb @@ -4,7 +4,7 @@ module Linguist # A MemoryBlob is a wrapper around the content of a file to make it quack # like a Grit::Blob. It provides the basic interface: `name`, # `data`, `path` and `size`. - class MemoryBlob + class Blob include BlobHelper # Public: Initialize a new MemoryBlob. diff --git a/lib/linguist/file_blob.rb b/lib/linguist/file_blob.rb index 98ef3825..5f8bc373 100644 --- a/lib/linguist/file_blob.rb +++ b/lib/linguist/file_blob.rb @@ -1,11 +1,11 @@ require 'linguist/blob_helper' -require 'linguist/memory_blob' +require 'linguist/blob' module Linguist # A FileBlob is a wrapper around a File object to make it quack # like a Grit::Blob. It provides the basic interface: `name`, # `data`, `path` and `size`. - class FileBlob < MemoryBlob + class FileBlob < Blob include BlobHelper # Public: Initialize a new FileBlob from a path diff --git a/test/helper.rb b/test/helper.rb index 71594416..bac2a62c 100644 --- a/test/helper.rb +++ b/test/helper.rb @@ -3,7 +3,7 @@ require "minitest/autorun" require "mocha/setup" require "linguist" require 'color-proximity' -require "linguist/memory_blob" +require "linguist/blob" def fixtures_path File.expand_path("../fixtures", __FILE__) @@ -17,7 +17,7 @@ end def fixture_blob_memory(name) filepath = (name =~ /^\//)? name : File.join(fixtures_path, name) content = File.read(filepath) - Linguist::MemoryBlob.new(name, content) + Linguist::Blob.new(name, content) end def samples_path @@ -32,5 +32,5 @@ end def sample_blob_memory(name) filepath = (name =~ /^\//)? name : File.join(samples_path, name) content = File.read(filepath) - Linguist::MemoryBlob.new(name, content) + Linguist::Blob.new(name, content) end From 2c2b37bec3a78e30ee090894047b9d6f1302d57c Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 19 Aug 2015 18:07:42 +0200 Subject: [PATCH 011/205] Reorganize tests Rename test_memory_blob.rb to test_blob.rb for consistence with last commit --- test/test_blob.rb | 565 +++++++--------------------------- test/test_file_blob.rb | 638 ++++++++++++++++++++++++++++++++++++++- test/test_memory_blob.rb | 290 ------------------ 3 files changed, 745 insertions(+), 748 deletions(-) delete mode 100644 test/test_memory_blob.rb diff --git a/test/test_blob.rb b/test/test_blob.rb index 0a1cefe9..1ba856de 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -15,50 +15,47 @@ class TestBlob < Minitest::Test end def script_blob(name) - blob = sample_blob(name) + blob = sample_blob_memory(name) blob.instance_variable_set(:@name, 'script') blob end def test_name - assert_equal "foo.rb", sample_blob("foo.rb").name + assert_equal "foo.rb", sample_blob_memory("Ruby/foo.rb").name end def test_mime_type - assert_equal "application/postscript", fixture_blob("Binary/octocat.ai").mime_type - assert_equal "application/x-ruby", sample_blob("Ruby/grit.rb").mime_type - assert_equal "application/x-sh", sample_blob("Shell/script.sh").mime_type - assert_equal "application/xml", sample_blob("XML/bar.xml").mime_type - assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").mime_type - assert_equal "text/plain", fixture_blob("Data/README").mime_type + assert_equal "application/postscript", fixture_blob_memory("Binary/octocat.ai").mime_type + assert_equal "application/x-ruby", sample_blob_memory("Ruby/grit.rb").mime_type + assert_equal "application/x-sh", sample_blob_memory("Shell/script.sh").mime_type + assert_equal "text/plain", fixture_blob_memory("Data/README").mime_type end def test_content_type - assert_equal "application/pdf", fixture_blob("Binary/foo.pdf").content_type - assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").content_type - assert_equal "image/png", fixture_blob("Binary/foo.png").content_type - assert_equal "text/plain; charset=iso-8859-2", fixture_blob("Data/README").content_type + assert_equal "application/pdf", fixture_blob_memory("Binary/foo.pdf").content_type + assert_equal "image/png", fixture_blob_memory("Binary/foo.png").content_type + assert_equal "text/plain; charset=iso-8859-2", fixture_blob_memory("Data/README").content_type end def test_disposition - assert_equal "attachment; filename=foo+bar.jar", fixture_blob("Binary/foo bar.jar").disposition - assert_equal "attachment; filename=foo.bin", fixture_blob("Binary/foo.bin").disposition - assert_equal "attachment; filename=linguist.gem", fixture_blob("Binary/linguist.gem").disposition - assert_equal "attachment; filename=octocat.ai", fixture_blob("Binary/octocat.ai").disposition - assert_equal "inline", fixture_blob("Data/README").disposition - assert_equal "inline", sample_blob("Text/foo.txt").disposition - assert_equal "inline", sample_blob("Ruby/grit.rb").disposition - assert_equal "inline", fixture_blob("Binary/octocat.png").disposition + assert_equal "attachment; filename=foo+bar.jar", fixture_blob_memory("Binary/foo bar.jar").disposition + assert_equal "attachment; filename=foo.bin", fixture_blob_memory("Binary/foo.bin").disposition + assert_equal "attachment; filename=linguist.gem", fixture_blob_memory("Binary/linguist.gem").disposition + assert_equal "attachment; filename=octocat.ai", fixture_blob_memory("Binary/octocat.ai").disposition + assert_equal "inline", fixture_blob_memory("Data/README").disposition + assert_equal "inline", sample_blob_memory("Text/foo.txt").disposition + assert_equal "inline", sample_blob_memory("Ruby/grit.rb").disposition + assert_equal "inline", fixture_blob_memory("Binary/octocat.png").disposition end def test_data - assert_equal "module Foo\nend\n", sample_blob("Ruby/foo.rb").data + assert_equal "module Foo\nend\n", sample_blob_memory("Ruby/foo.rb").data end def test_lines - assert_equal ["module Foo", "end", ""], sample_blob("Ruby/foo.rb").lines - assert_equal ["line 1", "line 2", ""], sample_blob("Text/mac.txt").lines - assert_equal 475, sample_blob("Emacs Lisp/ess-julia.el").lines.length + assert_equal ["module Foo", "end", ""], sample_blob_memory("Ruby/foo.rb").lines + assert_equal ["line 1", "line 2", ""], sample_blob_memory("Text/mac.txt").lines + assert_equal 475, sample_blob_memory("Emacs Lisp/ess-julia.el").lines.length end def test_lines_maintains_original_encoding @@ -66,508 +63,170 @@ class TestBlob < Minitest::Test # earlier versions of the gem made implicit guarantees that the encoding of # each `line` is in the same encoding as the file was originally read (in # practice, UTF-8 or ASCII-8BIT) - assert_equal Encoding.default_external, fixture_blob("Data/utf16le").lines.first.encoding + assert_equal Encoding.default_external, fixture_blob_memory("Data/utf16le").lines.first.encoding end def test_size - assert_equal 15, sample_blob("Ruby/foo.rb").size + assert_equal 15, sample_blob_memory("Ruby/foo.rb").size end def test_loc - assert_equal 3, sample_blob("Ruby/foo.rb").loc + assert_equal 3, sample_blob_memory("Ruby/foo.rb").loc end def test_sloc - assert_equal 2, sample_blob("Ruby/foo.rb").sloc - assert_equal 3, fixture_blob("Data/utf16le-windows").sloc - assert_equal 1, fixture_blob("Data/iso8859-8-i").sloc + assert_equal 2, sample_blob_memory("Ruby/foo.rb").sloc + assert_equal 3, fixture_blob_memory("Data/utf16le-windows").sloc + assert_equal 1, fixture_blob_memory("Data/iso8859-8-i").sloc end def test_encoding - assert_equal "ISO-8859-2", fixture_blob("Data/README").encoding - assert_equal "ISO-8859-2", fixture_blob("Data/README").ruby_encoding - assert_equal "UTF-8", sample_blob("Text/foo.txt").encoding - assert_equal "UTF-8", sample_blob("Text/foo.txt").ruby_encoding - assert_equal "UTF-16LE", fixture_blob("Data/utf16le").encoding - assert_equal "UTF-16LE", fixture_blob("Data/utf16le").ruby_encoding - assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").encoding - assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").ruby_encoding - assert_equal "ISO-2022-KR", sample_blob("Text/ISO-2022-KR.txt").encoding - assert_equal "binary", sample_blob("Text/ISO-2022-KR.txt").ruby_encoding - assert_nil fixture_blob("Binary/dog.o").encoding + assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").encoding + assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").ruby_encoding + assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").encoding + assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").ruby_encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").ruby_encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").encoding + assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").ruby_encoding + assert_equal "ISO-2022-KR", sample_blob_memory("Text/ISO-2022-KR.txt").encoding + assert_equal "binary", sample_blob_memory("Text/ISO-2022-KR.txt").ruby_encoding + assert_nil fixture_blob_memory("Binary/dog.o").encoding end def test_binary - # Large blobs aren't loaded - large_blob = sample_blob("git.exe") - large_blob.instance_eval do - def data; end - end - assert large_blob.binary? - - assert fixture_blob("Binary/git.deb").binary? - assert fixture_blob("Binary/git.exe").binary? - assert fixture_blob("Binary/hello.pbc").binary? - assert fixture_blob("Binary/linguist.gem").binary? - assert fixture_blob("Binary/octocat.ai").binary? - assert fixture_blob("Binary/octocat.png").binary? - assert fixture_blob("Binary/zip").binary? - assert !fixture_blob("Data/README").binary? - assert !sample_blob("Ruby/foo.rb").binary? - assert !sample_blob("Perl/script.pl").binary? + assert fixture_blob_memory("Binary/git.deb").binary? + assert fixture_blob_memory("Binary/hello.pbc").binary? + assert fixture_blob_memory("Binary/linguist.gem").binary? + assert fixture_blob_memory("Binary/octocat.ai").binary? + assert fixture_blob_memory("Binary/octocat.png").binary? + assert fixture_blob_memory("Binary/zip").binary? + assert !fixture_blob_memory("Data/README").binary? + assert !sample_blob_memory("Ruby/foo.rb").binary? + assert !sample_blob_memory("Perl/script.pl").binary? end def test_all_binary Samples.each do |sample| - blob = sample_blob(sample[:path]) + blob = sample_blob_memory(sample[:path]) assert ! (blob.likely_binary? || blob.binary?), "#{sample[:path]} is a binary file" end end def test_text - assert fixture_blob("Data/README").text? - assert fixture_blob("Data/md").text? - assert sample_blob("Shell/script.sh").text? - assert fixture_blob("Data/txt").text? + assert fixture_blob_memory("Data/README").text? + assert fixture_blob_memory("Data/md").text? + assert sample_blob_memory("Shell/script.sh").text? + assert fixture_blob_memory("Data/txt").text? end def test_image - assert fixture_blob("Binary/octocat.gif").image? - assert fixture_blob("Binary/octocat.jpeg").image? - assert fixture_blob("Binary/octocat.jpg").image? - assert fixture_blob("Binary/octocat.png").image? - assert !fixture_blob("Binary/octocat.ai").image? - assert !fixture_blob("Binary/octocat.psd").image? + assert fixture_blob_memory("Binary/octocat.png").image? + assert !fixture_blob_memory("Binary/octocat.ai").image? + assert !fixture_blob_memory("Binary/octocat.psd").image? end def test_solid - assert fixture_blob("Binary/cube.stl").solid? - assert fixture_blob("Data/cube.stl").solid? + assert fixture_blob_memory("Binary/cube.stl").solid? + assert fixture_blob_memory("Data/cube.stl").solid? end def test_csv - assert fixture_blob("Data/cars.csv").csv? + assert fixture_blob_memory("Data/cars.csv").csv? end def test_pdf - assert fixture_blob("Binary/foo.pdf").pdf? + assert fixture_blob_memory("Binary/foo.pdf").pdf? end def test_viewable - assert fixture_blob("Data/README").viewable? - assert sample_blob("Ruby/foo.rb").viewable? - assert sample_blob("Perl/script.pl").viewable? - assert !fixture_blob("Binary/linguist.gem").viewable? - assert !fixture_blob("Binary/octocat.ai").viewable? - assert !fixture_blob("Binary/octocat.png").viewable? + assert fixture_blob_memory("Data/README").viewable? + assert sample_blob_memory("Ruby/foo.rb").viewable? + assert sample_blob_memory("Perl/script.pl").viewable? + assert !fixture_blob_memory("Binary/linguist.gem").viewable? + assert !fixture_blob_memory("Binary/octocat.ai").viewable? + assert !fixture_blob_memory("Binary/octocat.png").viewable? end def test_generated - assert !fixture_blob("Data/README").generated? - - # Xcode project files - assert !sample_blob("XML/MainMenu.xib").generated? - assert fixture_blob("Binary/MainMenu.nib").generated? - assert !sample_blob("XML/project.pbxproj").generated? - - # Gemfile.lock is NOT generated - assert !sample_blob("Gemfile.lock").generated? + assert !fixture_blob_memory("Data/README").generated? # Generated .NET Docfiles - assert sample_blob("XML/net_docfile.xml").generated? + assert sample_blob_memory("XML/net_docfile.xml").generated? # Long line - assert !sample_blob("JavaScript/uglify.js").generated? + assert !sample_blob_memory("JavaScript/uglify.js").generated? # Inlined JS, but mostly code - assert !sample_blob("JavaScript/json2_backbone.js").generated? + assert !sample_blob_memory("JavaScript/json2_backbone.js").generated? # Minified JS - assert !sample_blob("JavaScript/jquery-1.6.1.js").generated? - assert sample_blob("JavaScript/jquery-1.6.1.min.js").generated? - assert sample_blob("JavaScript/jquery-1.4.2.min.js").generated? - - # CoffeeScript-generated JS - # TODO - - # TypeScript-generated JS - # TODO + assert !sample_blob_memory("JavaScript/jquery-1.6.1.js").generated? + assert sample_blob_memory("JavaScript/jquery-1.6.1.min.js").generated? + assert sample_blob_memory("JavaScript/jquery-1.4.2.min.js").generated? # Composer generated composer.lock file - assert sample_blob("JSON/composer.lock").generated? + assert sample_blob_memory("JSON/composer.lock").generated? # PEG.js-generated parsers - assert sample_blob("JavaScript/parser.js").generated? + assert sample_blob_memory("JavaScript/parser.js").generated? # Generated PostScript - assert !sample_blob("PostScript/sierpinski.ps").generated? + assert !sample_blob_memory("PostScript/sierpinski.ps").generated? # These examples are too basic to tell - assert !sample_blob("JavaScript/hello.js").generated? + assert !sample_blob_memory("JavaScript/hello.js").generated? - assert sample_blob("JavaScript/intro-old.js").generated? - assert sample_blob("JavaScript/classes-old.js").generated? + assert sample_blob_memory("JavaScript/intro-old.js").generated? + assert sample_blob_memory("JavaScript/classes-old.js").generated? - assert sample_blob("JavaScript/intro.js").generated? - assert sample_blob("JavaScript/classes.js").generated? + assert sample_blob_memory("JavaScript/intro.js").generated? + assert sample_blob_memory("JavaScript/classes.js").generated? # Protocol Buffer generated code - assert sample_blob("C++/protocol-buffer.pb.h").generated? - assert sample_blob("C++/protocol-buffer.pb.cc").generated? - assert sample_blob("Java/ProtocolBuffer.java").generated? - assert sample_blob("Python/protocol_buffer_pb2.py").generated? - assert sample_blob("Go/api.pb.go").generated? - assert sample_blob("Go/embedded.go").generated? + assert sample_blob_memory("C++/protocol-buffer.pb.h").generated? + assert sample_blob_memory("C++/protocol-buffer.pb.cc").generated? + assert sample_blob_memory("Java/ProtocolBuffer.java").generated? + assert sample_blob_memory("Python/protocol_buffer_pb2.py").generated? + assert sample_blob_memory("Go/api.pb.go").generated? + assert sample_blob_memory("Go/embedded.go").generated? # Apache Thrift generated code - assert sample_blob("Python/gen-py-linguist-thrift.py").generated? - assert sample_blob("Go/gen-go-linguist-thrift.go").generated? - assert sample_blob("Java/gen-java-linguist-thrift.java").generated? - assert sample_blob("JavaScript/gen-js-linguist-thrift.js").generated? - assert sample_blob("Ruby/gen-rb-linguist-thrift.rb").generated? - assert sample_blob("Objective-C/gen-cocoa-linguist-thrift.m").generated? + assert sample_blob_memory("Python/gen-py-linguist-thrift.py").generated? + assert sample_blob_memory("Go/gen-go-linguist-thrift.go").generated? + assert sample_blob_memory("Java/gen-java-linguist-thrift.java").generated? + assert sample_blob_memory("JavaScript/gen-js-linguist-thrift.js").generated? + assert sample_blob_memory("Ruby/gen-rb-linguist-thrift.rb").generated? + assert sample_blob_memory("Objective-C/gen-cocoa-linguist-thrift.m").generated? # Generated JNI - assert sample_blob("C/jni_layer.h").generated? + assert sample_blob_memory("C/jni_layer.h").generated? # Minified CSS - assert !sample_blob("CSS/bootstrap.css").generated? - assert sample_blob("CSS/bootstrap.min.css").generated? + assert !sample_blob_memory("CSS/bootstrap.css").generated? + assert sample_blob_memory("CSS/bootstrap.min.css").generated? # Generated VCR - assert sample_blob("YAML/vcr_cassette.yml").generated? + assert sample_blob_memory("YAML/vcr_cassette.yml").generated? # Generated by Zephir - assert sample_blob("Zephir/filenames/exception.zep.c").generated? - assert sample_blob("Zephir/filenames/exception.zep.h").generated? - assert sample_blob("Zephir/filenames/exception.zep.php").generated? - assert !sample_blob("Zephir/Router.zep").generated? - - assert sample_blob("node_modules/grunt/lib/grunt.js").generated? - - # Godep saved dependencies - assert sample_blob("Godeps/Godeps.json").generated? - assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").generated? + assert !sample_blob_memory("Zephir/Router.zep").generated? # Cython-generated C/C++ - assert sample_blob("C/sgd_fast.c").generated? - assert sample_blob("C++/wrapper_inner.cpp").generated? + assert sample_blob_memory("C/sgd_fast.c").generated? + assert sample_blob_memory("C++/wrapper_inner.cpp").generated? # Unity3D-generated metadata - assert sample_blob("Unity3D Asset/Tiles.meta").generated? + assert sample_blob_memory("Unity3D Asset/Tiles.meta").generated? end def test_vendored - assert !fixture_blob("Data/README").vendored? - assert !sample_blob("ext/extconf.rb").vendored? - - # Dependencies - assert sample_blob("dependencies/windows/headers/GL/glext.h").vendored? - - # Node dependencies - assert sample_blob("node_modules/coffee-script/lib/coffee-script.js").vendored? - - # Bower Components - assert sample_blob("bower_components/custom/custom.js").vendored? - assert sample_blob("app/bower_components/custom/custom.js").vendored? - assert sample_blob("vendor/assets/bower_components/custom/custom.js").vendored? - - # Go dependencies - assert !sample_blob("Godeps/Godeps.json").vendored? - assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").vendored? - - # Rails vendor/ - assert sample_blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored? - - # Vendor/ - assert sample_blob("Vendor/my_great_file.h").vendored? - - # 'thirdparty' directory - assert sample_blob("thirdparty/lib/main.c").vendored? - - # 'extern(al)' directory - assert sample_blob("extern/util/__init__.py").vendored? - assert sample_blob("external/jquery.min.js").vendored? - - # C deps - assert sample_blob("deps/http_parser/http_parser.c").vendored? - assert sample_blob("deps/v8/src/v8.h").vendored? - - assert sample_blob("tools/something/else.c").vendored? - - # Chart.js - assert sample_blob("some/vendored/path/Chart.js").vendored? - assert !sample_blob("some/vendored/path/chart.js").vendored? - - # Codemirror deps - assert sample_blob("codemirror/mode/blah.js").vendored? - - # Debian packaging - assert sample_blob("debian/cron.d").vendored? - - # Erlang - assert sample_blob("rebar").vendored? - - # git config files - - assert_predicate fixture_blob("some/path/.gitattributes"), :vendored? - assert_predicate fixture_blob(".gitignore"), :vendored? - assert_predicate fixture_blob("special/path/.gitmodules"), :vendored? - - # Minified JavaScript and CSS - assert sample_blob("foo.min.js").vendored? - assert sample_blob("foo.min.css").vendored? - assert sample_blob("foo-min.js").vendored? - assert sample_blob("foo-min.css").vendored? - assert !sample_blob("foomin.css").vendored? - assert !sample_blob("foo.min.txt").vendored? - - #.osx - assert sample_blob(".osx").vendored? - - # Prototype - assert !sample_blob("public/javascripts/application.js").vendored? - assert sample_blob("public/javascripts/prototype.js").vendored? - assert sample_blob("public/javascripts/effects.js").vendored? - assert sample_blob("public/javascripts/controls.js").vendored? - assert sample_blob("public/javascripts/dragdrop.js").vendored? - - # jQuery - assert sample_blob("jquery.js").vendored? - assert sample_blob("public/javascripts/jquery.js").vendored? - assert sample_blob("public/javascripts/jquery.min.js").vendored? - assert sample_blob("public/javascripts/jquery-1.7.js").vendored? - assert sample_blob("public/javascripts/jquery-1.7.min.js").vendored? - assert sample_blob("public/javascripts/jquery-1.5.2.js").vendored? - assert sample_blob("public/javascripts/jquery-1.6.1.js").vendored? - assert sample_blob("public/javascripts/jquery-1.6.1.min.js").vendored? - assert sample_blob("public/javascripts/jquery-1.10.1.js").vendored? - assert sample_blob("public/javascripts/jquery-1.10.1.min.js").vendored? - assert !sample_blob("public/javascripts/jquery.github.menu.js").vendored? - - # jQuery UI - assert sample_blob("themes/ui-lightness/jquery-ui.css").vendored? - assert sample_blob("themes/ui-lightness/jquery-ui-1.8.22.custom.css").vendored? - assert sample_blob("themes/ui-lightness/jquery.ui.accordion.css").vendored? - assert sample_blob("ui/i18n/jquery.ui.datepicker-ar.js").vendored? - assert sample_blob("ui/i18n/jquery-ui-i18n.js").vendored? - assert sample_blob("ui/jquery.effects.blind.js").vendored? - assert sample_blob("ui/jquery-ui-1.8.22.custom.js").vendored? - assert sample_blob("ui/jquery-ui-1.8.22.custom.min.js").vendored? - assert sample_blob("ui/jquery-ui-1.8.22.js").vendored? - assert sample_blob("ui/jquery-ui-1.8.js").vendored? - assert sample_blob("ui/jquery-ui.min.js").vendored? - assert sample_blob("ui/jquery.ui.accordion.js").vendored? - assert sample_blob("ui/minified/jquery.effects.blind.min.js").vendored? - assert sample_blob("ui/minified/jquery.ui.accordion.min.js").vendored? - - # MooTools - assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat.js").vendored? - assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat-yc.js").vendored? - - # Dojo - assert sample_blob("public/javascripts/dojo.js").vendored? - - # MochiKit - assert sample_blob("public/javascripts/MochiKit.js").vendored? - - # YUI - assert sample_blob("public/javascripts/yahoo-dom-event.js").vendored? - assert sample_blob("public/javascripts/yahoo-min.js").vendored? - assert sample_blob("public/javascripts/yuiloader-dom-event.js").vendored? - - # WYS editors - assert sample_blob("public/javascripts/ckeditor.js").vendored? - assert sample_blob("public/javascripts/tiny_mce.js").vendored? - assert sample_blob("public/javascripts/tiny_mce_popup.js").vendored? - assert sample_blob("public/javascripts/tiny_mce_src.js").vendored? - - # AngularJS - assert sample_blob("public/javascripts/angular.js").vendored? - assert sample_blob("public/javascripts/angular.min.js").vendored? - - # D3.js - assert sample_blob("public/javascripts/d3.v3.js").vendored? - assert sample_blob("public/javascripts/d3.v3.min.js").vendored? - - # Modernizr - assert sample_blob("public/javascripts/modernizr-2.7.1.js").vendored? - assert sample_blob("public/javascripts/modernizr.custom.01009.js").vendored? - - # Fabric - assert sample_blob("fabfile.py").vendored? - - # WAF - assert sample_blob("waf").vendored? - - # Visual Studio IntelliSense - assert sample_blob("Scripts/jquery-1.7-vsdoc.js").vendored? - - # Microsoft Ajax - assert sample_blob("Scripts/MicrosoftAjax.debug.js").vendored? - assert sample_blob("Scripts/MicrosoftAjax.js").vendored? - assert sample_blob("Scripts/MicrosoftMvcAjax.debug.js").vendored? - assert sample_blob("Scripts/MicrosoftMvcAjax.js").vendored? - assert sample_blob("Scripts/MicrosoftMvcValidation.debug.js").vendored? - assert sample_blob("Scripts/MicrosoftMvcValidation.js").vendored? - - # jQuery validation plugin (MS bundles this with asp.net mvc) - assert sample_blob("Scripts/jquery.validate.js").vendored? - assert sample_blob("Scripts/jquery.validate.min.js").vendored? - assert sample_blob("Scripts/jquery.validate.unobtrusive.js").vendored? - assert sample_blob("Scripts/jquery.validate.unobtrusive.min.js").vendored? - assert sample_blob("Scripts/jquery.unobtrusive-ajax.js").vendored? - assert sample_blob("Scripts/jquery.unobtrusive-ajax.min.js").vendored? - - # NuGet Packages - assert sample_blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored? - - # Font Awesome - assert sample_blob("some/asset/path/font-awesome.min.css").vendored? - assert sample_blob("some/asset/path/font-awesome.css").vendored? - - # Normalize - assert sample_blob("some/asset/path/normalize.css").vendored? - - # Carthage - assert sample_blob('Carthage/blah').vendored? - - # Cocoapods - assert sample_blob('Pods/blah').vendored? - - # Html5shiv - assert sample_blob("Scripts/html5shiv.js").vendored? - assert sample_blob("Scripts/html5shiv.min.js").vendored? - - # Test fixtures - assert sample_blob("test/fixtures/random.rkt").vendored? - assert sample_blob("Test/fixtures/random.rkt").vendored? - assert sample_blob("tests/fixtures/random.rkt").vendored? - - # Cordova/PhoneGap - assert sample_blob("cordova.js").vendored? - assert sample_blob("cordova.min.js").vendored? - assert sample_blob("cordova-2.1.0.js").vendored? - assert sample_blob("cordova-2.1.0.min.js").vendored? - - # Foundation js - assert sample_blob("foundation.js").vendored? - assert sample_blob("foundation.min.js").vendored? - assert sample_blob("foundation.abide.js").vendored? - - # Vagrant - assert sample_blob("Vagrantfile").vendored? - - # Gradle - assert sample_blob("gradlew").vendored? - assert sample_blob("gradlew.bat").vendored? - assert sample_blob("gradle/wrapper/gradle-wrapper.properties").vendored? - assert sample_blob("subproject/gradlew").vendored? - assert sample_blob("subproject/gradlew.bat").vendored? - assert sample_blob("subproject/gradle/wrapper/gradle-wrapper.properties").vendored? - - # Octicons - assert sample_blob("octicons.css").vendored? - assert sample_blob("public/octicons.min.css").vendored? - assert sample_blob("public/octicons/sprockets-octicons.scss").vendored? - - # Typesafe Activator - assert sample_blob("activator").vendored? - assert sample_blob("activator.bat").vendored? - assert sample_blob("subproject/activator").vendored? - assert sample_blob("subproject/activator.bat").vendored? - - assert_predicate fixture_blob(".google_apis/bar.jar"), :vendored? - assert_predicate fixture_blob("foo/.google_apis/bar.jar"), :vendored? - - # Sphinx docs - assert sample_blob("docs/_build/asset.doc").vendored? - assert sample_blob("docs/theme/file.css").vendored? - - # Vagrant - assert sample_blob("puphpet/file.pp").vendored? - - # Fabric.io - assert sample_blob("Fabric.framework/Fabric.h").vendored? - - # Crashlytics - assert sample_blob("Crashlytics.framework/Crashlytics.h").vendored? - end - - def test_documentation - assert_predicate fixture_blob("doc/foo.html"), :documentation? - assert_predicate fixture_blob("docs/foo.html"), :documentation? - refute_predicate fixture_blob("project/doc/foo.html"), :documentation? - refute_predicate fixture_blob("project/docs/foo.html"), :documentation? - - assert_predicate fixture_blob("Documentation/foo.md"), :documentation? - assert_predicate fixture_blob("documentation/foo.md"), :documentation? - assert_predicate fixture_blob("project/Documentation/foo.md"), :documentation? - assert_predicate fixture_blob("project/documentation/foo.md"), :documentation? - - assert_predicate fixture_blob("javadoc/foo.html"), :documentation? - assert_predicate fixture_blob("project/javadoc/foo.html"), :documentation? - - assert_predicate fixture_blob("man/foo.html"), :documentation? - refute_predicate fixture_blob("project/man/foo.html"), :documentation? - - assert_predicate fixture_blob("README"), :documentation? - assert_predicate fixture_blob("README.md"), :documentation? - assert_predicate fixture_blob("README.txt"), :documentation? - assert_predicate fixture_blob("Readme"), :documentation? - assert_predicate fixture_blob("readme"), :documentation? - assert_predicate fixture_blob("foo/README"), :documentation? - - assert_predicate fixture_blob("CHANGE"), :documentation? - assert_predicate fixture_blob("CHANGE.md"), :documentation? - assert_predicate fixture_blob("CHANGE.txt"), :documentation? - assert_predicate fixture_blob("foo/CHANGE"), :documentation? - - assert_predicate fixture_blob("CHANGELOG"), :documentation? - assert_predicate fixture_blob("CHANGELOG.md"), :documentation? - assert_predicate fixture_blob("CHANGELOG.txt"), :documentation? - assert_predicate fixture_blob("foo/CHANGELOG"), :documentation? - - assert_predicate fixture_blob("CHANGES"), :documentation? - assert_predicate fixture_blob("CHANGES.md"), :documentation? - assert_predicate fixture_blob("CHANGES.txt"), :documentation? - assert_predicate fixture_blob("foo/CHANGES"), :documentation? - - assert_predicate fixture_blob("CONTRIBUTING"), :documentation? - assert_predicate fixture_blob("CONTRIBUTING.md"), :documentation? - assert_predicate fixture_blob("CONTRIBUTING.txt"), :documentation? - assert_predicate fixture_blob("foo/CONTRIBUTING"), :documentation? - - assert_predicate fixture_blob("examples/some-file.pl"), :documentation? - assert_predicate fixture_blob("Examples/some-example-file.rb"), :documentation? - - assert_predicate fixture_blob("LICENSE"), :documentation? - assert_predicate fixture_blob("LICENCE.md"), :documentation? - assert_predicate fixture_blob("License.txt"), :documentation? - assert_predicate fixture_blob("LICENSE.txt"), :documentation? - assert_predicate fixture_blob("foo/LICENSE"), :documentation? - - assert_predicate fixture_blob("COPYING"), :documentation? - assert_predicate fixture_blob("COPYING.md"), :documentation? - assert_predicate fixture_blob("COPYING.txt"), :documentation? - assert_predicate fixture_blob("foo/COPYING"), :documentation? - - assert_predicate fixture_blob("INSTALL"), :documentation? - assert_predicate fixture_blob("INSTALL.md"), :documentation? - assert_predicate fixture_blob("INSTALL.txt"), :documentation? - assert_predicate fixture_blob("foo/INSTALL"), :documentation? - - refute_predicate fixture_blob("foo.md"), :documentation? - - # Samples - assert sample_blob("Samples/Ruby/foo.rb").documentation? - - assert_predicate fixture_blob("INSTALL.txt"), :documentation? + assert !fixture_blob_memory("Data/README").vendored? end def test_language Samples.each do |sample| - blob = sample_blob(sample[:path]) + blob = sample_blob_memory(sample[:path]) assert blob.language, "No language for #{sample[:path]}" assert_equal sample[:language], blob.language.name, blob.name end @@ -586,7 +245,7 @@ class TestBlob < Minitest::Test filepath = File.join(dirname, filename) next unless File.file?(filepath) - blob = fixture_blob(filepath) + blob = fixture_blob_memory(filepath) if language == 'Data' assert blob.language.nil?, "A language was found for #{filepath}" elsif language == 'Generated' @@ -600,7 +259,7 @@ class TestBlob < Minitest::Test end def test_minified_files_not_safe_to_highlight - assert !sample_blob("JavaScript/jquery-1.6.1.min.js").safe_to_colorize? + assert !sample_blob_memory("JavaScript/jquery-1.6.1.min.js").safe_to_colorize? end def test_empty @@ -613,27 +272,19 @@ class TestBlob < Minitest::Test end def test_include_in_language_stats - vendored = sample_blob("bower_components/custom/custom.js") - assert_predicate vendored, :vendored? - refute_predicate vendored, :include_in_language_stats? - - documentation = fixture_blob("README") - assert_predicate documentation, :documentation? - refute_predicate documentation, :include_in_language_stats? - - generated = sample_blob("CSS/bootstrap.min.css") + generated = sample_blob_memory("CSS/bootstrap.min.css") assert_predicate generated, :generated? refute_predicate generated, :include_in_language_stats? - data = sample_blob("Ant Build System/filenames/ant.xml") + data = sample_blob_memory("Ant Build System/filenames/ant.xml") assert_equal :data, data.language.type refute_predicate data, :include_in_language_stats? - prose = sample_blob("Markdown/tender.md") + prose = sample_blob_memory("Markdown/tender.md") assert_equal :prose, prose.language.type refute_predicate prose, :include_in_language_stats? - included = sample_blob("HTML/pages.html") + included = sample_blob_memory("HTML/pages.html") assert_predicate included, :include_in_language_stats? end end diff --git a/test/test_file_blob.rb b/test/test_file_blob.rb index 30d483fe..0ed58807 100644 --- a/test/test_file_blob.rb +++ b/test/test_file_blob.rb @@ -1,9 +1,645 @@ require_relative "./helper" -class TestFileBlob < Minitest::Test +class TestBlob < Minitest::Test + include Linguist + + def setup + # git blobs are normally loaded as ASCII-8BIT since they may contain data + # with arbitrary encoding not known ahead of time + @original_external = Encoding.default_external + Encoding.default_external = Encoding.find("ASCII-8BIT") + end + + def teardown + Encoding.default_external = @original_external + end + + def script_blob(name) + blob = sample_blob(name) + blob.instance_variable_set(:@name, 'script') + blob + end + def test_extensions assert_equal [".gitignore"], Linguist::FileBlob.new(".gitignore").extensions assert_equal [".xml"], Linguist::FileBlob.new("build.xml").extensions assert_equal [".html.erb", ".erb"], Linguist::FileBlob.new("dotted.dir/index.html.erb").extensions end + + def test_name + assert_equal "foo.rb", sample_blob("foo.rb").name + end + + def test_mime_type + assert_equal "application/postscript", fixture_blob("Binary/octocat.ai").mime_type + assert_equal "application/x-ruby", sample_blob("Ruby/grit.rb").mime_type + assert_equal "application/x-sh", sample_blob("Shell/script.sh").mime_type + assert_equal "application/xml", sample_blob("XML/bar.xml").mime_type + assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").mime_type + assert_equal "text/plain", fixture_blob("Data/README").mime_type + end + + def test_content_type + assert_equal "application/pdf", fixture_blob("Binary/foo.pdf").content_type + assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").content_type + assert_equal "image/png", fixture_blob("Binary/foo.png").content_type + assert_equal "text/plain; charset=iso-8859-2", fixture_blob("Data/README").content_type + end + + def test_disposition + assert_equal "attachment; filename=foo+bar.jar", fixture_blob("Binary/foo bar.jar").disposition + assert_equal "attachment; filename=foo.bin", fixture_blob("Binary/foo.bin").disposition + assert_equal "attachment; filename=linguist.gem", fixture_blob("Binary/linguist.gem").disposition + assert_equal "attachment; filename=octocat.ai", fixture_blob("Binary/octocat.ai").disposition + assert_equal "inline", fixture_blob("Data/README").disposition + assert_equal "inline", sample_blob("Text/foo.txt").disposition + assert_equal "inline", sample_blob("Ruby/grit.rb").disposition + assert_equal "inline", fixture_blob("Binary/octocat.png").disposition + end + + def test_data + assert_equal "module Foo\nend\n", sample_blob("Ruby/foo.rb").data + end + + def test_lines + assert_equal ["module Foo", "end", ""], sample_blob("Ruby/foo.rb").lines + assert_equal ["line 1", "line 2", ""], sample_blob("Text/mac.txt").lines + assert_equal 475, sample_blob("Emacs Lisp/ess-julia.el").lines.length + end + + def test_lines_maintains_original_encoding + # Even if the file's encoding is detected as something like UTF-16LE, + # earlier versions of the gem made implicit guarantees that the encoding of + # each `line` is in the same encoding as the file was originally read (in + # practice, UTF-8 or ASCII-8BIT) + assert_equal Encoding.default_external, fixture_blob("Data/utf16le").lines.first.encoding + end + + def test_size + assert_equal 15, sample_blob("Ruby/foo.rb").size + end + + def test_loc + assert_equal 3, sample_blob("Ruby/foo.rb").loc + end + + def test_sloc + assert_equal 2, sample_blob("Ruby/foo.rb").sloc + assert_equal 3, fixture_blob("Data/utf16le-windows").sloc + assert_equal 1, fixture_blob("Data/iso8859-8-i").sloc + end + + def test_encoding + assert_equal "ISO-8859-2", fixture_blob("Data/README").encoding + assert_equal "ISO-8859-2", fixture_blob("Data/README").ruby_encoding + assert_equal "UTF-8", sample_blob("Text/foo.txt").encoding + assert_equal "UTF-8", sample_blob("Text/foo.txt").ruby_encoding + assert_equal "UTF-16LE", fixture_blob("Data/utf16le").encoding + assert_equal "UTF-16LE", fixture_blob("Data/utf16le").ruby_encoding + assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").encoding + assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").ruby_encoding + assert_equal "ISO-2022-KR", sample_blob("Text/ISO-2022-KR.txt").encoding + assert_equal "binary", sample_blob("Text/ISO-2022-KR.txt").ruby_encoding + assert_nil fixture_blob("Binary/dog.o").encoding + end + + def test_binary + # Large blobs aren't loaded + large_blob = sample_blob("git.exe") + large_blob.instance_eval do + def data; end + end + assert large_blob.binary? + + assert fixture_blob("Binary/git.deb").binary? + assert fixture_blob("Binary/git.exe").binary? + assert fixture_blob("Binary/hello.pbc").binary? + assert fixture_blob("Binary/linguist.gem").binary? + assert fixture_blob("Binary/octocat.ai").binary? + assert fixture_blob("Binary/octocat.png").binary? + assert fixture_blob("Binary/zip").binary? + assert !fixture_blob("Data/README").binary? + assert !sample_blob("Ruby/foo.rb").binary? + assert !sample_blob("Perl/script.pl").binary? + end + + def test_all_binary + Samples.each do |sample| + blob = sample_blob(sample[:path]) + assert ! (blob.likely_binary? || blob.binary?), "#{sample[:path]} is a binary file" + end + end + + def test_text + assert fixture_blob("Data/README").text? + assert fixture_blob("Data/md").text? + assert sample_blob("Shell/script.sh").text? + assert fixture_blob("Data/txt").text? + end + + def test_image + assert fixture_blob("Binary/octocat.gif").image? + assert fixture_blob("Binary/octocat.jpeg").image? + assert fixture_blob("Binary/octocat.jpg").image? + assert fixture_blob("Binary/octocat.png").image? + assert !fixture_blob("Binary/octocat.ai").image? + assert !fixture_blob("Binary/octocat.psd").image? + end + + def test_solid + assert fixture_blob("Binary/cube.stl").solid? + assert fixture_blob("Data/cube.stl").solid? + end + + def test_csv + assert fixture_blob("Data/cars.csv").csv? + end + + def test_pdf + assert fixture_blob("Binary/foo.pdf").pdf? + end + + def test_viewable + assert fixture_blob("Data/README").viewable? + assert sample_blob("Ruby/foo.rb").viewable? + assert sample_blob("Perl/script.pl").viewable? + assert !fixture_blob("Binary/linguist.gem").viewable? + assert !fixture_blob("Binary/octocat.ai").viewable? + assert !fixture_blob("Binary/octocat.png").viewable? + end + + def test_generated + assert !fixture_blob("Data/README").generated? + + # Xcode project files + assert !sample_blob("XML/MainMenu.xib").generated? + assert fixture_blob("Binary/MainMenu.nib").generated? + assert !sample_blob("XML/project.pbxproj").generated? + + # Gemfile.lock is NOT generated + assert !sample_blob("Gemfile.lock").generated? + + # Generated .NET Docfiles + assert sample_blob("XML/net_docfile.xml").generated? + + # Long line + assert !sample_blob("JavaScript/uglify.js").generated? + + # Inlined JS, but mostly code + assert !sample_blob("JavaScript/json2_backbone.js").generated? + + # Minified JS + assert !sample_blob("JavaScript/jquery-1.6.1.js").generated? + assert sample_blob("JavaScript/jquery-1.6.1.min.js").generated? + assert sample_blob("JavaScript/jquery-1.4.2.min.js").generated? + + # CoffeeScript-generated JS + # TODO + + # TypeScript-generated JS + # TODO + + # Composer generated composer.lock file + assert sample_blob("JSON/composer.lock").generated? + + # PEG.js-generated parsers + assert sample_blob("JavaScript/parser.js").generated? + + # Generated PostScript + assert !sample_blob("PostScript/sierpinski.ps").generated? + + # These examples are too basic to tell + assert !sample_blob("JavaScript/hello.js").generated? + + assert sample_blob("JavaScript/intro-old.js").generated? + assert sample_blob("JavaScript/classes-old.js").generated? + + assert sample_blob("JavaScript/intro.js").generated? + assert sample_blob("JavaScript/classes.js").generated? + + # Protocol Buffer generated code + assert sample_blob("C++/protocol-buffer.pb.h").generated? + assert sample_blob("C++/protocol-buffer.pb.cc").generated? + assert sample_blob("Java/ProtocolBuffer.java").generated? + assert sample_blob("Python/protocol_buffer_pb2.py").generated? + assert sample_blob("Go/api.pb.go").generated? + assert sample_blob("Go/embedded.go").generated? + + # Apache Thrift generated code + assert sample_blob("Python/gen-py-linguist-thrift.py").generated? + assert sample_blob("Go/gen-go-linguist-thrift.go").generated? + assert sample_blob("Java/gen-java-linguist-thrift.java").generated? + assert sample_blob("JavaScript/gen-js-linguist-thrift.js").generated? + assert sample_blob("Ruby/gen-rb-linguist-thrift.rb").generated? + assert sample_blob("Objective-C/gen-cocoa-linguist-thrift.m").generated? + + # Generated JNI + assert sample_blob("C/jni_layer.h").generated? + + # Minified CSS + assert !sample_blob("CSS/bootstrap.css").generated? + assert sample_blob("CSS/bootstrap.min.css").generated? + + # Generated VCR + assert sample_blob("YAML/vcr_cassette.yml").generated? + + # Generated by Zephir + assert sample_blob("Zephir/filenames/exception.zep.c").generated? + assert sample_blob("Zephir/filenames/exception.zep.h").generated? + assert sample_blob("Zephir/filenames/exception.zep.php").generated? + assert !sample_blob("Zephir/Router.zep").generated? + + assert sample_blob("node_modules/grunt/lib/grunt.js").generated? + + # Godep saved dependencies + assert sample_blob("Godeps/Godeps.json").generated? + assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").generated? + + # Cython-generated C/C++ + assert sample_blob("C/sgd_fast.c").generated? + assert sample_blob("C++/wrapper_inner.cpp").generated? + + # Unity3D-generated metadata + assert sample_blob("Unity3D Asset/Tiles.meta").generated? + end + + def test_vendored + assert !fixture_blob("Data/README").vendored? + assert !sample_blob("ext/extconf.rb").vendored? + + # Dependencies + assert sample_blob("dependencies/windows/headers/GL/glext.h").vendored? + + # Node dependencies + assert sample_blob("node_modules/coffee-script/lib/coffee-script.js").vendored? + + # Bower Components + assert sample_blob("bower_components/custom/custom.js").vendored? + assert sample_blob("app/bower_components/custom/custom.js").vendored? + assert sample_blob("vendor/assets/bower_components/custom/custom.js").vendored? + + # Go dependencies + assert !sample_blob("Godeps/Godeps.json").vendored? + assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").vendored? + + # Rails vendor/ + assert sample_blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored? + + # Vendor/ + assert sample_blob("Vendor/my_great_file.h").vendored? + + # 'thirdparty' directory + assert sample_blob("thirdparty/lib/main.c").vendored? + + # 'extern(al)' directory + assert sample_blob("extern/util/__init__.py").vendored? + assert sample_blob("external/jquery.min.js").vendored? + + # C deps + assert sample_blob("deps/http_parser/http_parser.c").vendored? + assert sample_blob("deps/v8/src/v8.h").vendored? + + assert sample_blob("tools/something/else.c").vendored? + + # Chart.js + assert sample_blob("some/vendored/path/Chart.js").vendored? + assert !sample_blob("some/vendored/path/chart.js").vendored? + + # Codemirror deps + assert sample_blob("codemirror/mode/blah.js").vendored? + + # Debian packaging + assert sample_blob("debian/cron.d").vendored? + + # Erlang + assert sample_blob("rebar").vendored? + + # git config files + + assert_predicate fixture_blob("some/path/.gitattributes"), :vendored? + assert_predicate fixture_blob(".gitignore"), :vendored? + assert_predicate fixture_blob("special/path/.gitmodules"), :vendored? + + # Minified JavaScript and CSS + assert sample_blob("foo.min.js").vendored? + assert sample_blob("foo.min.css").vendored? + assert sample_blob("foo-min.js").vendored? + assert sample_blob("foo-min.css").vendored? + assert !sample_blob("foomin.css").vendored? + assert !sample_blob("foo.min.txt").vendored? + + #.osx + assert sample_blob(".osx").vendored? + + # Prototype + assert !sample_blob("public/javascripts/application.js").vendored? + assert sample_blob("public/javascripts/prototype.js").vendored? + assert sample_blob("public/javascripts/effects.js").vendored? + assert sample_blob("public/javascripts/controls.js").vendored? + assert sample_blob("public/javascripts/dragdrop.js").vendored? + + # jQuery + assert sample_blob("jquery.js").vendored? + assert sample_blob("public/javascripts/jquery.js").vendored? + assert sample_blob("public/javascripts/jquery.min.js").vendored? + assert sample_blob("public/javascripts/jquery-1.7.js").vendored? + assert sample_blob("public/javascripts/jquery-1.7.min.js").vendored? + assert sample_blob("public/javascripts/jquery-1.5.2.js").vendored? + assert sample_blob("public/javascripts/jquery-1.6.1.js").vendored? + assert sample_blob("public/javascripts/jquery-1.6.1.min.js").vendored? + assert sample_blob("public/javascripts/jquery-1.10.1.js").vendored? + assert sample_blob("public/javascripts/jquery-1.10.1.min.js").vendored? + assert !sample_blob("public/javascripts/jquery.github.menu.js").vendored? + + # jQuery UI + assert sample_blob("themes/ui-lightness/jquery-ui.css").vendored? + assert sample_blob("themes/ui-lightness/jquery-ui-1.8.22.custom.css").vendored? + assert sample_blob("themes/ui-lightness/jquery.ui.accordion.css").vendored? + assert sample_blob("ui/i18n/jquery.ui.datepicker-ar.js").vendored? + assert sample_blob("ui/i18n/jquery-ui-i18n.js").vendored? + assert sample_blob("ui/jquery.effects.blind.js").vendored? + assert sample_blob("ui/jquery-ui-1.8.22.custom.js").vendored? + assert sample_blob("ui/jquery-ui-1.8.22.custom.min.js").vendored? + assert sample_blob("ui/jquery-ui-1.8.22.js").vendored? + assert sample_blob("ui/jquery-ui-1.8.js").vendored? + assert sample_blob("ui/jquery-ui.min.js").vendored? + assert sample_blob("ui/jquery.ui.accordion.js").vendored? + assert sample_blob("ui/minified/jquery.effects.blind.min.js").vendored? + assert sample_blob("ui/minified/jquery.ui.accordion.min.js").vendored? + + # MooTools + assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat.js").vendored? + assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat-yc.js").vendored? + + # Dojo + assert sample_blob("public/javascripts/dojo.js").vendored? + + # MochiKit + assert sample_blob("public/javascripts/MochiKit.js").vendored? + + # YUI + assert sample_blob("public/javascripts/yahoo-dom-event.js").vendored? + assert sample_blob("public/javascripts/yahoo-min.js").vendored? + assert sample_blob("public/javascripts/yuiloader-dom-event.js").vendored? + + # WYS editors + assert sample_blob("public/javascripts/ckeditor.js").vendored? + assert sample_blob("public/javascripts/tiny_mce.js").vendored? + assert sample_blob("public/javascripts/tiny_mce_popup.js").vendored? + assert sample_blob("public/javascripts/tiny_mce_src.js").vendored? + + # AngularJS + assert sample_blob("public/javascripts/angular.js").vendored? + assert sample_blob("public/javascripts/angular.min.js").vendored? + + # D3.js + assert sample_blob("public/javascripts/d3.v3.js").vendored? + assert sample_blob("public/javascripts/d3.v3.min.js").vendored? + + # Modernizr + assert sample_blob("public/javascripts/modernizr-2.7.1.js").vendored? + assert sample_blob("public/javascripts/modernizr.custom.01009.js").vendored? + + # Fabric + assert sample_blob("fabfile.py").vendored? + + # WAF + assert sample_blob("waf").vendored? + + # Visual Studio IntelliSense + assert sample_blob("Scripts/jquery-1.7-vsdoc.js").vendored? + + # Microsoft Ajax + assert sample_blob("Scripts/MicrosoftAjax.debug.js").vendored? + assert sample_blob("Scripts/MicrosoftAjax.js").vendored? + assert sample_blob("Scripts/MicrosoftMvcAjax.debug.js").vendored? + assert sample_blob("Scripts/MicrosoftMvcAjax.js").vendored? + assert sample_blob("Scripts/MicrosoftMvcValidation.debug.js").vendored? + assert sample_blob("Scripts/MicrosoftMvcValidation.js").vendored? + + # jQuery validation plugin (MS bundles this with asp.net mvc) + assert sample_blob("Scripts/jquery.validate.js").vendored? + assert sample_blob("Scripts/jquery.validate.min.js").vendored? + assert sample_blob("Scripts/jquery.validate.unobtrusive.js").vendored? + assert sample_blob("Scripts/jquery.validate.unobtrusive.min.js").vendored? + assert sample_blob("Scripts/jquery.unobtrusive-ajax.js").vendored? + assert sample_blob("Scripts/jquery.unobtrusive-ajax.min.js").vendored? + + # NuGet Packages + assert sample_blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored? + + # Font Awesome + assert sample_blob("some/asset/path/font-awesome.min.css").vendored? + assert sample_blob("some/asset/path/font-awesome.css").vendored? + + # Normalize + assert sample_blob("some/asset/path/normalize.css").vendored? + + # Carthage + assert sample_blob('Carthage/blah').vendored? + + # Cocoapods + assert sample_blob('Pods/blah').vendored? + + # Html5shiv + assert sample_blob("Scripts/html5shiv.js").vendored? + assert sample_blob("Scripts/html5shiv.min.js").vendored? + + # Test fixtures + assert sample_blob("test/fixtures/random.rkt").vendored? + assert sample_blob("Test/fixtures/random.rkt").vendored? + assert sample_blob("tests/fixtures/random.rkt").vendored? + + # Cordova/PhoneGap + assert sample_blob("cordova.js").vendored? + assert sample_blob("cordova.min.js").vendored? + assert sample_blob("cordova-2.1.0.js").vendored? + assert sample_blob("cordova-2.1.0.min.js").vendored? + + # Foundation js + assert sample_blob("foundation.js").vendored? + assert sample_blob("foundation.min.js").vendored? + assert sample_blob("foundation.abide.js").vendored? + + # Vagrant + assert sample_blob("Vagrantfile").vendored? + + # Gradle + assert sample_blob("gradlew").vendored? + assert sample_blob("gradlew.bat").vendored? + assert sample_blob("gradle/wrapper/gradle-wrapper.properties").vendored? + assert sample_blob("subproject/gradlew").vendored? + assert sample_blob("subproject/gradlew.bat").vendored? + assert sample_blob("subproject/gradle/wrapper/gradle-wrapper.properties").vendored? + + # Octicons + assert sample_blob("octicons.css").vendored? + assert sample_blob("public/octicons.min.css").vendored? + assert sample_blob("public/octicons/sprockets-octicons.scss").vendored? + + # Typesafe Activator + assert sample_blob("activator").vendored? + assert sample_blob("activator.bat").vendored? + assert sample_blob("subproject/activator").vendored? + assert sample_blob("subproject/activator.bat").vendored? + + assert_predicate fixture_blob(".google_apis/bar.jar"), :vendored? + assert_predicate fixture_blob("foo/.google_apis/bar.jar"), :vendored? + + # Sphinx docs + assert sample_blob("docs/_build/asset.doc").vendored? + assert sample_blob("docs/theme/file.css").vendored? + + # Vagrant + assert sample_blob("puphpet/file.pp").vendored? + + # Fabric.io + assert sample_blob("Fabric.framework/Fabric.h").vendored? + + # Crashlytics + assert sample_blob("Crashlytics.framework/Crashlytics.h").vendored? + end + + def test_documentation + assert_predicate fixture_blob("doc/foo.html"), :documentation? + assert_predicate fixture_blob("docs/foo.html"), :documentation? + refute_predicate fixture_blob("project/doc/foo.html"), :documentation? + refute_predicate fixture_blob("project/docs/foo.html"), :documentation? + + assert_predicate fixture_blob("Documentation/foo.md"), :documentation? + assert_predicate fixture_blob("documentation/foo.md"), :documentation? + assert_predicate fixture_blob("project/Documentation/foo.md"), :documentation? + assert_predicate fixture_blob("project/documentation/foo.md"), :documentation? + + assert_predicate fixture_blob("javadoc/foo.html"), :documentation? + assert_predicate fixture_blob("project/javadoc/foo.html"), :documentation? + + assert_predicate fixture_blob("man/foo.html"), :documentation? + refute_predicate fixture_blob("project/man/foo.html"), :documentation? + + assert_predicate fixture_blob("README"), :documentation? + assert_predicate fixture_blob("README.md"), :documentation? + assert_predicate fixture_blob("README.txt"), :documentation? + assert_predicate fixture_blob("Readme"), :documentation? + assert_predicate fixture_blob("readme"), :documentation? + assert_predicate fixture_blob("foo/README"), :documentation? + + assert_predicate fixture_blob("CHANGE"), :documentation? + assert_predicate fixture_blob("CHANGE.md"), :documentation? + assert_predicate fixture_blob("CHANGE.txt"), :documentation? + assert_predicate fixture_blob("foo/CHANGE"), :documentation? + + assert_predicate fixture_blob("CHANGELOG"), :documentation? + assert_predicate fixture_blob("CHANGELOG.md"), :documentation? + assert_predicate fixture_blob("CHANGELOG.txt"), :documentation? + assert_predicate fixture_blob("foo/CHANGELOG"), :documentation? + + assert_predicate fixture_blob("CHANGES"), :documentation? + assert_predicate fixture_blob("CHANGES.md"), :documentation? + assert_predicate fixture_blob("CHANGES.txt"), :documentation? + assert_predicate fixture_blob("foo/CHANGES"), :documentation? + + assert_predicate fixture_blob("CONTRIBUTING"), :documentation? + assert_predicate fixture_blob("CONTRIBUTING.md"), :documentation? + assert_predicate fixture_blob("CONTRIBUTING.txt"), :documentation? + assert_predicate fixture_blob("foo/CONTRIBUTING"), :documentation? + + assert_predicate fixture_blob("examples/some-file.pl"), :documentation? + assert_predicate fixture_blob("Examples/some-example-file.rb"), :documentation? + + assert_predicate fixture_blob("LICENSE"), :documentation? + assert_predicate fixture_blob("LICENCE.md"), :documentation? + assert_predicate fixture_blob("License.txt"), :documentation? + assert_predicate fixture_blob("LICENSE.txt"), :documentation? + assert_predicate fixture_blob("foo/LICENSE"), :documentation? + + assert_predicate fixture_blob("COPYING"), :documentation? + assert_predicate fixture_blob("COPYING.md"), :documentation? + assert_predicate fixture_blob("COPYING.txt"), :documentation? + assert_predicate fixture_blob("foo/COPYING"), :documentation? + + assert_predicate fixture_blob("INSTALL"), :documentation? + assert_predicate fixture_blob("INSTALL.md"), :documentation? + assert_predicate fixture_blob("INSTALL.txt"), :documentation? + assert_predicate fixture_blob("foo/INSTALL"), :documentation? + + refute_predicate fixture_blob("foo.md"), :documentation? + + # Samples + assert sample_blob("Samples/Ruby/foo.rb").documentation? + + assert_predicate fixture_blob("INSTALL.txt"), :documentation? + end + + def test_language + Samples.each do |sample| + blob = sample_blob(sample[:path]) + assert blob.language, "No language for #{sample[:path]}" + assert_equal sample[:language], blob.language.name, blob.name + end + + # Test language detection for files which shouldn't be used as samples + root = File.expand_path('../fixtures', __FILE__) + Dir.entries(root).each do |language| + next if language == '.' || language == '..' || language == 'Binary' || + File.basename(language) == 'ace_modes.json' + + # Each directory contains test files of a language + dirname = File.join(root, language) + Dir.entries(dirname).each do |filename| + # By default blob search the file in the samples; + # thus, we need to give it the absolute path + filepath = File.join(dirname, filename) + next unless File.file?(filepath) + + blob = fixture_blob(filepath) + if language == 'Data' + assert blob.language.nil?, "A language was found for #{filepath}" + elsif language == 'Generated' + assert blob.generated?, "#{filepath} is not a generated file" + else + assert blob.language, "No language for #{filepath}" + assert_equal language, blob.language.name, blob.name + end + end + end + end + + def test_minified_files_not_safe_to_highlight + assert !sample_blob("JavaScript/jquery-1.6.1.min.js").safe_to_colorize? + end + + def test_empty + blob = Struct.new(:data) { include Linguist::BlobHelper } + + assert blob.new("").empty? + assert blob.new(nil).empty? + refute blob.new(" ").empty? + refute blob.new("nope").empty? + end + + def test_include_in_language_stats + vendored = sample_blob("bower_components/custom/custom.js") + assert_predicate vendored, :vendored? + refute_predicate vendored, :include_in_language_stats? + + documentation = fixture_blob("README") + assert_predicate documentation, :documentation? + refute_predicate documentation, :include_in_language_stats? + + generated = sample_blob("CSS/bootstrap.min.css") + assert_predicate generated, :generated? + refute_predicate generated, :include_in_language_stats? + + data = sample_blob("Ant Build System/filenames/ant.xml") + assert_equal :data, data.language.type + refute_predicate data, :include_in_language_stats? + + prose = sample_blob("Markdown/tender.md") + assert_equal :prose, prose.language.type + refute_predicate prose, :include_in_language_stats? + + included = sample_blob("HTML/pages.html") + assert_predicate included, :include_in_language_stats? + end end diff --git a/test/test_memory_blob.rb b/test/test_memory_blob.rb deleted file mode 100644 index 1ba856de..00000000 --- a/test/test_memory_blob.rb +++ /dev/null @@ -1,290 +0,0 @@ -require_relative "./helper" - -class TestBlob < Minitest::Test - include Linguist - - def setup - # git blobs are normally loaded as ASCII-8BIT since they may contain data - # with arbitrary encoding not known ahead of time - @original_external = Encoding.default_external - Encoding.default_external = Encoding.find("ASCII-8BIT") - end - - def teardown - Encoding.default_external = @original_external - end - - def script_blob(name) - blob = sample_blob_memory(name) - blob.instance_variable_set(:@name, 'script') - blob - end - - def test_name - assert_equal "foo.rb", sample_blob_memory("Ruby/foo.rb").name - end - - def test_mime_type - assert_equal "application/postscript", fixture_blob_memory("Binary/octocat.ai").mime_type - assert_equal "application/x-ruby", sample_blob_memory("Ruby/grit.rb").mime_type - assert_equal "application/x-sh", sample_blob_memory("Shell/script.sh").mime_type - assert_equal "text/plain", fixture_blob_memory("Data/README").mime_type - end - - def test_content_type - assert_equal "application/pdf", fixture_blob_memory("Binary/foo.pdf").content_type - assert_equal "image/png", fixture_blob_memory("Binary/foo.png").content_type - assert_equal "text/plain; charset=iso-8859-2", fixture_blob_memory("Data/README").content_type - end - - def test_disposition - assert_equal "attachment; filename=foo+bar.jar", fixture_blob_memory("Binary/foo bar.jar").disposition - assert_equal "attachment; filename=foo.bin", fixture_blob_memory("Binary/foo.bin").disposition - assert_equal "attachment; filename=linguist.gem", fixture_blob_memory("Binary/linguist.gem").disposition - assert_equal "attachment; filename=octocat.ai", fixture_blob_memory("Binary/octocat.ai").disposition - assert_equal "inline", fixture_blob_memory("Data/README").disposition - assert_equal "inline", sample_blob_memory("Text/foo.txt").disposition - assert_equal "inline", sample_blob_memory("Ruby/grit.rb").disposition - assert_equal "inline", fixture_blob_memory("Binary/octocat.png").disposition - end - - def test_data - assert_equal "module Foo\nend\n", sample_blob_memory("Ruby/foo.rb").data - end - - def test_lines - assert_equal ["module Foo", "end", ""], sample_blob_memory("Ruby/foo.rb").lines - assert_equal ["line 1", "line 2", ""], sample_blob_memory("Text/mac.txt").lines - assert_equal 475, sample_blob_memory("Emacs Lisp/ess-julia.el").lines.length - end - - def test_lines_maintains_original_encoding - # Even if the file's encoding is detected as something like UTF-16LE, - # earlier versions of the gem made implicit guarantees that the encoding of - # each `line` is in the same encoding as the file was originally read (in - # practice, UTF-8 or ASCII-8BIT) - assert_equal Encoding.default_external, fixture_blob_memory("Data/utf16le").lines.first.encoding - end - - def test_size - assert_equal 15, sample_blob_memory("Ruby/foo.rb").size - end - - def test_loc - assert_equal 3, sample_blob_memory("Ruby/foo.rb").loc - end - - def test_sloc - assert_equal 2, sample_blob_memory("Ruby/foo.rb").sloc - assert_equal 3, fixture_blob_memory("Data/utf16le-windows").sloc - assert_equal 1, fixture_blob_memory("Data/iso8859-8-i").sloc - end - - def test_encoding - assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").encoding - assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").ruby_encoding - assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").encoding - assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").ruby_encoding - assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").encoding - assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").ruby_encoding - assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").encoding - assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").ruby_encoding - assert_equal "ISO-2022-KR", sample_blob_memory("Text/ISO-2022-KR.txt").encoding - assert_equal "binary", sample_blob_memory("Text/ISO-2022-KR.txt").ruby_encoding - assert_nil fixture_blob_memory("Binary/dog.o").encoding - end - - def test_binary - assert fixture_blob_memory("Binary/git.deb").binary? - assert fixture_blob_memory("Binary/hello.pbc").binary? - assert fixture_blob_memory("Binary/linguist.gem").binary? - assert fixture_blob_memory("Binary/octocat.ai").binary? - assert fixture_blob_memory("Binary/octocat.png").binary? - assert fixture_blob_memory("Binary/zip").binary? - assert !fixture_blob_memory("Data/README").binary? - assert !sample_blob_memory("Ruby/foo.rb").binary? - assert !sample_blob_memory("Perl/script.pl").binary? - end - - def test_all_binary - Samples.each do |sample| - blob = sample_blob_memory(sample[:path]) - assert ! (blob.likely_binary? || blob.binary?), "#{sample[:path]} is a binary file" - end - end - - def test_text - assert fixture_blob_memory("Data/README").text? - assert fixture_blob_memory("Data/md").text? - assert sample_blob_memory("Shell/script.sh").text? - assert fixture_blob_memory("Data/txt").text? - end - - def test_image - assert fixture_blob_memory("Binary/octocat.png").image? - assert !fixture_blob_memory("Binary/octocat.ai").image? - assert !fixture_blob_memory("Binary/octocat.psd").image? - end - - def test_solid - assert fixture_blob_memory("Binary/cube.stl").solid? - assert fixture_blob_memory("Data/cube.stl").solid? - end - - def test_csv - assert fixture_blob_memory("Data/cars.csv").csv? - end - - def test_pdf - assert fixture_blob_memory("Binary/foo.pdf").pdf? - end - - def test_viewable - assert fixture_blob_memory("Data/README").viewable? - assert sample_blob_memory("Ruby/foo.rb").viewable? - assert sample_blob_memory("Perl/script.pl").viewable? - assert !fixture_blob_memory("Binary/linguist.gem").viewable? - assert !fixture_blob_memory("Binary/octocat.ai").viewable? - assert !fixture_blob_memory("Binary/octocat.png").viewable? - end - - def test_generated - assert !fixture_blob_memory("Data/README").generated? - - # Generated .NET Docfiles - assert sample_blob_memory("XML/net_docfile.xml").generated? - - # Long line - assert !sample_blob_memory("JavaScript/uglify.js").generated? - - # Inlined JS, but mostly code - assert !sample_blob_memory("JavaScript/json2_backbone.js").generated? - - # Minified JS - assert !sample_blob_memory("JavaScript/jquery-1.6.1.js").generated? - assert sample_blob_memory("JavaScript/jquery-1.6.1.min.js").generated? - assert sample_blob_memory("JavaScript/jquery-1.4.2.min.js").generated? - - # Composer generated composer.lock file - assert sample_blob_memory("JSON/composer.lock").generated? - - # PEG.js-generated parsers - assert sample_blob_memory("JavaScript/parser.js").generated? - - # Generated PostScript - assert !sample_blob_memory("PostScript/sierpinski.ps").generated? - - # These examples are too basic to tell - assert !sample_blob_memory("JavaScript/hello.js").generated? - - assert sample_blob_memory("JavaScript/intro-old.js").generated? - assert sample_blob_memory("JavaScript/classes-old.js").generated? - - assert sample_blob_memory("JavaScript/intro.js").generated? - assert sample_blob_memory("JavaScript/classes.js").generated? - - # Protocol Buffer generated code - assert sample_blob_memory("C++/protocol-buffer.pb.h").generated? - assert sample_blob_memory("C++/protocol-buffer.pb.cc").generated? - assert sample_blob_memory("Java/ProtocolBuffer.java").generated? - assert sample_blob_memory("Python/protocol_buffer_pb2.py").generated? - assert sample_blob_memory("Go/api.pb.go").generated? - assert sample_blob_memory("Go/embedded.go").generated? - - # Apache Thrift generated code - assert sample_blob_memory("Python/gen-py-linguist-thrift.py").generated? - assert sample_blob_memory("Go/gen-go-linguist-thrift.go").generated? - assert sample_blob_memory("Java/gen-java-linguist-thrift.java").generated? - assert sample_blob_memory("JavaScript/gen-js-linguist-thrift.js").generated? - assert sample_blob_memory("Ruby/gen-rb-linguist-thrift.rb").generated? - assert sample_blob_memory("Objective-C/gen-cocoa-linguist-thrift.m").generated? - - # Generated JNI - assert sample_blob_memory("C/jni_layer.h").generated? - - # Minified CSS - assert !sample_blob_memory("CSS/bootstrap.css").generated? - assert sample_blob_memory("CSS/bootstrap.min.css").generated? - - # Generated VCR - assert sample_blob_memory("YAML/vcr_cassette.yml").generated? - - # Generated by Zephir - assert !sample_blob_memory("Zephir/Router.zep").generated? - - # Cython-generated C/C++ - assert sample_blob_memory("C/sgd_fast.c").generated? - assert sample_blob_memory("C++/wrapper_inner.cpp").generated? - - # Unity3D-generated metadata - assert sample_blob_memory("Unity3D Asset/Tiles.meta").generated? - end - - def test_vendored - assert !fixture_blob_memory("Data/README").vendored? - end - - def test_language - Samples.each do |sample| - blob = sample_blob_memory(sample[:path]) - assert blob.language, "No language for #{sample[:path]}" - assert_equal sample[:language], blob.language.name, blob.name - end - - # Test language detection for files which shouldn't be used as samples - root = File.expand_path('../fixtures', __FILE__) - Dir.entries(root).each do |language| - next if language == '.' || language == '..' || language == 'Binary' || - File.basename(language) == 'ace_modes.json' - - # Each directory contains test files of a language - dirname = File.join(root, language) - Dir.entries(dirname).each do |filename| - # By default blob search the file in the samples; - # thus, we need to give it the absolute path - filepath = File.join(dirname, filename) - next unless File.file?(filepath) - - blob = fixture_blob_memory(filepath) - if language == 'Data' - assert blob.language.nil?, "A language was found for #{filepath}" - elsif language == 'Generated' - assert blob.generated?, "#{filepath} is not a generated file" - else - assert blob.language, "No language for #{filepath}" - assert_equal language, blob.language.name, blob.name - end - end - end - end - - def test_minified_files_not_safe_to_highlight - assert !sample_blob_memory("JavaScript/jquery-1.6.1.min.js").safe_to_colorize? - end - - def test_empty - blob = Struct.new(:data) { include Linguist::BlobHelper } - - assert blob.new("").empty? - assert blob.new(nil).empty? - refute blob.new(" ").empty? - refute blob.new("nope").empty? - end - - def test_include_in_language_stats - generated = sample_blob_memory("CSS/bootstrap.min.css") - assert_predicate generated, :generated? - refute_predicate generated, :include_in_language_stats? - - data = sample_blob_memory("Ant Build System/filenames/ant.xml") - assert_equal :data, data.language.type - refute_predicate data, :include_in_language_stats? - - prose = sample_blob_memory("Markdown/tender.md") - assert_equal :prose, prose.language.type - refute_predicate prose, :include_in_language_stats? - - included = sample_blob_memory("HTML/pages.html") - assert_predicate included, :include_in_language_stats? - end -end From aa701c6766e269194cefd1b0888883b15213dabb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Tue, 25 Aug 2015 01:09:42 +0200 Subject: [PATCH 012/205] Update languages.yml --- lib/linguist/languages.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 5b31ed4f..ab094d63 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1917,6 +1917,15 @@ M: - .m tm_scope: source.lisp ace_mode: lisp + +M4: + type: programming + extensions: + - .m4 + filenames: + - configure.ac + tm_scope: none + ace_mode: text MTML: type: markup From 16e22b3b777ccb2ac123b0a79384af6003d2b3b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Thu, 27 Aug 2015 15:37:32 +0200 Subject: [PATCH 013/205] Added M4 samples --- samples/M4/ax_ruby_devel.m4 | 172 ++++++++++++++++++++++++++++++++++++ samples/M4/configure.ac | 143 ++++++++++++++++++++++++++++++ samples/M4/list.m4 | 46 ++++++++++ 3 files changed, 361 insertions(+) create mode 100644 samples/M4/ax_ruby_devel.m4 create mode 100644 samples/M4/configure.ac create mode 100644 samples/M4/list.m4 diff --git a/samples/M4/ax_ruby_devel.m4 b/samples/M4/ax_ruby_devel.m4 new file mode 100644 index 00000000..3f68c119 --- /dev/null +++ b/samples/M4/ax_ruby_devel.m4 @@ -0,0 +1,172 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_ruby_devel.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_RUBY_DEVEL([version]) +# +# DESCRIPTION +# +# This macro checks for Ruby and tries to get the include path to +# 'ruby.h'. It provides the $(RUBY_CPPFLAGS) and $(RUBY_LDFLAGS) output +# variables. It also exports $(RUBY_EXTRA_LIBS) for embedding Ruby in your +# code. +# +# You can search for some particular version of Ruby by passing a +# parameter to this macro, for example "1.8.6". +# +# LICENSE +# +# Copyright (c) 2008 Rafal Rzepecki +# Copyright (c) 2008 Sebastian Huber +# Copyright (c) 2008 Alan W. Irwin +# Copyright (c) 2008 Rafael Laboissiere +# Copyright (c) 2008 Andrew Collier +# Copyright (c) 2008 Matteo Settenvini +# Copyright (c) 2008 Horst Knorr +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 11 + +AC_DEFUN([AX_RUBY_DEVEL],[ + AC_REQUIRE([AX_WITH_RUBY]) + AS_IF([test -n "$1"], [AX_PROG_RUBY_VERSION([$1])]) + + # + # Check if you have mkmf, else fail + # + AC_MSG_CHECKING([for the mkmf Ruby package]) + ac_mkmf_result=`$RUBY -rmkmf -e ";" 2>&1` + if test -z "$ac_mkmf_result"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + AC_MSG_ERROR([cannot import Ruby module "mkmf". +Please check your Ruby installation. The error was: +$ac_mkmf_result]) + fi + + # + # Check for Ruby include path + # + AC_MSG_CHECKING([for Ruby include path]) + if test -z "$RUBY_CPPFLAGS"; then + ruby_path=`$RUBY -rmkmf -e 'print Config::CONFIG[["archdir"]]'` + if test -n "${ruby_path}"; then + ruby_path="-I$ruby_path" + fi + RUBY_CPPFLAGS=$ruby_path + fi + AC_MSG_RESULT([$RUBY_CPPFLAGS]) + AC_SUBST([RUBY_CPPFLAGS]) + + # + # Check for Ruby library path + # + AC_MSG_CHECKING([for Ruby library path]) + if test -z "$RUBY_LDFLAGS"; then + RUBY_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[["LIBRUBYARG_SHARED"]]'` + fi + AC_MSG_RESULT([$RUBY_LDFLAGS]) + AC_SUBST([RUBY_LDFLAGS]) + + # + # Check for site packages + # + AC_MSG_CHECKING([for Ruby site-packages path]) + if test -z "$RUBY_SITE_PKG"; then + RUBY_SITE_PKG=`$RUBY -rmkmf -e 'print Config::CONFIG[["sitearchdir"]]'` + fi + AC_MSG_RESULT([$RUBY_SITE_PKG]) + AC_SUBST([RUBY_SITE_PKG]) + + # + # libraries which must be linked in when embedding + # + AC_MSG_CHECKING(ruby extra libraries) + if test -z "$RUBY_EXTRA_LIBS"; then + RUBY_EXTRA_LIBS=`$RUBY -rmkmf -e 'print Config::CONFIG[["SOLIBS"]]'` + fi + AC_MSG_RESULT([$RUBY_EXTRA_LIBS]) + AC_SUBST(RUBY_EXTRA_LIBS) + + # + # linking flags needed when embedding + # (is it even needed for Ruby?) + # + # AC_MSG_CHECKING(ruby extra linking flags) + # if test -z "$RUBY_EXTRA_LDFLAGS"; then + # RUBY_EXTRA_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[["LINKFORSHARED"]]'` + # fi + # AC_MSG_RESULT([$RUBY_EXTRA_LDFLAGS]) + # AC_SUBST(RUBY_EXTRA_LDFLAGS) + + # this flags breaks ruby.h, and is sometimes defined by KDE m4 macros + CFLAGS="`echo "$CFLAGS" | sed -e 's/-std=iso9899:1990//g;'`" + # + # final check to see if everything compiles alright + # + AC_MSG_CHECKING([consistency of all components of ruby development environment]) + AC_LANG_PUSH([C]) + # save current global flags + ac_save_LIBS="$LIBS" + LIBS="$ac_save_LIBS $RUBY_LDFLAGS" + ac_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$ac_save_CPPFLAGS $RUBY_CPPFLAGS" + AC_TRY_LINK([ + #include + ],[ + ruby_init(); + ],[rubyexists=yes],[rubyexists=no]) + + AC_MSG_RESULT([$rubyexists]) + + if test ! "$rubyexists" = "yes"; then + AC_MSG_ERROR([ + Could not link test program to Ruby. Maybe the main Ruby library has been + installed in some non-standard library path. If so, pass it to configure, + via the LDFLAGS environment variable. + Example: ./configure LDFLAGS="-L/usr/non-standard-path/ruby/lib" + ============================================================================ + ERROR! + You probably have to install the development version of the Ruby package + for your distribution. The exact name of this package varies among them. + ============================================================================ + ]) + RUBY_VERSION="" + fi + AC_LANG_POP + # turn back to default flags + CPPFLAGS="$ac_save_CPPFLAGS" + LIBS="$ac_save_LIBS" + + # + # all done! + # +]) diff --git a/samples/M4/configure.ac b/samples/M4/configure.ac new file mode 100644 index 00000000..e65c54b6 --- /dev/null +++ b/samples/M4/configure.ac @@ -0,0 +1,143 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.68) +AC_INIT([GARDEN], + [1.0.9], + [bubla@users.sourceforge.net]) +AC_CONFIG_AUX_DIR([build-aux]) +AM_INIT_AUTOMAKE([-Wall]) +AC_CONFIG_SRCDIR([src/input.h]) +AC_CONFIG_HEADERS([src/configure.h]) +AC_CONFIG_MACRO_DIR([m4]) + +AC_ARG_ENABLE([debug], + [AS_HELP_STRING([--enable-debug], + [Builds the debug version of the library [[default = no]]]) ], + [], + [enable_debug="no"]) + +AS_IF([test "x$enable_debug" = "xyes"], + [CFLAGS="${CFLAGS} -g -O0"]) + +# Checks for programs. +AC_PROG_CC +AC_PROG_LIBTOOL +LT_PROG_RC + +AC_CANONICAL_HOST + +dnl +dnl Check whether it makes sense to install a garden.desktop file +dnl +AC_CHECK_PROG([have_freedesktop], + [update-desktop-database], + [yes]) + +AM_CONDITIONAL([HAVE_FREEDESKTOP], + [test "x$have_freedesktop" = "xyes"]) + +AM_CONDITIONAL([WANT_FREEDESKTOP], + [test "x$enable_desktop_install" = "xyes"]) + +AC_ARG_ENABLE([desktop-install], + [AS_HELP_STRING([--enable-desktop-install], + [Whether you want to install the garden.desktop file if applicable. !!! DO NOT USE if you are a PACKAGER!!!])] + ) + +AS_CASE([$host], + [*mingw* | *cygwin*], + [AC_DEFINE([WINDOWS_VERSION], + [1], + [Define when building for Windows]) + windows_version="yes"]) + +AM_CONDITIONAL([WINDOWS_VERSION], + [test "x$windows_version" = "xyes" ]) + +dnl now the datadir specification, that is useful if one does want to play without installing +AC_ARG_ENABLE([datadir], + [AS_HELP_STRING([--enable-datadir=path-to-your-garden-datafiles], + [Normally you dont have to use this, but it is handy when you want to play the game without installing it or if you want to use already installed data. In the first case, use for instance --enable-datadir=`pwd`/data (if it makes sense)])], + [DATADIR_NAME="$enableval"], + [DATADIR_NAME='$(datadir)/'garden]) + +# Sets the data subdirectory +AC_SUBST([DATADIR_NAME]) + +# Checks for libraries. +AC_CHECK_HEADER([allegro.h], + [], + [have_allegro="no" + AC_MSG_ERROR([You don't even have Allegro headers... Get Allegro first!]) ]) + +AC_CHECK_LIB([m], [sin]) + +test "x$host_os" != "x$build_os" && CROSS_COMPILING="yes" + +try_link_allegro () +{ + LIBS_SAVE=$LIBS + LIBS="$LIBS $1" + AC_MSG_CHECKING([for Allegro using $1]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT + [ #include ]], + [allegro_init();])END_OF_MAIN() ], + [have_allegro="yes"], + [have_allegro="no"]) + AC_MSG_RESULT([$have_allegro]) + LIBS=$LIBS_SAVE + AS_IF([test "x$have_allegro" == "xyes"], + [return 0], + [return 1]) +} +# first check for 'official allegro' +# The official allegro does not support cross-compiling, though... +AM_PATH_ALLEGRO([4.2.0]) + +try_link_allegro "$allegro_LIBS" +AS_IF([test "x$?" == "x0"], + [[LIBS="$LIBS $allegro_LIBS" + ALLEGRO_LIB=`echo $allegro_LIBS | sed -e 's/.*-l\([^[:blank:]]*\).*/\1/'` + have_allegro="yes"]]) + +ALLEGRO_RELEASE_LIBS="alleg alleg42 alleg44" +ALLEGRO_DEBUG_LIBS="alld42 alleg44-debug" +AS_IF([test "x$enable_debug" = "xyes"], + [ALLEGRO_LIBS="$ALLEGRO_DEBUG_LIBS $ALLEGRO_RELEASE_LIBS"], + [ALLEGRO_LIBS="$ALLEGRO_RELEASE_LIBS $ALLEGRO_DEBUG_LIBS"]) + +for lib in $ALLEGRO_LIBS +do + ldflag="-l$lib" + AS_IF([test "x$have_allegro" == "xyes"], + [break]) + try_link_allegro $ldflag + AS_IF([test "x$?" == "x0"], + [LIBS="$LIBS $ldflag" + ALLEGRO_LIB="$lib" + have_allegro="yes"]) +done + +AS_IF([test "x$have_allegro" != "xyes"], + [AC_MSG_ERROR([Unable to find Allegro game programming library 4.2, check out www.allegro.cc (or your distro repositories if you use a unix-like system)]) ]) + +# Checks for header files. +AC_CHECK_HEADERS([string.h sys/stat.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_INLINE +AC_HEADER_STDBOOL + +# Checks for library functions. + +AC_SUBST([ALLEGRO_LIB]) + +AC_CONFIG_FILES([Makefile + src/Makefile + data/Makefile + resources/Makefile + docs/garden.doxyfile + pkgs/w32/winstaller.nsi]) + +AC_OUTPUT diff --git a/samples/M4/list.m4 b/samples/M4/list.m4 new file mode 100644 index 00000000..397bd8ff --- /dev/null +++ b/samples/M4/list.m4 @@ -0,0 +1,46 @@ +m4_define([m4_list_declare], [m4_do( + [m4_define([$1_GET], [m4_expand([m4_list_nth([$1], $][1)])])], + [m4_define([$1_FOREACH], [m4_foreach([item], [m4_dquote_elt(m4_list_contents([$1]))], m4_quote($][1))])], +)]) + +m4_define([m4_list_add], [m4_do( + [m4_pushdef([_LIST_NAME], [[_LIST_$1]])], + [m4_ifndef(_LIST_NAME, + [m4_define(_LIST_NAME, m4_dquote(m4_escape([$2])))], + [m4_define(_LIST_NAME, m4_dquote(m4_list_contents([$1]), m4_escape([$2])))], + )], + [m4_popdef([_LIST_NAME])], +)]) + +m4_define([m4_list_contents], [m4_do( + [m4_pushdef([_LIST_NAME], [[_LIST_$1]])], + [m4_ifndef(_LIST_NAME, [], m4_quote(_LIST_NAME))], + [m4_popdef([_LIST_NAME])], +)]) + +m4_define([m4_list_nth], [m4_argn([$2], m4_list_contents([$1]))]) + +m4_define([m4_list_pop_front], [m4_do( + [m4_pushdef([_LIST_NAME], [[_LIST_$1]])], + [m4_car(m4_unquote(_LIST_NAME))], + [m4_define(_LIST_NAME, m4_cdr(m4_unquote(_LIST_NAME)))], + [m4_popdef([_LIST_NAME])], +)]) + +m4_define([m4_list_pop_back], [m4_do( + [m4_pushdef([_LIST_NAME], [[_LIST_$1]])], + [m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))], + [m4_list_pop_front([$1])], + [m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))], + [m4_popdef([_LIST_NAME])], +)]) + +dnl +dnl $1: List name +dnl $2: What +dnl $3: If contains +dnl $4: If not +m4_define([m4_list_contains], [m4_do( + [m4_foreach([item], m4_list_contents([$1]), m4_if(item, [$2], [[$3]], [[$4]]))] +)]) + From 59fb481138b1007aae0d842b815b42fbff8d8fe9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Thu, 27 Aug 2015 15:40:10 +0200 Subject: [PATCH 014/205] Added pure m4 example --- samples/M4/htmlgen.m4 | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 samples/M4/htmlgen.m4 diff --git a/samples/M4/htmlgen.m4 b/samples/M4/htmlgen.m4 new file mode 100644 index 00000000..9b7671fc --- /dev/null +++ b/samples/M4/htmlgen.m4 @@ -0,0 +1,38 @@ +dnl Took from https://en.wikipedia.org/wiki/M4_(computer_language) +divert(-1) + +M4 has multiple output queues that can be manipulated with the +`divert' macro. Valid queues range from 0 to 10, inclusive, with +the default queue being 0. + +Calling the `divert' macro with an invalid queue causes text to be +discarded until another call. Note that even while output is being +discarded, quotes around `divert' and other macros are needed to +prevent expansion. + +# Macros aren't expanded within comments, meaning that keywords such +# as divert and other built-ins may be used without consequence. + +# HTML utility macro: + +define(`H2_COUNT', 0) + +# The H2_COUNT macro is redefined every time the H2 macro is used: + +define(`H2', + `define(`H2_COUNT', incr(H2_COUNT))

H2_COUNT. $1

') + +divert(1)dnl +dnl +dnl The dnl macro causes m4 to discard the rest of the line, thus +dnl preventing unwanted blank lines from appearing in the output. +dnl +H2(First Section) +H2(Second Section) +H2(Conclusion) +dnl +divert(0)dnl +dnl + +undivert(1)dnl One of the queues is being pushed to output. + From cf5268a7d49301eefaf96c97f08ece68d928b24a Mon Sep 17 00:00:00 2001 From: Michael Fellinger Date: Fri, 28 Aug 2015 14:04:10 -0400 Subject: [PATCH 015/205] add Pony language --- .gitmodules | 3 + grammars.yml | 2 + lib/linguist/languages.yml | 7 + samples/Pony/circle.pony | 30 ++++ samples/Pony/counter.pony | 32 +++++ samples/Pony/gups-opt.pony | 261 ++++++++++++++++++++++++++++++++++ samples/Pony/hello-world.pony | 3 + samples/Pony/mandelbrot.pony | 188 ++++++++++++++++++++++++ samples/Pony/mixed.pony | 130 +++++++++++++++++ vendor/grammars/sublime-pony | 1 + 10 files changed, 657 insertions(+) create mode 100644 samples/Pony/circle.pony create mode 100644 samples/Pony/counter.pony create mode 100644 samples/Pony/gups-opt.pony create mode 100644 samples/Pony/hello-world.pony create mode 100644 samples/Pony/mandelbrot.pony create mode 100644 samples/Pony/mixed.pony create mode 160000 vendor/grammars/sublime-pony diff --git a/.gitmodules b/.gitmodules index 35cc9de8..582a9f9e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -674,3 +674,6 @@ [submodule "vendor/grammars/sublime-typescript"] path = vendor/grammars/sublime-typescript url = https://github.com/Microsoft/TypeScript-Sublime-Plugin +[submodule "vendor/grammars/sublime-pony"] + path = vendor/grammars/sublime-pony + url = https://github.com/CausalityLtd/sublime-pony diff --git a/grammars.yml b/grammars.yml index ae9ff92c..0fcdf052 100644 --- a/grammars.yml +++ b/grammars.yml @@ -505,6 +505,8 @@ vendor/grammars/sublime-nix: vendor/grammars/sublime-opal/: - source.opal - source.opalsysdefs +vendor/grammars/sublime-pony: +- source.pony vendor/grammars/sublime-robot-plugin: - text.robot vendor/grammars/sublime-rust: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 5b31ed4f..7ef4cebc 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2604,6 +2604,13 @@ PogoScript: tm_scope: source.pogoscript ace_mode: text +Pony: + type: programming + extensions: + - .pony + tm_scope: source.pony + ace_mode: text + PostScript: type: markup extensions: diff --git a/samples/Pony/circle.pony b/samples/Pony/circle.pony new file mode 100644 index 00000000..06d734d7 --- /dev/null +++ b/samples/Pony/circle.pony @@ -0,0 +1,30 @@ +use "collections" + +class Circle + var _radius: F32 + + new create(radius': F32) => + _radius = radius' + + fun ref get_radius(): F32 => + _radius + + fun ref get_area(): F32 => + F32.pi() * _radius.pow(2) + + fun ref get_circumference(): F32 => + 2 * _radius * F32.pi() + +actor Main + new create(env: Env) => + + for i in Range[F32](1.0, 101.0) do + let c = Circle(i) + + var str = + "Radius: " + c.get_radius().string() + "\n" + + "Circumference: " + c.get_circumference().string() + "\n" + + "Area: " + c.get_area().string() + "\n" + + env.out.print(str) + end diff --git a/samples/Pony/counter.pony b/samples/Pony/counter.pony new file mode 100644 index 00000000..cbb583bd --- /dev/null +++ b/samples/Pony/counter.pony @@ -0,0 +1,32 @@ +use "collections" + +actor Counter + var _count: U32 + + new create() => + _count = 0 + + be increment() => + _count = _count + 1 + + be get_and_reset(main: Main) => + main.display(_count) + _count = 0 + +actor Main + var _env: Env + + new create(env: Env) => + _env = env + + var count: U32 = try env.args(1).u32() else 10 end + var counter = Counter + + for i in Range[U32](0, count) do + counter.increment() + end + + counter.get_and_reset(this) + + be display(result: U32) => + _env.out.print(result.string()) diff --git a/samples/Pony/gups-opt.pony b/samples/Pony/gups-opt.pony new file mode 100644 index 00000000..52fad32f --- /dev/null +++ b/samples/Pony/gups-opt.pony @@ -0,0 +1,261 @@ +use "options" +use "time" +use "collections" + +class Config + var logtable: U64 = 20 + var iterate: U64 = 10000 + var logchunk: U64 = 10 + var logactors: U64 = 2 + + fun ref apply(env: Env): Bool => + var options = Options(env) + + options + .add("logtable", "l", I64Argument) + .add("iterate", "i", I64Argument) + .add("chunk", "c", I64Argument) + .add("actors", "a", I64Argument) + + for option in options do + match option + | ("table", var arg: I64) => logtable = arg.u64() + | ("iterate", var arg: I64) => iterate = arg.u64() + | ("chunk", var arg: I64) => logchunk = arg.u64() + | ("actors", var arg: I64) => logactors = arg.u64() + | let err: ParseError => + err.report(env.out) + env.out.print( + """ + gups_opt [OPTIONS] + --table N log2 of the total table size. Defaults to 20. + --iterate N number of iterations. Defaults to 10000. + --chunk N log2 of the chunk size. Defaults to 10. + --actors N log2 of the actor count. Defaults to 2. + """ + ) + return false + end + end + + env.out.print( + "logtable: " + logtable.string() + + "\niterate: " + iterate.string() + + "\nlogchunk: " + logchunk.string() + + "\nlogactors: " + logactors.string() + ) + true + +actor Main + let _env: Env + let _config: Config = Config + + var _updates: U64 = 0 + var _confirm: U64 = 0 + let _start: U64 + var _actors: Array[Updater] val + + new create(env: Env) => + _env = env + + if _config(env) then + let actor_count = 1 << _config.logactors + let loglocal = _config.logtable - _config.logactors + let chunk_size = 1 << _config.logchunk + let chunk_iterate = chunk_size * _config.iterate + + _updates = chunk_iterate * actor_count + _confirm = actor_count + + var updaters = recover Array[Updater](actor_count) end + + for i in Range[U64](0, actor_count) do + updaters.push(Updater(this, actor_count, i, loglocal, chunk_size, + chunk_iterate * i)) + end + + _actors = consume updaters + _start = Time.nanos() + + for a in _actors.values() do + a.start(_actors, _config.iterate) + end + else + _start = 0 + _actors = recover Array[Updater] end + end + + be done() => + if (_confirm = _confirm - 1) == 1 then + for a in _actors.values() do + a.done() + end + end + + be confirm() => + _confirm = _confirm + 1 + + if _confirm == _actors.size() then + let elapsed = (Time.nanos() - _start).f64() + let gups = _updates.f64() / elapsed + + _env.out.print( + "Time: " + (elapsed / 1e9).string() + + "\nGUPS: " + gups.string() + ) + end + +actor Updater + let _main: Main + let _index: U64 + let _updaters: U64 + let _chunk: U64 + let _mask: U64 + let _loglocal: U64 + + let _output: Array[Array[U64] iso] + let _reuse: List[Array[U64] iso] = List[Array[U64] iso] + var _others: (Array[Updater] val | None) = None + var _table: Array[U64] + var _rand: U64 + + new create(main:Main, updaters: U64, index: U64, loglocal: U64, chunk: U64, + seed: U64) + => + _main = main + _index = index + _updaters = updaters + _chunk = chunk + _mask = updaters - 1 + _loglocal = loglocal + + _rand = PolyRand.seed(seed) + _output = _output.create(updaters) + + let size = 1 << loglocal + _table = Array[U64].undefined(size) + + var offset = index * size + + try + for i in Range[U64](0, size) do + _table(i) = i + offset + end + end + + be start(others: Array[Updater] val, iterate: U64) => + _others = others + iteration(iterate) + + be apply(iterate: U64) => + iteration(iterate) + + fun ref iteration(iterate: U64) => + let chk = _chunk + + for i in Range(0, _updaters) do + _output.push( + try + _reuse.pop() + else + recover Array[U64](chk) end + end + ) + end + + for i in Range(0, _chunk) do + var datum = _rand = PolyRand(_rand) + var updater = (datum >> _loglocal) and _mask + + try + if updater == _index then + _table(i) = _table(i) xor datum + else + _output(updater).push(datum) + end + end + end + + try + let to = _others as Array[Updater] val + + repeat + let data = _output.pop() + + if data.size() > 0 then + to(_output.size()).receive(consume data) + else + _reuse.push(consume data) + end + until _output.size() == 0 end + end + + if iterate > 1 then + apply(iterate - 1) + else + _main.done() + end + + be receive(data: Array[U64] iso) => + try + for i in Range(0, data.size()) do + let datum = data(i) + var j = (datum >> _loglocal) and _mask + _table(j) = _table(j) xor datum + end + + data.clear() + _reuse.push(consume data) + end + + be done() => + _main.confirm() + +primitive PolyRand + fun apply(prev: U64): U64 => + (prev << 1) xor if prev.i64() < 0 then _poly() else 0 end + + fun seed(from: U64): U64 => + var n = from % _period() + + if n == 0 then + return 1 + end + + var m2 = Array[U64].undefined(64) + var temp = U64(1) + + try + for i in Range(0, 64) do + m2(i) = temp + temp = this(temp) + temp = this(temp) + end + end + + var i: U64 = 64 - n.clz() + var r = U64(2) + + try + while i > 0 do + temp = 0 + + for j in Range(0, 64) do + if ((r >> j) and 1) != 0 then + temp = temp xor m2(j) + end + end + + r = temp + i = i - 1 + + if ((n >> i) and 1) != 0 then + r = this(r) + end + end + end + r + + fun _poly(): U64 => 7 + + fun _period(): U64 => 1317624576693539401 diff --git a/samples/Pony/hello-world.pony b/samples/Pony/hello-world.pony new file mode 100644 index 00000000..9f7258e2 --- /dev/null +++ b/samples/Pony/hello-world.pony @@ -0,0 +1,3 @@ +actor Main + new create(env: Env) => + env.out.print("Hello, world.") diff --git a/samples/Pony/mandelbrot.pony b/samples/Pony/mandelbrot.pony new file mode 100644 index 00000000..cae7ea1d --- /dev/null +++ b/samples/Pony/mandelbrot.pony @@ -0,0 +1,188 @@ +use "files" +use "options" +use "collections" + +actor Worker + new mandelbrot(main: Main, x: U64, y: U64, width: U64, iterations: U64, + limit: F32, real: Array[F32] val, imaginary: Array[F32] val) + => + var view: Array[U8] iso = + recover + Array[U8]((y - x) * (width >> 3)) + end + + let group_r = Array[F32].undefined(8) + let group_i = Array[F32].undefined(8) + + var row = x + + try + while row < y do + let prefetch_i = imaginary(row) + + var col: U64 = 0 + + while col < width do + var j: U64 = 0 + + while j < 8 do + group_r.update(j, real(col + j)) + group_i.update(j, prefetch_i) + j = j + 1 + end + + var bitmap: U8 = 0xFF + var n = iterations + + repeat + var mask: U8 = 0x80 + var k: U64 = 0 + + while k < 8 do + let r = group_r(k) + let i = group_i(k) + + group_r.update(k, ((r * r) - (i * i)) + real(col + k)) + group_i.update(k, (2.0 * r * i) + prefetch_i) + + if ((r * r) + (i * i)) > limit then + bitmap = bitmap and not mask + end + + mask = mask >> 1 + k = k + 1 + end + until (bitmap == 0) or ((n = n - 1) == 1) end + + view.push(bitmap) + + col = col + 8 + end + row = row + 1 + end + + main.draw(x * (width >> 3), consume view) + end + +actor Main + var iterations: U64 = 50 + var limit: F32 = 4.0 + var chunks: U64 = 16 + var width: U64 = 16000 + var actors: U64 = 0 + var header: U64 = 0 + var real: Array[F32] val = recover Array[F32] end + var imaginary: Array[F32] val = recover Array[F32] end + var outfile: (File | None) = None + + new create(env: Env) => + try + arguments(env) + + let length = width + let recip_width = 2.0 / width.f32() + + var r = recover Array[F32](length) end + var i = recover Array[F32](length) end + + for j in Range(0, width) do + r.push((recip_width * j.f32()) - 1.5) + i.push((recip_width * j.f32()) - 1.0) + end + + real = consume r + imaginary = consume i + + spawn_actors() + create_outfile() + end + + be draw(offset: U64, pixels: Array[U8] val) => + match outfile + | var out: File => + out.seek_start(header + offset) + out.write(pixels) + if (actors = actors - 1) == 1 then + out.dispose() + end + end + + fun ref create_outfile() => + match outfile + | var f: File => + f.print("P4\n " + width.string() + " " + width.string() + "\n") + header = f.size() + f.set_length((width * (width >> 3)) + header) + end + + fun ref spawn_actors() => + actors = ((width + (chunks - 1)) / chunks) + + var rest = width % chunks + + if rest == 0 then rest = chunks end + + var x: U64 = 0 + var y: U64 = 0 + + for i in Range(0, actors - 1) do + x = i * chunks + y = x + chunks + Worker.mandelbrot(this, x, y, width, iterations, limit, real, imaginary) + end + + Worker.mandelbrot(this, y, y + rest, width, iterations, limit, real, + imaginary) + + fun ref arguments(env: Env) ? => + let options = Options(env) + + options + .add("iterations", "i", I64Argument) + .add("limit", "l", F64Argument) + .add("chunks", "c", I64Argument) + .add("width", "w", I64Argument) + .add("output", "o", StringArgument) + + for option in options do + match option + | ("iterations", var arg: I64) => iterations = arg.u64() + | ("limit", var arg: F64) => limit = arg.f32() + | ("chunks", var arg: I64) => chunks = arg.u64() + | ("width", var arg: I64) => width = arg.u64() + | ("output", var arg: String) => + outfile = try File(FilePath(env.root, arg)) end + | let err: ParseError => err.report(env.out) ; usage(env) ; error + end + end + + fun tag usage(env: Env) => + env.out.print( + """ + mandelbrot [OPTIONS] + + The binary output can be converted to a BMP with the following command + (ImageMagick Tools required): + + convert JPEG:.jpg + + Available options: + + --iterations, -i Maximum amount of iterations to be done for each pixel. + Defaults to 50. + + --limit, -l Square of the limit that pixels need to exceed in order + to escape from the Mandelbrot set. + Defaults to 4.0. + + --chunks, -c Maximum line count of chunks the image should be + divided into for divide & conquer processing. + Defaults to 16. + + --width, -w Lateral length of the resulting mandelbrot image. + Defaults to 16000. + + --output, -o File to write the output to. + + """ + ) diff --git a/samples/Pony/mixed.pony b/samples/Pony/mixed.pony new file mode 100644 index 00000000..d55a161c --- /dev/null +++ b/samples/Pony/mixed.pony @@ -0,0 +1,130 @@ +use "collections" + +actor Worker + var _env: Env + + new create(env: Env) => + _env = env + + var a: U64 = 86028157 + var b: U64 = 329545133 + + var result = factorize(a*b) + + var correct = + try + (result.size() == 2) and + (result(0) == 86028157) and + (result(1) == 329545133) + else + false + end + + fun ref factorize(bigint: U64) : Array[U64] => + var factors = Array[U64](2) + + if bigint <= 3 then + factors.push(bigint) + else + var d: U64 = 2 + var i: U64 = 0 + var n = bigint + + while d < n do + if (n % d) == 0 then + i = i + 1 + factors.push(d) + n = n / d + else + d = if d == 2 then 3 else (d + 2) end + end + end + + factors.push(d) + end + + factors + +actor Ring + var _env: Env + var _size: U32 + var _pass: U32 + var _repetitions: U32 + var _next: Ring + + new create(env: Env, size: U32, pass: U32, repetitions: U32) => + _env = env + _size = size + _pass = pass + _repetitions = repetitions + _next = spawn_ring(_env, _size, _pass) + run() + + new neighbor(env: Env, next: Ring) => + _env = env + _next = next + _size = 0 + _pass = 0 + _repetitions = 0 + + be apply(i: U32) => + if i > 0 then + _next(i - 1) + else + run() + end + + fun ref run() => + if _repetitions > 0 then + _repetitions = _repetitions - 1 + _next(_pass * _size) + Worker(_env) + end + + fun tag spawn_ring(env: Env, size: U32, pass': U32) : Ring => + var next: Ring = this + + for i in Range[U32](0, size) do + next = Ring.neighbor(env, next) + end + + next + +actor Main + var _size: U32 = 50 + var _count: U32 = 20 + var _pass: U32 = 10000 + var _repetitions: U32 = 5 + var _env: Env + + new create(env: Env) => + _env = env + + try + arguments() + start_benchmark() + else + usage() + end + + fun ref arguments() ? => + _count = _env.args(1).u32() + _size = _env.args(2).u32() + _pass = _env.args(3).u32() + _repetitions = _env.args(4).u32() + + fun ref start_benchmark() => + for i in Range[U32](0, _count) do + Ring(_env, _size, _pass, _repetitions) + end + + fun ref usage() => + _env.out.print( + """ + mixed OPTIONS + N number of actors in each ring" + N number of rings" + N number of messages to pass around each ring" + N number of times to repeat" + """ + ) diff --git a/vendor/grammars/sublime-pony b/vendor/grammars/sublime-pony new file mode 160000 index 00000000..6197c402 --- /dev/null +++ b/vendor/grammars/sublime-pony @@ -0,0 +1 @@ +Subproject commit 6197c4028eb04dcb1c443160047e4c84c80d863e From 1d86f40fcda7ef0b302a55f6d94d8e99e7f3329e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Sun, 30 Aug 2015 15:03:55 +0200 Subject: [PATCH 016/205] Added m4sugar language, moved samples to right locations. --- lib/linguist/languages.yml | 16 +++++++++++++++- samples/{M4 => M4Sugar}/ax_ruby_devel.m4 | 0 samples/{M4 => M4Sugar/filenames}/configure.ac | 0 samples/{M4 => M4Sugar}/list.m4 | 0 4 files changed, 15 insertions(+), 1 deletion(-) rename samples/{M4 => M4Sugar}/ax_ruby_devel.m4 (100%) rename samples/{M4 => M4Sugar/filenames}/configure.ac (100%) rename samples/{M4 => M4Sugar}/list.m4 (100%) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index ab094d63..0b882393 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1917,9 +1917,23 @@ M: - .m tm_scope: source.lisp ace_mode: lisp - + M4: type: programming + aliases: + - autoconf + extensions: + - .m4 + filenames: + - configure.ac + tm_scope: none + ace_mode: text + +M4Sugar: + type: programming + group: M4 + aliases: + - autoconf extensions: - .m4 filenames: diff --git a/samples/M4/ax_ruby_devel.m4 b/samples/M4Sugar/ax_ruby_devel.m4 similarity index 100% rename from samples/M4/ax_ruby_devel.m4 rename to samples/M4Sugar/ax_ruby_devel.m4 diff --git a/samples/M4/configure.ac b/samples/M4Sugar/filenames/configure.ac similarity index 100% rename from samples/M4/configure.ac rename to samples/M4Sugar/filenames/configure.ac diff --git a/samples/M4/list.m4 b/samples/M4Sugar/list.m4 similarity index 100% rename from samples/M4/list.m4 rename to samples/M4Sugar/list.m4 From 73b1737dc7fbf77629f3514a2e9a8fc82ec0467c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Sun, 30 Aug 2015 15:09:45 +0200 Subject: [PATCH 017/205] Removed a typo --- lib/linguist/languages.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 0b882393..efa1dfb1 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1920,8 +1920,6 @@ M: M4: type: programming - aliases: - - autoconf extensions: - .m4 filenames: From 1068cfb4b5d791e522071d876044356e7eb4ecaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Sun, 30 Aug 2015 15:25:42 +0200 Subject: [PATCH 018/205] Removed stray M4 attribute --- lib/linguist/languages.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index efa1dfb1..01065eb2 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1922,8 +1922,6 @@ M4: type: programming extensions: - .m4 - filenames: - - configure.ac tm_scope: none ace_mode: text From 81ebef2e2906ebabbc70292e2901f6658503c801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Tue, 1 Sep 2015 17:49:01 +0200 Subject: [PATCH 019/205] Added autoconf output, removed configure.ac --- lib/linguist/vendor.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index ed89eda8..7b7b75f8 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -20,10 +20,16 @@ - ^deps/ - ^tools/ - (^|/)configure$ -- (^|/)configure.ac$ - (^|/)config.guess$ - (^|/)config.sub$ +# stuff autogenerated by autoconf - still C deps +- (^|/)libtool.m4 +- (^|/)ltoptions.m4 +- (^|/)ltsugar.m4 +- (^|/)ltversion.m4 +- (^|/)lt~obsolete.m4 + # Linters - cpplint.py From 26a35ea43dec04872f18c70b7733026abffd00f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20T=C3=BD=C4=8D?= Date: Tue, 1 Sep 2015 17:51:18 +0200 Subject: [PATCH 020/205] added aclocal to the generated files list --- lib/linguist/vendor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index 7b7b75f8..1d58f467 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -24,6 +24,7 @@ - (^|/)config.sub$ # stuff autogenerated by autoconf - still C deps +- (^|/)aclocal.m4 - (^|/)libtool.m4 - (^|/)ltoptions.m4 - (^|/)ltsugar.m4 From 1b327e29baf00b63c34a00f4118141fb30827d8c Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Tue, 1 Sep 2015 21:51:48 +0300 Subject: [PATCH 021/205] Add colors for some languages. These are effected languages and the reason behind the proposed colors: - Ant Build System: The color of logo (http://ant.apache.org/images/project-logo.gif). - AppleScript: AppleScript editor logo (https://en.wikipedia.org/wiki/AppleScript#/media/File:AppleScript_Editor_Logo.png). - Batchfile: Batch file icon in Windows (https://en.wikipedia.org/wiki/Batch_file#/media/File:Batch_file_icon_in_Windows_Vista.png). - Bison: A color taken from a bison (https://en.wikipedia.org/wiki/Bison#/media/File:Americanbison.jpg). - Cucumber: Official logo color (https://cucumber.io/images/cucumber-logo.svg). - Cuda: Nvidia(creator of CUDA) logo color (http://www.nvidia.com/content/includes/redesign2010/images/redesign10/nvidia_logo.png). - Gradle: Official Gradle logo color (https://gradle.org/wp-content/uploads/2015/03/GradleLogoReg.png). - Hack: Hack logo color (http://hacklang.org/wp-content/themes/hack/hack.png). - Haml: Haml logo color (http://haml.info/images/haml.png). - LLVM: Eye color of the dragon logo of LLVM (http://llvm.org/img/DragonMedium.png). - Less: Less logo color (http://lesscss.org/public/img/logo.png). - Markdown: The Daring Fireball logo color (http://daringfireball.net/graphics/logos/). - Maven POM: The maven logo color (https://en.wikipedia.org/wiki/Apache_Maven#/media/File:Maven_logo.svg). - Nginx: The nginx logo color (http://nginx.org/nginx.png). - NumPy: The NumPy logo color (http://www.numpy.org/_static/numpy_logo.png). - RDoc: I couldn'd find any logo, so have used the color of the name of RDoc in the official site (http://docs.seattlerb.org/rdoc/). - SCSS: The Sass logo color (http://sass-lang.com/assets/img/logos/logo-b6e1ef6e.svg). - Sass: The Sass logo color (http://sass-lang.com/assets/img/logos/logo-b6e1ef6e.svg). - XML: A random color. - XSLT: A random color. - YAML: The color of the name of YAML in the official site (http://yaml.org/). - Yacc: A random color. - reStructuredText: The official logo color (http://docutils.sourceforge.net/rst.png). --- lib/linguist/languages.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 4d83e963..ae0584a1 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -153,6 +153,7 @@ Ant Build System: - ant.xml - build.xml ace_mode: xml + color: "#A82C7C" ApacheConf: type: markup @@ -182,6 +183,7 @@ AppleScript: interpreters: - osascript ace_mode: applescript + color: "#F2F1F1" Arc: type: programming @@ -289,6 +291,7 @@ Batchfile: - .cmd tm_scope: source.dosbatch ace_mode: batchfile + color: "#92C2FF" Befunge: type: programming @@ -303,6 +306,7 @@ Bison: extensions: - .bison ace_mode: text + color: "#6A463F" BitBake: type: programming @@ -690,6 +694,7 @@ Cucumber: aliases: - gherkin ace_mode: text + color: "#00A818" Cuda: type: programming @@ -698,6 +703,7 @@ Cuda: - .cuh tm_scope: source.cuda-c++ ace_mode: c_cpp + color: "#76B900" Cycript: type: programming @@ -1204,6 +1210,7 @@ Gradle: - .gradle tm_scope: source.groovy.gradle ace_mode: text + color: "#84BA40" Grammatical Framework: type: programming @@ -1355,6 +1362,7 @@ Hack: - .hh - .php tm_scope: text.html.php + color: "#878787" Haml: group: HTML @@ -1363,6 +1371,7 @@ Haml: - .haml - .haml.deface ace_mode: haml + color: "#ECE2A9" Handlebars: type: markup @@ -1705,6 +1714,7 @@ LLVM: extensions: - .ll ace_mode: text + color: "#689DD7" LOLCODE: type: programming @@ -1768,6 +1778,7 @@ Less: - .less tm_scope: source.css.less ace_mode: less + color: "#2A4D82" Lex: type: programming @@ -1977,6 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm + color: "#DDDDDD" Mask: type: markup @@ -2015,6 +2027,7 @@ Maven POM: filenames: - pom.xml ace_mode: xml + color: "#FF6804" Max: type: programming @@ -2204,6 +2217,7 @@ Nginx: aliases: - nginx configuration file ace_mode: text + color: "#009900" Nimrod: type: programming @@ -2262,6 +2276,7 @@ NumPy: - .numsc tm_scope: none ace_mode: text + color: "#378EC8" OCaml: type: programming @@ -2794,6 +2809,7 @@ RDoc: extensions: - .rdoc tm_scope: text.rdoc + color: "#333333" REALbasic: type: programming @@ -2991,6 +3007,7 @@ SCSS: ace_mode: scss extensions: - .scss + color: "#CF649A" SMT: type: programming @@ -3093,6 +3110,7 @@ Sass: extensions: - .sass ace_mode: sass + color: "#CF649A" Scala: type: programming @@ -3676,6 +3694,7 @@ XML: - Web.Release.config - Web.config - packages.config + color: "#25AAE2" XPages: type: programming @@ -3721,6 +3740,7 @@ XSLT: - .xsl tm_scope: text.xml.xsl ace_mode: xml + color: "#0E76BD" Xojo: type: programming @@ -3753,6 +3773,7 @@ YAML: - .yaml - .yaml-tmlanguage ace_mode: yaml + color: "#FF0000" Yacc: type: programming @@ -3762,6 +3783,7 @@ Yacc: - .yy tm_scope: source.bison ace_mode: text + color: "#92278F" Zephir: type: programming @@ -3844,6 +3866,7 @@ reStructuredText: - .rst - .rest ace_mode: text + color: "#000000" wisp: type: programming From 9e3d8ac4e919d1eff026e94cbb9c69a21a25f9d0 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 09:58:14 +0300 Subject: [PATCH 022/205] Update Batchfile color. --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index ae0584a1..157ba092 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -291,7 +291,7 @@ Batchfile: - .cmd tm_scope: source.dosbatch ace_mode: batchfile - color: "#92C2FF" + color: "#A3D300" Befunge: type: programming From 827ad80311fe24b4cabd76769c8ccff584a31557 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 10:16:37 +0300 Subject: [PATCH 023/205] Update colors to fix collision. Colors basically incremented. --- lib/linguist/languages.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 157ba092..be44415d 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -631,7 +631,7 @@ Common Lisp: Component Pascal: type: programming - color: "#b0ce4e" + color: "#c1df5f" extensions: - .cp - .cps @@ -703,7 +703,7 @@ Cuda: - .cuh tm_scope: source.cuda-c++ ace_mode: c_cpp - color: "#76B900" + color: "#87CA11" Cycript: type: programming @@ -1210,7 +1210,7 @@ Gradle: - .gradle tm_scope: source.groovy.gradle ace_mode: text - color: "#84BA40" + color: "#95CB51" Grammatical Framework: type: programming @@ -1714,7 +1714,7 @@ LLVM: extensions: - .ll ace_mode: text - color: "#689DD7" + color: "#79AEE8" LOLCODE: type: programming @@ -1778,7 +1778,7 @@ Less: - .less tm_scope: source.css.less ace_mode: less - color: "#2A4D82" + color: "#3B5E93" Lex: type: programming @@ -1988,7 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm - color: "#DDDDDD" + color: "#EEEEEE" Mask: type: markup @@ -2027,7 +2027,7 @@ Maven POM: filenames: - pom.xml ace_mode: xml - color: "#FF6804" + color: "#007915" Max: type: programming @@ -2217,7 +2217,7 @@ Nginx: aliases: - nginx configuration file ace_mode: text - color: "#009900" + color: "#11AA11" Nimrod: type: programming @@ -2276,7 +2276,7 @@ NumPy: - .numsc tm_scope: none ace_mode: text - color: "#378EC8" + color: "#489FD9" OCaml: type: programming @@ -2779,7 +2779,7 @@ QMake: R: type: programming - color: "#198ce7" + color: "#2A9DF8" aliases: - R - Rscript @@ -3694,7 +3694,7 @@ XML: - Web.Release.config - Web.config - packages.config - color: "#25AAE2" + color: "#36BBF3" XPages: type: programming @@ -3740,7 +3740,7 @@ XSLT: - .xsl tm_scope: text.xml.xsl ace_mode: xml - color: "#0E76BD" + color: "#1F87CE" Xojo: type: programming @@ -3773,7 +3773,7 @@ YAML: - .yaml - .yaml-tmlanguage ace_mode: yaml - color: "#FF0000" + color: "#001111" Yacc: type: programming @@ -3783,7 +3783,7 @@ Yacc: - .yy tm_scope: source.bison ace_mode: text - color: "#92278F" + color: "#A33890" Zephir: type: programming @@ -3866,7 +3866,7 @@ reStructuredText: - .rst - .rest ace_mode: text - color: "#000000" + color: "#444444" wisp: type: programming From dc41dd888d4f6b3754fe6461d683360d2ed212d4 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 13:31:51 +0300 Subject: [PATCH 024/205] Update Cuda color to fix closeness. --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index be44415d..3e0d1f8c 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -703,7 +703,7 @@ Cuda: - .cuh tm_scope: source.cuda-c++ ace_mode: c_cpp - color: "#87CA11" + color: "#98DB22" Cycript: type: programming From 9a76cfc85f8a30a79bcedefcb66e4f676f8a7b5a Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 14:16:12 +0300 Subject: [PATCH 025/205] Update some colors to fix closeness. I have used syntactic color values with respect to the table below: A | B C | D | E | F G | H | I | J K | L M | N O | P Q | R S | T U | V W | X | Y Z 0 1 2 3 4 5 6 7 8 9 A B C D E F For example for Gradle the color should be 4B0283, for Cuda the color should be 1C201C(for six-letter CudaCu) and for reStructuredText the color should be B3BCBC(for six-letter reStru). --- lib/linguist/languages.yml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 3e0d1f8c..40ac5b40 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -703,7 +703,7 @@ Cuda: - .cuh tm_scope: source.cuda-c++ ace_mode: c_cpp - color: "#98DB22" + color: "#1C201C" Cycript: type: programming @@ -1210,7 +1210,7 @@ Gradle: - .gradle tm_scope: source.groovy.gradle ace_mode: text - color: "#95CB51" + color: "#4B0283" Grammatical Framework: type: programming @@ -1778,7 +1778,7 @@ Less: - .less tm_scope: source.css.less ace_mode: less - color: "#3B5E93" + color: "#83BB83" Lex: type: programming @@ -1988,7 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm - color: "#EEEEEE" + color: "#80B729" Mask: type: markup @@ -2217,7 +2217,7 @@ Nginx: aliases: - nginx configuration file ace_mode: text - color: "#11AA11" + color: "#9469E9" Nimrod: type: programming @@ -2276,7 +2276,7 @@ NumPy: - .numsc tm_scope: none ace_mode: text - color: "#489FD9" + color: "#9C8AF9" OCaml: type: programming @@ -3694,7 +3694,7 @@ XML: - Web.Release.config - Web.config - packages.config - color: "#36BBF3" + color: "#E88E88" XPages: type: programming @@ -3740,7 +3740,7 @@ XSLT: - .xsl tm_scope: text.xml.xsl ace_mode: xml - color: "#1F87CE" + color: "#EB8CEB" Xojo: type: programming @@ -3783,7 +3783,7 @@ Yacc: - .yy tm_scope: source.bison ace_mode: text - color: "#A33890" + color: "#F011F0" Zephir: type: programming @@ -3866,7 +3866,7 @@ reStructuredText: - .rst - .rest ace_mode: text - color: "#444444" + color: "#B3BCBC" wisp: type: programming From 802de8112ccb3e9cd5696efe9dc5a2b8e6f9a3b9 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 14:39:19 +0300 Subject: [PATCH 026/205] Update some colors to fix closeness. --- lib/linguist/languages.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 40ac5b40..2ccff3d2 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -153,7 +153,7 @@ Ant Build System: - ant.xml - build.xml ace_mode: xml - color: "#A82C7C" + color: "#C64A9A" ApacheConf: type: markup @@ -183,7 +183,7 @@ AppleScript: interpreters: - osascript ace_mode: applescript - color: "#F2F1F1" + color: "#101F1F" Arc: type: programming @@ -291,7 +291,7 @@ Batchfile: - .cmd tm_scope: source.dosbatch ace_mode: batchfile - color: "#A3D300" + color: "#C1F12E" Befunge: type: programming @@ -631,7 +631,7 @@ Common Lisp: Component Pascal: type: programming - color: "#c1df5f" + color: "#EFFD7D" extensions: - .cp - .cps @@ -694,7 +694,7 @@ Cucumber: aliases: - gherkin ace_mode: text - color: "#00A818" + color: "#2EC636" Cuda: type: programming @@ -703,7 +703,7 @@ Cuda: - .cuh tm_scope: source.cuda-c++ ace_mode: c_cpp - color: "#1C201C" + color: "#3A4E3A" Cycript: type: programming @@ -1714,7 +1714,7 @@ LLVM: extensions: - .ll ace_mode: text - color: "#79AEE8" + color: "#97CC06" LOLCODE: type: programming @@ -1778,7 +1778,7 @@ Less: - .less tm_scope: source.css.less ace_mode: less - color: "#83BB83" + color: "#A1D9A1" Lex: type: programming @@ -1988,7 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm - color: "#80B729" + color: "#AED547" Mask: type: markup @@ -2525,7 +2525,7 @@ Parrot Internal Representation: Pascal: type: programming - color: "#b0ce4e" + color: "#DEEC6C" extensions: - .pas - .dfm @@ -2779,7 +2779,7 @@ QMake: R: type: programming - color: "#2A9DF8" + color: "#198CE7" aliases: - R - Rscript @@ -2809,7 +2809,7 @@ RDoc: extensions: - .rdoc tm_scope: text.rdoc - color: "#333333" + color: "#515151" REALbasic: type: programming @@ -3783,7 +3783,7 @@ Yacc: - .yy tm_scope: source.bison ace_mode: text - color: "#F011F0" + color: "#1E3F1E" Zephir: type: programming From 35884d482cc6b4813d9e6a4787a8cfd21ffea84d Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 15:38:41 +0300 Subject: [PATCH 027/205] Update some colors to fix closeness. --- lib/linguist/languages.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 2ccff3d2..49aa2c75 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -694,7 +694,7 @@ Cucumber: aliases: - gherkin ace_mode: text - color: "#2EC636" + color: "#2EF336" Cuda: type: programming @@ -1714,7 +1714,7 @@ LLVM: extensions: - .ll ace_mode: text - color: "#97CC06" + color: "#185619" LOLCODE: type: programming @@ -1988,7 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm - color: "#AED547" + color: "#DB0274" Mask: type: markup @@ -2525,7 +2525,7 @@ Parrot Internal Representation: Pascal: type: programming - color: "#DEEC6C" + color: "#0B1999" extensions: - .pas - .dfm @@ -2809,7 +2809,7 @@ RDoc: extensions: - .rdoc tm_scope: text.rdoc - color: "#515151" + color: "#8E84BF" REALbasic: type: programming @@ -3773,7 +3773,7 @@ YAML: - .yaml - .yaml-tmlanguage ace_mode: yaml - color: "#001111" + color: "#56789A" Yacc: type: programming @@ -3783,7 +3783,7 @@ Yacc: - .yy tm_scope: source.bison ace_mode: text - color: "#1E3F1E" + color: "#4B6C4B" Zephir: type: programming From ee61466042069db8a649a3e13444c3d079f1a685 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 15:58:46 +0300 Subject: [PATCH 028/205] Update some colors to fix closeness. --- lib/linguist/languages.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 49aa2c75..4094b18e 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -694,7 +694,7 @@ Cucumber: aliases: - gherkin ace_mode: text - color: "#2EF336" + color: "#5B2063" Cuda: type: programming @@ -1988,7 +1988,7 @@ Markdown: - .mkdown - .ron tm_scope: source.gfm - color: "#DB0274" + color: "#083FA1" Mask: type: markup @@ -2525,7 +2525,7 @@ Parrot Internal Representation: Pascal: type: programming - color: "#0B1999" + color: "#3846C6" extensions: - .pas - .dfm From cf834e8a2176d4dfaaa5e7aaf4c706c6ac756c15 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 16:23:33 +0300 Subject: [PATCH 029/205] Update some colors to fix closeness. --- lib/linguist/languages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 4094b18e..87059633 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -631,7 +631,7 @@ Common Lisp: Component Pascal: type: programming - color: "#EFFD7D" + color: "#B0CE4E" extensions: - .cp - .cps @@ -2525,7 +2525,7 @@ Parrot Internal Representation: Pascal: type: programming - color: "#3846C6" + color: "#C1DF5F" extensions: - .pas - .dfm From 7e76d1cc6bafbf3357eaf8025b1836ac8744fd06 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 17:01:38 +0300 Subject: [PATCH 030/205] Update Pascal color to fix the closeness issue. --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 87059633..ad9ac132 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2525,7 +2525,7 @@ Parrot Internal Representation: Pascal: type: programming - color: "#C1DF5F" + color: "#E3F171" extensions: - .pas - .dfm From fc5ae1cfbcad8efa8fce84b4592fadf6b65fbfb2 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 17:53:58 +0300 Subject: [PATCH 031/205] Revert colors of some languages. Revert colors of some languages which have 'type: data' attribute. --- lib/linguist/languages.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index ad9ac132..496fbee3 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -153,7 +153,6 @@ Ant Build System: - ant.xml - build.xml ace_mode: xml - color: "#C64A9A" ApacheConf: type: markup @@ -1210,7 +1209,6 @@ Gradle: - .gradle tm_scope: source.groovy.gradle ace_mode: text - color: "#4B0283" Grammatical Framework: type: programming @@ -2027,7 +2025,6 @@ Maven POM: filenames: - pom.xml ace_mode: xml - color: "#007915" Max: type: programming @@ -3694,7 +3691,6 @@ XML: - Web.Release.config - Web.config - packages.config - color: "#E88E88" XPages: type: programming @@ -3773,7 +3769,6 @@ YAML: - .yaml - .yaml-tmlanguage ace_mode: yaml - color: "#56789A" Yacc: type: programming From 4d2b38497dda3ad2258af363e5bf51647c004097 Mon Sep 17 00:00:00 2001 From: ismail-arilik Date: Wed, 2 Sep 2015 18:53:29 +0300 Subject: [PATCH 032/205] Remove color attributes of 'type: data's. --- lib/linguist/languages.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 496fbee3..3d639833 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -795,7 +795,6 @@ Dart: Diff: type: data - color: "#88dddd" extensions: - .diff - .patch @@ -3461,7 +3460,6 @@ Unified Parallel C: Unity3D Asset: type: data ace_mode: yaml - color: "#ab69a1" extensions: - .anim - .asset @@ -3818,7 +3816,6 @@ eC: edn: type: data ace_mode: clojure - color: "#db5855" extensions: - .edn tm_scope: source.clojure From 01bb6c37abe56263225a4bcd533dbbd8d82710f7 Mon Sep 17 00:00:00 2001 From: Ingo Blechschmidt Date: Fri, 25 Sep 2015 18:48:01 +0200 Subject: [PATCH 033/205] Detect Pickle data dumps (.p, .pkl, .pickle) --- lib/linguist/languages.yml | 9 +++ samples/Pickle/data.p | 24 ++++++++ .../neural-network-ce-l2reg-784-10-30.p | 60 +++++++++++++++++++ samples/Pickle/random.p | 36 +++++++++++ samples/Pickle/save.p | 10 ++++ 5 files changed, 139 insertions(+) create mode 100644 samples/Pickle/data.p create mode 100644 samples/Pickle/neural-network-ce-l2reg-784-10-30.p create mode 100644 samples/Pickle/random.p create mode 100644 samples/Pickle/save.p diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 8409337b..45c7e4c8 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2572,6 +2572,15 @@ Perl6: tm_scope: source.perl.6 ace_mode: perl +Pickle: + type: data + extensions: + - .p + - .pickle + - .pkl + tm_scope: none + ace_mode: text + PicoLisp: type: programming extensions: diff --git a/samples/Pickle/data.p b/samples/Pickle/data.p new file mode 100644 index 00000000..cf451f4f --- /dev/null +++ b/samples/Pickle/data.p @@ -0,0 +1,24 @@ +(dp0 +S'a' +p1 +(lp2 +I1 +aF2.0 +aI3 +ac__builtin__ +complex +p3 +(F4.0 +F6.0 +tp4 +Rp5 +asS'c' +p6 +NsS'b' +p7 +(S'string' +p8 +VUnicode string +p9 +tp10 +s. \ No newline at end of file diff --git a/samples/Pickle/neural-network-ce-l2reg-784-10-30.p b/samples/Pickle/neural-network-ce-l2reg-784-10-30.p new file mode 100644 index 00000000..2ad7bad3 --- /dev/null +++ b/samples/Pickle/neural-network-ce-l2reg-784-10-30.p @@ -0,0 +1,60 @@ +(cnumpy.core.multiarray +_reconstruct +p1 +(cnumpy +ndarray +p2 +(I0 +tS'b' +tRp3 +(I1 +(I10 +I784 +tcnumpy +dtype +p4 +(S'f8' +I0 +I1 +tRp5 +(I3 +S'<' +NNNI-1 +I-1 +I0 +tbI00 +S'B\xf9\xc2tq0\xed?\xe7\xcd\xa1\x01\xe7\xb9\xca\xbf\x19X;&x8\xea?\xa9V\xc7\xf2\x81\xd3\xd8\xbf\xaa\xa8fs\x88\xaa\xe6?\x1bC\xde\xe8,!\xf0?\xf3\x10%y\x89\x83\xe9\xbf\xc5\x9dY\t{\x94\xf4\xbf:/\x18\x10l\xd7\xe2?[g\x8f\xa8O\x99\xc9\xbf\xeb\x11g\x06\xe9\xd2\xe0\xbf\xd7\xe6R\x0b\xd5\x19\xe8\xbfF\x90\xef\xfe\x05>\xd9\xbf_\x82u\x8d\xa2\xd3\xae\xbf/\x91\x97\x8b>I\xca?f\x9a\xb7\x15O!\xd0\xbf|\xff\xfe\x98#\x1f\xd2\xbf\x98J@kO\xa6\xe4\xbf\x90\x94@ \x82\xbf\xd9?=2\x1f\xc7\xcbi\xf1?\xbc\x07\x9cJj\x96\xed\xbf\xc0\xf2c\x8f\xb4\xc3\xca\xbf\xb8):\x0f\x8e\x00\xe1?\xc6\xfe\xae\n\xc0M\xce?\xf0hf:]#\xd1?\xd6f9_\xf0\t\xe4?\xbd1\x8b\xf3T7\xf3?\xcfCX\xbfQ\xf5\xec\xbf\xaaP^\xaf\x00\xe0\x8e\xbf\xa4\x122FP!\xd4?\xcf\xa5>\xa6\xee\xc0\xd9\xbf\xeb\xae\x90\xd2*\x05\xdf?\xb2nPzh\xa0\xf3?d\xf8\xa8P\xf9d\xb6?\x1e\x8b\x1b\xfe\x9e\xf2\xc6?\xb8\x92.\x1c\\1\xd3?`hs\xc7;T\xd2?MQ\x99+\xfc\x9c\xf0?;\\F\xf40=\xb9?Y\xbc\xd4\xb5\xf9\xe6\xa5\xbf?\x02\xf4\xa6\xc6\x9d\xe5\xbf\xe0\x94\xf0\xef#\x7f\xd2\xbf\xf2\xd7\\I\x8eh\xc8?\xf1\xd9S\xf1-\xef\xda\xbf\x1e\xe9\xbeZ\xbav\xff?n\xb7erb\xdf\xbe\xbf\xc8\xa9d\xe9\xb1\x81\xf1\xbf\x0f\x81\xa5E{\xfc\xd1?*\x8d\xb8s\x05T\xef\xbf\xf3.s\xf0\x1e\xe8\xdd?\xcab\x0cT\x1bZ\xe9?\xc4\xf3\rQ\xdd\x10\xd8\xbf\x1eHe\xc2\xca\xca\xda?\xbdq\xe9p\x96{\xdf\xbfD\x05\x0eI\xe6V\xc9\xbf\xcf\xf5\\v\xce8\xea\xbfbV\xd5;\xb5k\xf2\xbf}\x90\x1b|\xd4g\xe0?\xce\xac\xc0\xa9\xe0\x9d\x90?+\xf3W(\x01u\xdb\xbf\xac\xa19"D\x7f\xdd?\x1d\xf2\xfbmJ\xb8\xdd?fv\x8c\x0bt\x18\xf0\xbf\xff\x94hIJ&\xe8?\x87\xf4\xb3K\xdbC\xdc\xbf\x1a9G\xc1p\xa0\xc2\xbf%^ZX\xaa\xbd\xda\xbf4\xdf\x9f\xac\x10!\xe2\xbf\xc8:$\x03\xb3\xce\xc4\xbf\xa7,\x11\xf4\xf9\x14\xe5\xbf\x97\xb2\x8ez\xe4w\xdc?T0\xedSI\xdf\xd5?\xc5\xd8W0^\xce\xc4?\xee`\x867\xdb\xb4\xe7\xbf\xc1F\xf1\x00B\x10\x03\xc0\xf1\xcd\xdeM\xb7P\xf1\xbf\x07\xb7\x80KIn\xf6\xbf\xeb2\xc3O\x95\x9b\xb7\xbf\xa7s^\xa5x\x05\xe2?^\xd3\x1b\xbbA?\xf4\xbf\xfc+U\xb0M\xa8\xd5?\x1d gm$\xf4\xda?\xa7"c\xaf\xbf\x04\xe1\xbf\xb6U7\xde3v\xb9\xbf\x81"\x95\xe7G\x14\xc4?!^S,\xb60\x01\xc0i\x08&\xf3\x8d\r\xd0\xbf2\x05^w\xe7\xdf\xb7?w\x84}n\xd6\xcd\xe1?\xb3\x98\xfbN\xfb\xa2\xee?S\xab/\xef\x7f\x12\xf3\xbfWw\xf4\xfez\xae\xeb?a\xa5~\x19&\xec\xf3?\xb1\x08\xfe\xdd-\'\xd3\xbf\xbe\xe5i\r\xca\x90\xe9?\xf0\'T\xe3\xd1j\xe3?uH\xe3\xea8\xcb\xc0?X\xaf\x86\xa6\xe3\xb7\xf4?\xb7\xcc\xael6\x7f\xda\xbf\x06\x87a\xe2\x0e\xf0\xb4\xbfnWl6\x1b\x9e\xe9?\x97\xfb\x91X2\xf6\xb0\xbfT[\xea\xc0\xdfr\xe0?\xba\xd5\x00U\xc5B\xe3?n\xa4V\xa8\xa4z\xd0?\xf4#/,!\x92\xf2\xbf\x82\x83\xae\r\xa6\xec\xea\xbf\xa7t\xbbi\xdb\xf5\xb2\xbf\xd4Wr\xc2\xb0\x93\xcc?\xe2\x03gt\x0cr\xf0\xbfJ\x03\xf6_\xe4\r\xdf?\x8a\x83u#\xfe\x85\xe4\xbf/lf\xbe\xf3\xde\x94?\xbd\x99#\x10\x0c\x90\xf7?\xfd\x832\xfa([\xe5?R\xd9\xa6\xbf-$\x19\xfa7W\xd8?\xe6\xc8\xc6\x8d\x19u\xe4\xbf*\xedf\xd1\xab\x82\xe2\xbf\\7<\x97\x84\x84\xcf?\xc8\xce\xdc\xfb\x1f\xca\xee?\x98\xcbC\xb7\xf2\xac\xe6??\tKt\xbc\x8f\xf9\xbft\x98\x15\xc2\x84\xac\xfa\xbf\x93\'\xc6\xe6\xc5\xc3\xf7\xbfv\x9eLu\xdbq\xf6?H\x85\xf5e\xf0\x85\x8b\xbf>\xd9\xfas\x15%\xf2\xbf\xe4\xcf\x9e\xad\xf6\x96\xf4?_(\xfa\x94o\xbc\xe6?\n\xb0\x0cC!\x8e\xfd?1\x04lY])\x01@4_\x1bdyP\xe6?\xf8\xf1CG\xfe\x91\xe0\xbfD\x8c,\xdb\xcf\x14\xc2?\xe9N\xf1\x926\n\xdb?\x01\xed,\xba\x1dp\xe1\xbf\x87\xed\xd2\xcb\xe6\xc5\xde?(\xca\x9f\x02\xb7\xba\xcb\xbf\x179\xf7\x9c\xca\xa1\xe5?\x1d\x93P\xdbV\x1f\xf0?\xe0\xd2\xb41;\xf1\xfa\xbf+\x81M9\x88\xa0\xf5?\x9b\x01\xdb\x14g\x85\xc4\xbf\x82\\\xd7\xad-\xc6\xee\xbf\x85\xc9\xa2i\x95\x03\xe1\xbf\x04\xa0\xcb\xc1\xc7{\xde\xbf\x84()\xa4\xd8\xe9\xf3\xbf\x97NY\x85\xa3\x8e\xe0?\x0f\xf5\xaa\x1c\x1a\xe8\x00@4\xf9+\xce\xab\xdc\xf6\xbf\xf1\x98D\xa6\x07\xe3\xe1\xbfT\xa3A\xa7\x95\x17\x01@\xc8iPOe\xc2\xfc?\xdb(l\xd7o\xd3\xff\xbf}\xd1\x17\xee \x00\x02@\x95\xe0\x93X&\'\xcf\xbfgF\xd9(\x9f\x02\xe0?p\x9a\x9a\xc2\x12\x8c\xf9?\x9c\x7f\xed\x93\x11R\x00@\xcby\xd3\x94\xc7\x91\xea\xbf)\xea\x93\xfa\xc1+\xf2?\xe0\xd5\xd7\xd2\x99\xe7\xe2\xbf\x0b\xdf=`T\xbf\xca\xbf\x84\xed\x92\xef\x8d\x0b\xd9?\xc7\xa9XI\xfeH\xeb\xbf\xebJ#\xbd\xa3`\xf0?\xc5\x82\xb8\xf7\x12\xb4\x01\xc0\x0c\xaa\xdb\xe5\xe6\xff\xf5\xbfx\xceQ\x11]\xee\x01\xc0\xba*\n/\xa7\x15\xc7\xbf\x89\x1bC\x8e\xe7\xc9\xec\xbf\x1e\xcb\xeb\xc3\xcdb\xe6\xbf\xcf\x9c\x1f\x0e\x04\xe0\xf0\xbfvV\x05>\x8c\x12\xd8?\x08b\xc9S\xd5\xd3\xff?\x80S\xe4\xddP\xed\xfc\xbf\x99\xa0W\xf7O\xa3\xce\xbfj\xe2\xde\xb2\x1c\x1f\xf4?\x13\x00p\xb7\xe72\xa9?\xdf\xaal\xcfo1\x06\xc0\x024}C\xdd?;Cr\xff\xd8\x11\xe6?\x10\x02k\x80U/\xf9?\x14\xc8_~1\xf1\xa3?0\xa0\xb76\x05\xa0\xe5\xbf@\xf8F\xfa\xe1\x84\xb0\xbf\xa4\x04\xadTx\x80\xc2\xbfP\x82F\xc0\x1eW\xde\xbf\xc8\xbd2K\x1e\xd6\xd4\xbf^X\x81\x0f\x99#\xf8\xbf\x07]}\x11\xff\x95\xd0?;\xafZ\x0e\xc8\xb6\xd5?*I\x9d\xb0\x9fU\xcd?ct}\x1f\r1\xef?\x08\xaa\xc1\xbdQB\xfa\xbf\xf7\x10\xce\xe4\xc7-\xe9\xbf\xfb\xack`w\xd2\x0c\xc0c\xf4<\x13\x8a\xf8\xce?]\x0ei\xe2Fu\xca\xbft\xadq\xe0\xa7\x04\xe9\xbf\x06|\xb1\x0b\x8a}\xe4?\x0e\xefe86M\x05\xc0\xa9n\x87\x1d\xc0U\xe2?\xc0\xc1\xc4x\x95\xb4\xbd\xbfR\xfc\xf4\x0b\xb4Q\xd5?\xfc#\x86\x0c\x8d \xf1\xbf\x1c75\xe1C\x8a\xf0?\xca\x9e\xa2\xd2\xd7\xa4\x04@\x9fP\xd1S\x12\xa9\x10@\xaaw\x94\x97\x95\x18\x00@\x9a\xb7Fz\xbcZ\xf0?g\xa9\x95\xb0=|\x93?s\x13\x9f\xf0}1\xa5?\xac\x8c\x95\x95\xd0w\xff\xbfJ$Sk;\x00\xec\xbf\xd4\xc5\x0e\xb6\xbb\xe4\xf1\xbf\xa8E\xf3\xbe7\xcc\x04@\x92+\xf2\xc2s\t\xe8\xbfN\x12\xf9\xcf\x91\x0e\xba\xbf\xda\xe0\x06\xcc\xd5\x1f\xc1?\x88\x027\x94\xa6\xd5\xd4\xbf\xe6\x95\x0cs\xf5O\x0b\xc0M\xad\x11<\x04r\xd0?\x8ac\xb8\x05\xa18\xf2?_>\xf7w\x843\xd0?\x03\x08a7\xd4\\\xfd\xbf\x8d\xd3\xaf]\xe5\x9c\xb0\xbfqZ\xb6AK/\xa7?)\x8f\xf9z\x8a\x96\xc9?\xeaE\x8er\x8d>\xf9?\xf8w\xed\xde\r\xed\xe9\xbf8\xf5\xbbD\x0e\xdd\xe1\xbf4\x82\x0c:\x0e]\xe5?\xa8\xc4\xad\xa0e\xbe\x06@\xbf>\xc6(\x81\x00\xed\xbf\xc7\x921\xc1*\xb0\x06@\xb2\xb6k\xc7\xfe\xe7\x15@\xdf\xa7\xb9\xc7\x03~\x0b@\xceP\x1f\';A\xf7?\xbe\x8eAL<\xfd\xf3\xbf\xf5\xd7\x87\xbf\x15\x13\x9e?+\xcc\xb4\xce\xfd\xad\xb2?b\xe5\x1e\x88o\xe3\xef\xbfim9aR\xc4\xf3\xbf6\xaakxf\x80\x93?\xb9\xa8\xfd\xa2\xe6~\xf5?g\xae\x19=yW\xfe\xbf\xbe"m\xe3\x85<\n\xc09\xdf]\xb7\x83\xa1\xda?\n\xb1\x89\x90\x9e\x97\r\xc0\x96\xad\x05\xc4@7\xc6\xbf\xee\xa6\xf6~\x95/\x10\xc0<\xb2\xd6\xfd\xa2\x86\xd3\xbf\x940\xfe\x93\xd51\x03@FS\xb9;"\xa7\xd3?9\x1f\r\xaa<\xb9\x0c\xc0z\xc4\rq\xc4\x1f\x03\xc0\xa6\x8e\x15_\xd0\xeb\x06\xc0\xf3\x0eX\xfc\xdd\xd4\x05\xc0\n\xf7J\xa6L&\xea\xbf\xa6\x87\x96\x18\xe4p\t\xc0\xd7\xdbPz\x1aN\xfc\xbf\xf7.-\xef\x95\xdd\xec?\x03\xfa\t4xh\x10@c\xc7s\xb4\xd5\xe8\x10@]\xe7!?\xb0\xec\xee?b\x8e\xb2A0\xf6\x01@K\xb7\xf811\x07\xdc\xbfi\xfaE\xf7\xa8\x16\xfc?\xeav\x84gWW\xf7\xbf\xc1\x99x\x8f\xbf\x1f\xd7\xbf\xfa\x98\x9e\xed\xac\xaf\xc0?C\x90\xd7\xb2\x13\x96\x0f\xc0\xba\r\xbfT\x07\xc4\x98?#\x80\x19\xf8y\xc8\x05\xc0v\xf0s\x97c\xca\x02\xc0\x99\x89A\x85\xfd\xce\xc4\xbf\xa6\xbeV{y\xd5\xde\xbfq45\x8d\xffu\x02\xc0N\x0f\xddt\xeb\xdc\xff\xbf\x0f\xad,b\x96.\xdb\xbff\xcf\xcf\xe5\r5\x07@\x06Q=qm\xcc\n@\x84\xdf\xbe{\t1\xf2\xbf\xc4\x8a:\xae:\x1d\n\xc0\xb0T\x1e~\x844\xf7\xbf\xc1m\xc2\xbe\xc0Z\xff\xbft\x1b\xea\nFT\xe5\xbfz\xed\'\xce\xbdA\xe8\xbf\xd5\xfc\xe2\xd1$\x98\xf2\xbfrI2\xa3\xca\x0c\x01\xc0J6~\x8548\xfd?\x8eH|\xf7\xcbL\x10@\xfc\x02e4x)\x01@\x80\xeb\xdf\x14\xfa\x95\xe9?\xce9\xce\x8f0*\xe5?\xaba\xb6;Y[\xed\xbf8\x89\xe12\xc7\xb0\xd4\xbfc\xfc\xa8eE\xc4\xf1?P\xba\x1f>z\xbd\xb2\xbf\xa7\xfb\x05\x13\xd3\xe7\x11\xc05a\x87\xc4\xea\x88\x0b\xc0g\xc3)\xd6M\xf2\xf9\xbf\xec\x18a\x10^w\x02\xc0\x0b\xa4\x12\xd8\x92\xf5\xea?\x97\xe1\'\'\x99\xa7\xe4?\x02c\xcd~\x1f\x11\x00\xc0a\x82\x85Q^\x97\x01@\x8d\x97|\xfdz\x03\x07@&\xeedI\xcb\xd5\xfe?\x07\x17\x1e\xb7\xed6\xdb\xbfv\xa4\xa5y\xc0\xe2\xf6\xbf\x0f\xb2:\xeb\x1f\xd3\xd7\xbf\xa2\x14M$}\xb6\t\xc0\xdf;g\xd8\xa2~\xed?#r\xdcR\x94\xfb\xf6\xbfc\x1f\x82\x17\x0e\xdc\xf9\xbf\x80\xe7\x08\xe26\x15\x0b\xc0M\x91\x1e\xd3\x99\x98\xf2?\x9fn\x81\xd7b\xb5\r@X\x93\xeb<2\x85\x03@\xc9r\xea\x00\xce\xb7\xf2?\x8c\xc4It\xb5\x8f\xb2\xbf\x0e\xe6\xf5\x81\xbc\xed\xce?\xac\xf0r\x0b\xa8\x8e\xf5?7E\x19\xaa\x115\xee\xbf\x9a~j\x97\x95)\xf1\xbf\x8de\x11\x9d\xad\x8e\xcf\xbfU\x18\x87\x9e\xd5\x9d\x05\xc0\x96\xb0\xde\x17\xab\x8f\xc4?\x19i\x1f.\x07$\xf0?\xa6Kv\xbdFh\xe4\xbf\xc4V\x99cCh\xf6\xbfiT\xfaXw\x8c\xc5\xbf\x8f$\x84\x8d\xcf\xea\xea?\xe7\x8e\x13\xf0\x936\xf9\xbfcn>\xd9\xaf\xfb\x00@r\xe8\xe1\xd3\xdbu\xf1?\xab\x82\xef\xd2\xfb;\xf6\xbfJ\xd2\xc3j\x7f\xbb\xf5\xbf\x07\x04\xb0C\xfb\xb7\x00\xc0\x0c\x82\x0e\xcc\xd8\xf9\xe8\xbf<\xfbh\xb5wJ\x0f\xc0h^\x83\x93\xc5\xe5\x11\xc0\xa1\x95\xfe\rqi\xfe\xbf\x03\xcb\xbd\xb4\xf0)\xf4\xbf\xc5\x17q\x89\x0cd\x08\xc0\xaa>_=\x05\x9f\xfc?\x99\xb9W\x89\xc2\xee\xf2?Qt\'C\xdb\x0e\xf5?\xbe\xac\x9f\xc4\x1c\xad\xe7\xbfd\xac\xa4.\xc9\xac\xe3\xbf\x15W>m\xd0\x0c\x99\xbfv\xf6./\x82y\xd0?(o+L\x17O\xd6\xbf\xec\xfd\xd1P\xb9A\xe4?QAY$v\xf3\xf2\xbf\x90<\xc4\nG=\xe9?\x04\xa7eI\x14\xd4\xcf\xbf\x033\xf4\xfbB\xad\xe1?\x03^$d\xa1\x9f\xc4\xbf\xed\x1c\xdb&\xd1q\xf9?\xab\x1b\xce\x8a\xcc\x05\xf0?A\x060\x87&\xa7\x08\xc0U\x08\x14\x0ci=\x0c@\x88\xde\x8e:[_\xfd?\x1d\xe4Ju\xe5?\xef?\xa0E(|z\xec4\xfd\xbf\xb9\xe0\xe37\xa2=\xd2\xbfh\x9c\xc0\xf3\xfa\x9b\xfb\xbf\xeb\x0c\xddR\x8e\r\xfc\xbf\xb0u\xf1>\xb9\'\x10\xc0\xc9I\x14\x935\xe0\xe5?\xe7\xcb\xcc\x86\x86+\r@\xcf]\xe6\xa1\xa2\xa4\xef?\xfc\x8c\x82\xd9\xc2\x9c\xd1?V\xacJ\xef\x13\x05\xec?\xf0\x08G\'e]\xe4\xbf\xda\x165\xf88]\xd1?\x8crAl\xec\xba\xf1\xbfW\x1c\x07G\x12\xb4\xfa?\x88\x108^\xd5\xcb\r@Y\xc6\x00\xad\xc8&\xf2?\xc0a\xd5\xefs\xaf\xc6\xbf\xef\xeb\x98\x85\x19\x04\x02\xc0b\xd9d\xb4i\xaa\xe7\xbfI\xa0\x96\xbf\x8f\x93\xb8?\x0c~$\xd8\xc0\x94\xf4\xbf\xa0]:\x1b\xf0\x1d\xf0?X\xf4G\x8a}\xfa\x03@:\xdd*\x0b_A\xea?\xda\x1a\xe1*|\x85\x00\xc0\x02\x10j\x14\x88\x10\x07\xc0\xa5\x84\xd1"<\xbd\xf3\xbf\xf0e\xf3\x85\x10c\xfd\xbfM\xdd+8\xff\xad\xf7\xbfb\x00\x1f\xbe\x0c\xef\xf9\xbf\xd6\xa2\x8d\xb9\x86\x83\xfe\xbf-\xe0\x1cuo\xee\xbe\xbf+[\xc7jL\x0b\xf4?\x89M#c\x1b7\xc6?\xd4\\\xdd\x836\xe5\x01@\xab\xeb\xfeB\x16V\xe9?\xe8\xfe\x95)=C\xf3?\x1f\xfb\xc3\xf4t\xba\xbd\xbf\x84\x10a\x13\xba/\xb4\xbf\xe4r\xb5l\x08\xd8\xa4?\x0cT\xa4\x07\xcaJ\xda\xbf\xd8\xa8|Q\xbd\x1d\x06@/\xcb4y\x82Q\x03@\xe8\xb8\xad6\xc7\xa7\x08@\xc9\x01\\\xc6\x1dn\x00@\xd2\x1f\xa3\xc1e\x81\xf1\xbf\xaa\x1e\x1cY\x9c\x91\xeb\xbf\xff\xd2w\xba\xbe(\xd8\xbfs\x10.\xfd;\x9a\xf2?\x90F\xb8\x9a\x89r\xee\xbf\x8265f\x1aL\xe9?\xb0n\xf3\x00\xdb*\xfa\xbfL\xbf\x877q\xb2\xe6?D\x13rg{\x91\x03\xc0:\xe0\xe9\xd2\xef\\\xaa\xbfz<\xb6\xa7E\xf6\xd6\xbfw\xde\xe2\xba\xc6\x01\x07\xc0q.\xd2\xda\x7ff\x10@"`\x9b\xc5\x90G\xb8\xbf*0rV\xd8O\xb9?\xee\xbf}v\x08=\xef?IH\xb5TBx\xf5?\x1a\xa3rh\x1a\n\xfb?\xb8U\x9c+\x9c\x9e\xdc\xbf\xb7\xc1c\xe1\xdb\r\xef\xbf\xe0/\x82QgZ\xb3?\xa6\xe2\x17\xbc\x05]\xdd?\xa9l\xdf?\xb1\x9e\xda?\x8c\n\xee!gd\xe7\xbfK\xac9>\xf5!\xe9?\x07Q\x02s\xdb\xfb\xe4?\xa2z#\x19\n\xd7\xeb?\xa6kC_\x9b\x8a\xe2?0\xcf\x94\xadg\xf1\x02@\xdei1\xcf@I\xf7?o\x8b\xf2$Z\x83\xe6?\xeeb\xd0\xb3\x91H\xd8\xbf\xd1\xc0\x0ck^\x95\x01\xc0\x96\xf21)`\xb9\xeb?l\xed\x89\xdf\xee\x08\xf0?\xddZ\xb5m\xfcQ\xf5?4\x18w\xa0\xbe\xf9\xf6\xbf\x1b\xa7\xff\x1d\x08\n\xec\xbf\xaa\x08\x85\'R\xac\xc3?\xcd\x8es\x87!T\xfe?X\xbb\x8e[\x9e\x89\xed?\xdf\x8b\xf9T\xe0G\x03@}\xcer}TM\xeb\xbf\xe1\xf8V\xb9\xd8J\x0f@\xe1Zv\x02\xa1m\x12@p\xb4\x0be\xf7\xa7\x10@\xc4\xb7\xf9!m\xb9\xf7?\xf2\x93\x83\\\xe6W\xff?@s\xc2\x92\xd9b\xee\xbf\x03\xeb%\x8b\xf0\xed\xc6\xbf\xa1\xe2\xc9\xcf\xfa`\xdd?y\xddyAR\xc5\xd2\xbf)\x9cScA\xd6\xc9?\xfc\xc4=4\xd5\x8f\xc7?\xd9]\xbd\xef\x01)\xe0\xbf\t\x05`j\xa11\x0f@\x8c\xb7\xf2\xfb\xea\xd0\x04@\xc5\xee\xf2\x9e\\i\xf0?\x1c\xc8\x01y4\\\x13@\xca,\xf74\xf3C\xff?-f\xac\x07\xdb\xce\xf6??\xef\x9b\xd2\xaa\xa1\xd9\xbf\xbc\x1d\x9a&v\xef\xa0\xbfC\xde+k\xa9s\xea\xbf/\x1b"c|\xd7\xe5?d=zH\tJ\xea?\xd2?\xb1rKp\xf0?4@;<\xc5l\x03@-\xd3r\x1co\xab\xed?p\xcb\x9e\xca\x94\xb8\xf9?X\x112\x18\x02H\xde\xbf+!\xa8I\xba.\x10@\xd7\xa3\xc3\xaf\xd8\xe5\x13@\xdf\x8c\xe5\xb4\x0fH\t@}Z\xb3m\x14\x9e\xeb\xbfJ\x1e.\xde\xc2@\x00@\x05\xa8\xd6\xc8\x1b\xa1\xce?\x9d\x12\xdd\xa3\x1b\xe4\xe8?\xeb\x03\x91\xb7\x1d\xb5\xd6?I\xa2V\x8b5\x1d\xf0?6U\x96\xafH;\xf5?63\xb9\xf4\xc0.\xe5?\x92\xe8\x9a0\xda\xe7\xf6?\xf9\x01T\x87UV\x11@\x8a\xd9\xcb!\xc1W\x18@\x94\x1f\x1e\xb40\x9a\x14@\xc8\x8be>-&\x12@\xc6\x9bx\x86\x15i\x06@\x06^\xcer\xb0\x94\x03@\xa2\x1er\x8f\xd8r\xff?\xb5\x06\x17\x81\xf6\x17\xc7\xbf$\xcc\xb2\x14\x03\xb4\xef?QY\xfe\xe3b\xc9\x0e@\xe8|\x8e\xcc\t \x05@\x05\xb4\xa2\x9bQZ\x04@\xb8\'\xa7Vrh\xfc?n\x82\x9c\xd7\xe7\x03\x08@)\xdeo\x07\x93-\x10@\x8aO\xe5\x97\xb56\t@\xd3\xcd\x12X\x01m\x0b@\xb2\x16H\xeb"\xb7\x06@,6\x91n\xcc\xcd\xd5?\xe9\xc1X\xf9\xf6\xa0\xf1?\xc3\x06\x056\xc3\xf0\x94?\xb7m\xef\x99\xc5%\xf3?1)\xb6\x17*\xb1\xf8\xbf\xbf\x95\xce\xd5\n\xe5\xdc\xbf\xd2\xeb\xfe\xeb\xbd\xbe\xd8?\xeeo~\x0b\x0cV\xf5?|\xf5\xf1\x13\x08?\xef?d\x0f\xc3\xbaN\x83\x01@\xbe\xcc\x8c\x91\xab\x1a\x12@\x99\x9e\x83\xda"\xb9\x04@\x86\xaa\xdd\x96qB\xff?\xac\xf2\x18`\xf7?P\t\x97%80\xff?\x8f_\x11\x0cEZ\xef?\x91\x8aR\x17\x1e?\x10@\xe7)}4\xe8\x15\x06@\xe1\xcf\xdb\xa2\xfc\xc3\n@\xd5\xd7\x99v\xdf\x9c\xf8\xbf0\x7f-T\xfb\xf0\xd1\xbf\xcf\xa7\x02T#r\xe6\xbfi6r=\x9b\x1ew\xbfW`C\x03l\xad\xdf?\xc4H\t\x16b\x10\xcf?\x1aj\xb1\x10\x95[\xd0\xbf2\x94\x06N\x98\xa4\xea?\t|Ql\x14#\xfd?\t\x813 \x1c\x80\xc9?\x99\xc0\xf7,\xc4K\x9f\xbfT#\xa1\x1c3\xbb\xea\xbf\xb6\x19\xf6\x98\x89\xd9\xf7?\x83\xf6\x87L\xca\x95\x02@\x8c\xe6\xe0\x9c\xd6\x81\xf1\xbf\t\x8a\n\x94#\xe2\xbb?\xe1\xb7\n\xf3\xc5\xe3\x00@6\xe1=<\xad\xc1\xd2?\x96.\x1bh\xd4l\xea?\x06\xb0*\x19\xd49\x01@\xd4\x90\xd0;\x1ak\x10@j \x02\'[:\xe0?\xc8\x10\x8aOW\xc3\x02@\x96\x00\xdd\xe6\x13\xc4\xe9?\xbf\x95\xd0\x0f\xba\xf1\xe6?\xb7-3\xa8-\x89\xf7?0\xe5?\xc0Y\xfb\xfc?\x1a\xe5:\x177E\x07@\xb5Xn%\x7f\xbd\xe6?\xb3:\x99\x1a\x83*\xf3?NvfY\x01h\xe4?\xd6@;\xe0\xc1\xff\xe7?BOi )A\xdc?!5\x1aT\xf1\xec\xd1\xbf7g\xf4@1x\xf3?\xee\xf8\xab\x1a&\xee\xee?\xd9&\xa0\x9e\xef9\xe2\xbfB\xf3\x0bC\xbbi\x00\xc0\x02V#\x1d\x1az\xf7\xbf\xd9a\x84\xdc\x8a\'\xbe?\xf4\x8dMWH\xb0\xe5?s\xee\x00\x80Q\x89\x04@\x15o\x1f\x03\x1d>\xd8\xbfq\xbb\x85\xd5\xd1\xf2\xff?<\x13T\xd19\xb6\x04@N\x17\x1c\xde\x08m\xfb?p\xd9h7\x1d\r\x14@\xa8v\xd0Z\xe7c\xe8?A\xf5\'\xc2\xceP\t@2\xf9\x9aZ>\x92\xec?"\xca\xc4\xac>"\x06@\xe8\x1d\xa0\xbe8\xab\xff?\xf0\x1aS\x99\x0bk\xf1?u)\xaa\x01\xbao\xf6\xbf\xb0_\xc8\x1cF\x9b\x03@x\x01Q\x02\x12\xdb\xcf\xbf\xf1\xe9C\\\xf7Y\xd5?\x12\xa6\x84\xea\xe9W\xc3\xbf\xf90\xa95\x05.\xdb?\x85}\xcc5\xfb\xaa\xce?\x0f \x83\xc2AP\xeb?b\x05\xef\xcc\xeeP\xb2?B\xdb\xf9\xe1\xf5\x9d\xcb\xbf\x8b\xa2/`\x0c\xe2\xc6\xbf`\xdd\xa1\xb4\xc5\x92\xf9\xbf=2\x1fL\xfe\xd2\t\xc0[\xf1nPhY\xff\xbf\x17\xbb|B\x94\xbb\x00\xc0\x99\x1f\x1bk\xc7\xce\xf9\xbf\x94\x02\x83\x96\xe6\x1f\xd3?\xaf\x1a\xa3B1\x95\xfe?_\xd5\x89r3e\xe3?\x85\xdaW\x83\x9dZ\xea\xbf]\xacJ\x1a\xb8\x07\xd5?\x00\x01\x1e\xd8YT\xe0\xbfR\x80\xa1\x90\x9bj\xf1?\xe3\xcd\x99n\xeb\t\xf9?`\xb7E\xe7U\xc1\xe6\xbf\x02\x88\x0c\xbc\xdc-\xe0\xbfk\xb4F\x17\xf7\xf8\xe4\xbf\xb6\xdf\xdfu\xfbf\xe1\xbf\xbf\xc5\xd3\x97!{\xf8\xbf\xd7\x90P\x8e\xf4m\xc5\xbf\x93\x1a\\\xd8\xb7\x90\xe2?)k\xbe\xefFW\xa3?\xaa\xcep\xb6\xcc\xee\xf3?\x81\x11\xb1\xd9mk\xe2\xbf+\xd0P]\x00p\xd0\xbf\xbb\xd2\xaf\xf8P\xbd\xf4\xbf\xf22n\x01\x01\xbc\xc2\xbf@\xdf\xb1\xce\xe1i\xd3\xbf++\x00\xd7\xbfo\xda?\xf9L\x03\xca\\*\xd6?\xe5\xbdS\xd5\xbe8\xc0\xbf\x95\x99Ui\xdaZ\x00\xc0q\x8a\xd2\x96\xe6\xd5\xf9\xbfm\xb9\x01[\x95\x10\x00\xc0\xbc\x10\x05x\x9f-\x13\xc0\xbbd\xbc\xb9\x8e\xfe\x05\xc0Y\xc9\xd91\xdc:\xea\xbf\xce\xf7(\xf8\x94\xdb\xeb\xbf\xea\xb8\xc9\xce\xab\x87\xb3?e\xc1\xae\xe5\x86>\x04\xc0Ks\xd0\xfcp\x87\xc2?;9\x1b\x0f4\xb8\xd8\xbf3\x86\xf6\xa5\x80\xae\xfd\xbf\x9a\xb8\xb3\x1c\x87\x9a\xe9\xbf9E\xa7\xfaq\xd4\xf2\xbf\xda\xdc\x874\x94\x91\xe6?\xd1g\xb8\xa4x\xad\xe4\xbf^\xbf_\xcd\xbf\xb0\xc6?<\x85&6R\xa5\xe5\xbf\xaa"\xcbG-\x1a\xf5\xbf\x88\xd2\x11T\xb5\xe5\xe2\xbf\xec\x127\x1f\xc5\xc0\xd9?\xdaB\xc5\x07\n\xe3\xe5?3\x0e\xc7_\x92\xeb\xf0?\x19\xb3\x1f\xeeRY\xc3?\xfa\x01\x9d\xa3\x9bf\xf2?W\xb6\x10\xfee\xab2?5A)\x05\x15\x83\xe6\xbf\x05\xb7\x0cO\x81\xdf\xd6\xbf\x0bim\xfb\xbcX\xf8?7\x8c\xfd\xea\xadQ\xd1\xbf@\xb7K\x18\x10$\xea\xbf\xb3\x8b\x86\xed\n\x98\xa4\xbf\xe7\x10\xa9-@\x06\xe5?E7\xb0\x83\xfe\xe5\xe6\xbf\xa9\xd3\xbf\xd0a\x04\xed\xbf\x069\xc1\xb46\x1a\xe4\xbf\xc9-\xf2\xc3\xac\xe9\xe3\xbf\xd5\x7fA\x8d\x97\xca\xec\xbfs\xf8\x8c\xbe\'\xf4\xc8?\xbd\xef\x8aM\xa23\xf3?\xe0U\xc4\xc3!\xfb\xc5\xbf\x8d\x8f\xaaO\x0fp\xe9\xbf\x8e#\x19\xb5\x0bO\xe6\xbf\x88,dLk\xf2\xf2?\\s\xf7=\x05\x8e\xd6\xbf*\x04\x8b,N\xfa\xe6\xbf,\xf8\xb8\xe9I\xda\xd4?l\xd19\x1dqJ\xf7\xbf\xdd\xc1u\x17 \xcf\xe0?\x00\xc4\x8a\xbc \x12\xc7?@\x02\xe3\xec4\x1b\xe7?\xa3,yQ\x02\x07\xc3\xbf\xbf\xc0\xa5\xb7\xc6K\xe6?\x8d\xf4\x02 vC\xe5?m\xe9Lf\xc7\x90\xf2\xbf3\xfb\xec\x1am\x1es\xbfP\xe7fr@\xc5\xeb?8\x8eu\xea\xd9\xeb\xea\xbfI\xbd\x9d\xde\xb30\xda?\x19\x89\x82\xef\xc5\xd7\xf4\xbf\xef\xaa\x9d#\x88$\xf6?\x05W\xe8V\xe6\xa3\xcf\xbf\xa4\xa9\xe8.\xfeE\xc6\xbf\xec\xd9m\x97\xdcI\xe1\xbf]F\xb2\x16B\xe7\xe2?,WR\t\xe5\xaf\xe2?\tK\xe9\x87$(\xea??\x0bM\xd9R\xba\xb6\xbf\x88F\xe3\xb2\xc3v\xef\xbf7^\x89\xd8j#\xc4\xbfY8c6\xc6\xdb\xe8\xbf\xca\to\xbf\xec\xf0\xd9?w\xe0\x13\xad\xb9\xeb\xe9?\xaa\xe8\xb7\x92A\xe9\xf7?\xcc/\xcb\xae\xb1T\xd3?\xf97e\xa4a\xab\xf5?\xd6\x06:nh\xb0\xde?R\xd6{\x89\x90\r\xf0\xbf\xa7\xd1\x0cD\xff\\\xef?$\r\xc6\x91\x16\xf1\xfc?\x9c\xca\xe3\xda/\xbb\x03\xc0j-S\xa7\x98?\xfe\xbf\xd0\xe5\x9b\x92\x11\x82\xd2?K\x88&\xbf\xc8\xee\xf6\xbfhB\xa6\x02\xe3\xb3\xe0\xbfC\xee(b\xda\xe6\xeb?\xfb!\xef\x1d\x12\x86\xe9\xbf&o8x7\xd1\xf0\xbfp\x16\xcc\xd4W\xeb\xfb?Ua\xa1i\t\x1e\xb7\xbf\xdb\x10\xc6\xc1vQ\xd4?N\xdc\xd7\x0f\xf7\xda\xb2?\xf1k\x0cF\xf5T\xca\xbf\x8f(q\xdbU\\\xdc?\x8b\xde\x162\x92\xbd\xc0\xbf8\xb80"\x88\x86\xdd\xbf\xdaa\x8b\xb21\xa4\xb3\xbfD\xb2\'\x859\xca\xd3?nw-\x98\x03\xc5\xd7\xbfaj\xb3\xacn \xe1\xbfr]\xff>V\x90\xda\xbf\xfa\xec\x1at\xd0x\xd3?.\x0b\xe5\x1a-]\xd0?5,\xbc\x87R?\xf5\xbf{P\x1a\xdc\xbe\xbc\xf0?\xe9\x86\xceHq\xe4\xd6?\xbd\xb0\\^w\xd6\xf2?\xa5\xe0\xf0\xaf\xf8\x99\xc4?\x02\'/\x11qy\xf3\xbf[\xda\x8e\xfd\xa2\xee\xe7\xbf*Wa\x96\xb8\xb8\xd0\xbf\xef\xb6\xed\x8d\x03\xa0\xe0?\xd9\x045\x1cR\xac\xd5?\xd0!\x9b\x9c\xb5!\xea\xbf#SgZ\x9a\xa0\xe2\xbf\x19\xc7\xf9\xf26\xe7\xc4\xbf\xe2\xd7`\xbd\xc0\x97\xe2\xbf\x95\xa4j\xb5f\xac\xc9\xbf\xc9\xc2\xdb\xf6Ka\xf5?^\xdbE\xa4\xdfb\xf4\xbf\xc7\x95\xd6\x01X\xcf\xb9\xbfsk\n\x9e\x9a\xf2\n@\x8c\xd4\xb6\x919\xb6\xf2\xbf\x1c\xce\xa6\x8b\x88\xb2\xc0\xbf\x86\xb8i=J\x85\xc9?\x9e\xfc\x94\xfa\x8c\xbe\xc9\xbf,i\x03C\x99\x87\xef\xbf\xe3\x04\xa5\xdb\xcd\xb0\x95\xbf\xa76\x00t\xcbL\xf2\xbf\x1d\xac\x86\xc7\x8e\x9a\xdf\xbfo_U\xd4)h\xda\xbf<>\xd0\xe5z:\xf5\xbf\x88\xccQ8\x943\xd8\xbf\xeb\x0fJi\xbe\xaa\xd6?q7\x06\xda\xb5r\xe1?&\x07\xcb\r\xeb\x8b\xd3?\xa4h\r\xc4I\x89\xb5?\x1dI\x00\x01|H\xb5?i\xba\xf1\x04\x1b\x07\xba\xbf\x1f\xc0L?\x11U\xdc\xbf\xe7\xf6I\x17u\xa6\xde?`\x19\x19\x8f\xad\x86\xe9?\xe2\x8e\x0c\xb3ag\xe7\xbf\x8d4\xdc\xe1%\xe1\xd6\xbf\xa8f\xea\xbfH\xe3x\x8b\xb0>\xb4?\xa0eT\xc14\x16\xe9\xbf\xdc\xb0\x91\xa0\x04\x18\x00\xc0\xd5\x19\xd7v\x96\x1c\x05\xc0$\x17\xed*\xef\xf6\x04\xc0|\xe8\xea\x04%\x05\x15\xc0\xb2&\x1e\x16\x14\xa3\x00\xc0\x8b\xf7\x8d\x896\xdf\xf9\xbf\xdd\x9a\x0c\xed"\xe5\x01\xc0x\xf2\xb5\x15\xc2\xfd\xdf\xbf\xca7!\x8cWY\xc6\xbf\x18\xa6\x9es\x96\xca\xe8\xbf\xaf7\x11\x14\x9c)\x08\xc0KZ\xd5\x90\x98\xe6\xb2\xbf\x91\xd2C\x18\xdde\x06\xc0U\xfe[>[ \xee\xbf\x8e\x19\x03\x9aj\xa2\xd4\xbf\x84\xd1\x984\x1b\x15\xf4?\x9c\x16\x05G\x8dx\xeb?\xef\x15MA\xac\xa6\xec?\xd5\x8e\x12wG\x9a\xf3\xbfZ\xe0r}q[\xbb?A\x13\xb1\x85\xd9C\xe5\xbfL\xaf\x00_\x8b\xfe\xe3?\xdeG~\xa1B\xbbp\xbfuCo3\xbf\xe6\xd4?\xab@\xb7\x9e\xf7:\xd0\xbf\x1d\xdf\xe7\nfs\x00@\xb2+\xa7\xb9\n\xd3\xdc?\xa3\n\x9b\x04\x9cv\xf2?o7.\xb9-\x0c\xfc\xbf\x9bk\x88\xd7o/\xf2\xbf\x1aD\xa818\xbf\x07\xc0\xb6Q{\xee;4\xf6\xbf\x1a\xe3z\xe0[\x13\xdc\xbf\x8a\xcdDU\xd5\x14\xf8?\x10\x89Aj\xc2\xdc\xee\xbfE\x05\xb1\x8b\xb6\xe0\xec\xbflR\xcb\x03\x0bQ\xf6\xbf\x89\xd9\xd2U\x92\x16\xed\xbf\x91\xdd\xc1\xe9,%\xf7\xbf>\xc5\xe5\x03j{\xa0\xbf\xf3\x98\xb5\xf7\x98e\xf3\xbfzY\xd0\x1b\x0f\x01\xf2\xbfdfH6\xbfT\xfc\xbfd\x98@9ii\xd0?\xc2\xa77\xce\x13\x0b\xd8\xbf\xe8\x11t\xf9h&\xf0?\x97\x82\xf3}\xf07\xfc?{\xd4\xe5\xd7\xb9\xe6\x00@3\x17f\xc0Q\xce\xe7\xbf\xd1Zf\xf7\xa5%\xec\xbf\x15\xe8\xe5\x9d\xdf\xf7\xcc\xbf\xc7v\x05\xce\x8fc\xf5\xbf\xa4=\x05LRs\xd0\xbf\xc0+\xd4n\xf4\xa1\xf0?Y\xd8\xaf\xf5\xaa\x17\xc1\xbf\xaf\x19dY\t\xbc\xc3?\xd7\xb7\x0e\x98\xce\xcb\xea?\xed\x9d\xec9\x0f\xa5\xfd\xbf\xb9\xd8<\xbb\x0e;\x04@(\xd1\xd9\xb5\x87G\xfd\xbf\xec\xf8<\x9d\xc7\xb3\xe5?4\xaf\x16F\xfe!\xbd?lX^-\xa7\xc9\x00\xc0\xd3Yfn/\xed\xe0?;t\xb6}\xac\xd3\x01\xc0\x1a`\xbd\xb8\xb1\xa0\xcc?\xcds\xb2\xde\xca\xfe\xd0?hA`\xdbD\xea\xdf\xbfE\xa6w\x91\x03+u?\xe7\xcf\x8c\xd3\x84\xa5\x03@\x94\x1d3\x82\x9f\xeb\xe0\xbf\xad\xe8{\xd7B\x16\xf8?+\'\x0eN\xf9.\r@!f\xbfa\xc0\xea\xf4?\x07\x87NO\x15\xc5\xb3\xbf\xcc\xb4A\xee\x08\x14\xf3?e\xa2\x8e\x08R\xb0\xb8\xbfY\xd4H\x10\x9f\t\xd6?\xd9\xf4\xef\xa9\x15\x06\xc0\xbf\xda\x83|y\xa8\x1d\xe6\xbfW\xdfG$W5\xd3?\x9f\xc6\x1f"\xd0O\xed?/\xf9_\xb6\xc3\xef\xe7?\xbd\x0c\xc9\x02k\xcb\xf3?n\x8c\xd2+\xbdL\xf2?!\x17x>\xa1\xeb\xfd?\xfe:\xfe\xa8\xfb\xa8\xe8?h\x90\xc3Ad\xc2\xe5\xbf\x85\x9fr\x1d\xb7#4\xbf\x90\x881\n\x13\x0c\x06@\xd7\x06^\xbe(\xdc\xf0?\xdf\x06\xaf0Ta\xf6?\xf7>\x9d\xedCR\xeb?\x99d\xf2\x1a\x9d\'\xce?\x1d\xa9oq\xa3\xd6\xf6?\xcb?=\x93B=\x06@Pc~\xcd\x03:\xf9?\x8c\x06&I\x83i\xf6?\x18\x83F&S\x81\xef\xbf\xaa\xd8\xa8;`\x99\x01@\xc2\xee\x82[\x1a,\xca?\x1c\x04\xc4\xb0\x92\x11\xff?\t\x93]B\x15\xdb\xf6?\xf0\x1dT\xff\n\x9e\xef?h@\x14\xae\x1b\x91\xec\xbfL\xd2k\x1e\x88_\xdd\xbf[[Z\x11\xd2\x15\xea\xbfc\xde\x91\xfcF\xd2\xe8?U\xeb\xd9\x13NY\xf5?\xd4wD\xff+;\xa6?\xbc\xfc\x85EY\xfa\xfe?\xeb\xec\xa9\xd5\xe7\x0c\xf5?x\xe9&%\x9e\xa6\x03@m\xcd4\x8acS\xe8?#\xbb\xad\x04\x9a\x96\xf0?\x86o\xa7\x16Fm\xe7\xbf\xa1U\xd0*r\xc8\x0b\xc0\x870.\x8e\x87L\xeb?\xd1\xa4\xb2Sd\xea\xd0\xbfB\xff\xf1\xa0\x9c*\xef?\x9b\xbc6\xbag\x04\xf5?\x7f\xc1[S\x1b\n\xf3?\xe3\x8c*\xd2\'~\xfa?V\xb0r\xac\x17\x0b\xf2?\xab\x18\xf5\xccG\x87\xe5?.pe\x9b\x04l\xe0\xbf\x80\x04\xc7\x85N\x18\xd9\xbfm!\xd3\xac\xa6\xb0\xc9\xbf\x90\x85\xa7<)\x8a\xe6\xbf\xbf`\xc0\xf83\xdf\xfb?\xd5\xd5\xf2\xad\xb6\x85\xf1?\x87\xa5-r\xb2\xdb\xb7?DJR_\xe6\xe6\xd5?\xf6\xb8\xa8]\xce%\xf5\xbf\x0c\xc5\xb2\x99\x1d\x17\xf0?\x15\r\xaf\n\x8a\x02\xf4?\xa9\xa1\x85a4\xe5\xe3\xbf(\x13\x8b\x9d\xee\xcb\xe9?`\xff]\t\x83\x1e\xf7?\xfc1\n\x80\xb9\xe1\xe7?.\xb0o\xf1\xd2\xae\xff\xbf!\xd4\xac\x8a\xc5\xcb\xfa\xbf\xaej$\x13\x10E\xf2?Y\xcf\xba&a\x95\x02@!\x11\xe0\x17\x88\xdb\xb3\xbf\xdc\x0b\x13\xb8B\xf1\xd3\xbf\x06\x9d\xea\x81\xc5\x91\t@\xaba\xa0m\xb5D\t@\xb4\x8bQ\x8b5\xf7\x14@\x9b\n\xc5C\xdd\x9e\n@a\xca\x18\x85%W\x01@_\xc1v\xfa\xde\xbf\xf2?\xfb\xf6\x84\xf4\xad\xd2\xf9?\x07\xeda#=\xfd\xe5?u\xeat\x08h\x1f\xff?>\xe3\xed\xdcM\x92\x97\xbf\xf0\x7f\x92\x8d\xc8 \xd4\xbf\xab\xb2\n\xda\x19\xed\xe6?/\xb0\xc1{\x1cE\x04@\n\xa7\xecG\xbb\x13\xe3?y\x8bJCEO\xd7?\xf8F\r\x1d\xf2\x06\xc7\xbf\xcb\x8d\x92\x0c\xcb\xd5\xd0?3r\xfeca=\x02@\x01wUn)l\xf5?\xc4.(\x89J\x15\xd7?0\x03\xed\x06\x8f~\xe3\xbf\x01\x94\xd9\xb0w\xa6\xc4\xbf\x83\xfd\xcce\x17\xbe\xe9?xvCy\xbcu\x00\xc0q\x03y\x01<\xbd\xd6?\x0e\xbeZ\xf38\xd4\xe0\xbfR\xd8\xd2\xbf\xd0#\xf7\xbf\x17}\x8d\xbc\xff\xaa\xa3\xbf\x12\x16\xfe\xa2\xe0\x82\xde?K\x15@z\xc63\xfd?\x17\x10\xc1<\x07\t\x00@\x14\xfb$\xe3\xf9\x1c\xf5?\xf2\xd5\xa9&\xadG\xf6\xbf\xf1\xa1\x864\xd4\xc4\x01@\x80x\xffc\xf4\xe7\xf5?\xf9Q\xff\x89\xf2\x94\x01@\xa3S\xd1s\xd9\x17\xfb?n%{\x1cK\xa6\xbc\xbf0:\xe6\x1f\x05\xe3\xf2?R\xb3.=\r\x85\xd4?8m@\n\xba+\xf6?\xd9\xc9HXV\xd2\xe5?\xe2\x87D\xad?~\xec\xbf\xe5\x96\x19|\xce\x9b\xd0\xbf\x01\x97m\xfbd\xb9\xce\xbf,`\xaf\rG\xcc\t@\xf9\xe0\xbcF\x06\x9f\x02@_\xbb/x\xc0\x9e\x06@\x05\r6\xc1\x81}\xcc?\xcd\xba\x93\x93\x8fO\xe3\xbf5\x9b\xc8\xbdN\xc8\x11@\xd8\x90{3\x9f\x90\xf2?\x0e\xe5\x99q$\xc9\x00\xc0\xd7(\xc7\xd9\xf3\xaf\xfc\xbf\xf2q+f.\xe1\x03\xc0\x9b<\xa6\xc55{\xec\xbfrlTN\xac\x1d\x06\xc0\x1a\xa4\xfb\x8d\x1a\x19\xea\xbf\xde\x1a\xdf\x8b\xfd\xbe\xe2\xbf\xbb\x87\xc5\xb3D\\\xd6\xbf\x9e\xb3\xed-\xbe\xf9\xf2\xbf\x90\t\x8e/b\xcc\xf5\xbf\xe0BpS\x819\x0f\xc0N\xd4\x19\x85\xf0\xaf\x02\xc0\xcb\xfc9S6:\x02\xc0\xde\xf3\xe5?\x94\x90\x01\xc0o\xc2gz:\x11\x10\xc0\xb0\x804\x1f\xca\x01\x0e\xc0\xaa\xdcI\xc4\xe0y\xff\xbf\x03\xc77\xf9:\x8e\xf2\xbf\xa9\x92\xd5\x852I\xbe?\xb4r\x1c\xa9 \x8a\xd6?\x13\x9bJ\xbc\xa1\x1a\xbf\xbf\xcaD\x0f2\xc1\xad\x8b?\nr)\xb4^S\xb0?}\xa0\x8b\xc1\x06\x98\n@\x88\xdc^wA\xcb\xf5?\x9d\xf3I\xdf\x81D\x91?sb\xa2k\xf4\x8d\x00\xc0~\x84\xbc\x84\xf0s\xf0?\xd9\xdeZ\xdf\xb8\x16\xdd?q\xcda\xb3\x94$\xf3?\xaa\r\xfc\xa8\xc9G\x0b\xc0\x1fg\xb3\x1ebP\xc2\xbfJwV\xe0\xde#\x00\xc0\xcf\x977Q\x8e\x06\xe6\xbfxYN\xb4"\xce\xf7\xbf\xf5w\xe2Y\xe29\xc0?G0\xc8\xcc\tS\x00\xc0\xd4\x83\xc7C\xe8\xc4\x07\xc02-*\xffU\xdf\x06\xc0\xb4\xff\xf9\x11\xb3\xa5\xf4\xbf\xa9\xcf\xa0\xf8r\x85\x04\xc0:\xce\x8fC\xd9?\x13\xc0\xc6\xeb`\xb2r\xc6\x08\xc0\xbe\xef\xfd\xa6\xd0r\xf7\xbf\xeemq\x91\xceE\xd6\xbf-\xdd\x08\x17>\xe3\xc0\xbf%\xc5\x1b\xb3\x82\x1c\xe9\xbf\xb68\xeap\xac\xb1\xd5?\xacD_+\xdd7\xdc\xbf\xf5\xd6\xe3\xac\xd6j\xf8?\x84\xda\xec\x83\x93\xcc\xf5?\xdc\xba\xabz\xda\xb7\x00@\xa7\xff\xed;8<\n@\xfdB_.\x1c \xb7?K\xeda\t(\xfc\xe1\xbf\xe5N}\xa087\xeb?\xc9kN\xbd\x9a\xe6\xd4\xbf\x80\xf1\xec=,\x14\x04\xc0%\x19*\xfb\xf2b\n\xc0\xf9\xe8N\x00b\x9d\xeb\xbf\xa1\x12\x9c\xec\xd2E\x0b\xc0\xcf\x84F9\xdc\n\xe7\xbf{\x89\x8aQW7\xf4\xbfG\xba\xbb\xee\x7f9\xd0\xbf1[F\xc9\xc4\xd5\xf3\xbf\xf0\xf9\xc2\xf1\x98\xdb\x03@\xa3\x1cD\xea\x83$\xfa?PB\xeaSz\xad\xf6?\xce\x8c\xb1 \x80l\xf4\xbf\x16\xcb\x93\x08\xca\xd5\xee\xbf"R\xb2\n7\xe5\xbe?;\x94\\\\\x9d\xf1\x05\xc0\xd4\x81NV\x8aX\xd6?\xd3\x15c\xed\xf3t\xf2?\x9c\x90\x87\xb7\x91\x85\xc9\xbf\xf4\xfa\xe8u\xde\xf3\xf6?\x82 B\xdf\xe0K\xf1?J\xd3\xc3\xf7\xf8G\xf1?Z\x91\xaew\xc3\xa1\xe7?&\x03\xf5)\x10 \xfe\xbf\x87,\xdd\xf2.1\x0f\xc0|\xd5\xe1\xed\t.\xc9\xbf\xe2\xb8\x8d\xfbH/\xe6?V5l\x12+I\x05\xc0\x062\x979\xb6\xe1\x08\xc0\x8bQ\xe6#z\xa3\xf5\xbf$\xf4\xae\x9d\x94\xa9\x93\xbfH\x7f\x07\x08\xe2\xac\xef\xbf\xd0\xc7v\xeb\x0e%\xef\xbf\x82\x9a\xfa7\x9c\xb4\xd5\xbf\xf6\x15.\xa4\x1e\xf5\xf9\xbf\x0c\xb2"\xc4h\\\xee\xbf\xbb\xff\xc4\xecB}\xaa?\x7f\x01\xe9\xac\xad]\x03@\xed\xcbVT\x04\xb5\xd7\xbf]2\xb5\xd2s0\xdb?\x9eQ\xe3\x1d\xa52\xce\xbfk\xeb\x06\'\x00\xeb\xef\xbf\x83U\x89%64\x03\xc0\x03\xadAk\xc4y\xb1?\x1f\x0f\x1f\x91\xa2i\xf6\xbf\xd3\x8d\xa0z\x12\x84\xcd?\xber\xb2\xff\x03G\xe2?\x17t\xe8d\x9a\xfb\xd5?F \xf4\x8cE\'\xe7?k\x07%\xdc4[\xf0\xbf\xe6\x04\x9d\x8bx\xc0\xe0\xbf/\xa8\x0f\xc6\xa6\x97\x01\xc0\x1c\x80&\x02\xba\xed\xfb\xbf\xd9\x1c\xfb\xde\xaa>\xe1\xbf\r\xac\x0b\xf3\x82\x19\xf4\xbf*\x89\xdb\'\xaa \x0b\xc0\x91r\x99s\xe7J\xe6?\xbe\xad\x87\xbb\x99\xd5\x04\xc0`7\x8b\xe8&v\x80\xbf\x9d4\xc9\xab6u\xea\xbfL\xdc\xc3\'\xaa\x9f\xd4?\xc9\xc2\xff\xf8\xfe&\xf3\xbf\xcf\x1b\x00\xd3f\x9a\xd4?oY9W@\xba\xe0\xbf\xda\x88&8\xf1\xc0\xd6\xbf\xac_\xad6\x1d\xa8\xfb\xbfs%\xf7*q\xe5\xe4\xbf\x82\x93j\xd1)=\xdd?\xc1\xe0q|E\xfc\xec?\xa7\x12\x90\xaf\xd2Q\xf9\xbfu*\xfc\x9a\xeb\x06\x03\xc0\xd7\x9f=\xd5\x98@\xf5\xbf\x1c\x00C\xa3\xb6\xa3\xfa\xbfj.;\x96\xf9\x96\xe4\xbfh\xb5n\xcdI\xff\xe7?\x19\xd0\xd4\x0f\xa5D\xe1?\xe4\x7fd\x7f\xc0\xc9\xef?\xefC\x1eF\xf9\xb8\xe1?\x880\xc3\xec\x93S\xfc\xbf]\x0f\xbb\xf1\xef\xf7\xaa\xbf7^\x90x_\x02\xf2?h\xbej$\xc51\xf6\xbf\x02\x1e\x0c6\xf4\x9c\x07\xc03\x7f\x13\x14\x1e\xb8\xc0\xbf\xe6\x0cd\x9d(\xe9\xf5\xbfG\xce\xd7V\xe6W\xe3?\xe6\xc5\x9f\x9a\xfeC\x00\xc0\xe6\xff\xe0\xe5\xc5\xde\xc0\xbfi\xe4\x12\xf0#`\xf7?\xf3\xe0\xaad$\xe2\xdb?\r\x7f3JY3\xd7?yT\xed\x8d\xe5f\xe5\xbf\x0f\xd8\x1e}z\xe7\xba?\xa7|\xa6\x13G_\xce?[6\x07{\xc6\xdc\xe8\xbf\xac\x1f\x15?\x18}\xf3?\xa3d\xf6-\xd93\xf9\xbf\x17\xcb\xfa\x86S0\x00\xc0\x11\x15\x19j\xe7\xfc\xee\xbf\x9d\xcb\xf8\x05\xa1\xfb\xfb\xbf\xf8\x80\xda\xd1kS\xf8\xbfl\xbb\xb5\xc1\xdb\x87\xf3\xbf\x18\xa6\x8b\x84$A\xee?\n\x0be!\xba\xcf\xc2\xbf;(\x90m\xef\x14\xea?\xe5%` \x88C\xc9?oL\xe3\x08\xbc\xb8\xf4\xbfqlnh=\xd0\xf5\xbfc\xc7\xab\xa8\xfb[\xf7\xbf`\xa6\x1d\x8b\xdb\xc9\xf6\xbf\xcf/rE\x84$\xea\xbf\xf9b\xac\xc2w8\xe0\xbfd_1x\xfe.\xe2?\x9b:H\xef,\xfd\xfb\xbf]\xcb\x11r\xceG\xf0\xbf\x1d\xa32&\xf7U\xdf?\xd4$\xdbK@\x0c\t@\xec5\x88,\xe2z\xd2?\x87\xbbkh\xed\x14\xa0?\xf3K\x87*\xd9\xfe\xf4\xbf;\x10\xbc\r\x82x\xf0\xbf\x97\xf9p\xd9\\o\xd9\xbf\x8eq\x90#,\xf6\xd0\xbf\x17\x97\xc7cXe\xe5?\x112\xd3\x91\x17\xe7\x00\xc0\xbfi[\xdb\xbe\x99\x0f\xc0\xdc>\xa2\x83\xe8y\x08\xc0\xf1+\x97C\x97\xff\xfc\xbf\xb1\x87V>;\xcc\xd5?\xb80\x11gz\x11\xc8\xbf%\x9f\n\xa6\x9b\x1f\x96?\x89A\x8c\xda\x7f!\xb0\xbf\x8d\xb89\xcc\x15I\xc2?\xefT\xa5\xf3\xce\x1b\xfe?\x01\xea\xf3\x9c\xb6\xae\xfd\xbfU\xac\xc2W\x95\x0b\xe1\xbfj\xcf\x94\xf6\x82\xb7\t\xc0\x04\x7f8\xfe\xbcG\xfa\xbfKIFpE\xd3\xf7?\x84\x8ex\xf4\xb3\x9f\xf4\xbf\xfb\x92\x15\x9cI\xba\xd7?\xe7\xa6\xf4c\xf5\xa5\xe5?\x17\t\xa6\x1e\xa0\xb8\xdb?K\xec\x1a+\x932\xf2?j\x9d\xef\xd3\xf1\n\xd4?\xbd,\xaf\x16\x8a\xd4\xf7?}\x98l\xfc`\x07\x03\xc0\x16\xb0A\x9cj\x08\xe3\xbf\x1d\xc3\xc9i\x01\xc0c\x05\x11\x00\x83\xc4\xcf?-\xfe\xc0v\xde#\xe2\xbfJ$F\x94\xe0T\xef?B\xf2\t\xcd\xbf\xcf\xde\xbfc\xbc4\xf1~\xf4\xe1\xbf\x14\xb0\x81\xcb\xebP\xd9?\xbe\xf1\x00\xf2\xca\x0b\xce\xbf\x1d\x85\xc8?M\x8a\x03\xc0\xd4\x0b\xfd$\xc3\xbf\xdc\xbf&F\x9f\xed0\xe6\n@\x1a\x10\xb8I\x81\x93\xe8\xbf\xcdLH\x98\xb2=\xe6?,\x0f\x920K\xd0\xda\xbf\x1f\xf7\xb0\x9aM\x05\xdf?\x97\x05m\x93\x80\x0b\xe7\xbf\xc9\x84\xd8n\x83)\x03\xc0\xd8(\xea\x15\xc3"\xf1\xbf\x8c`\xe0\x8b\x80\xbe\xea\xbfp\xeb$b\x12%\xf9?nb\xaa\x10\xcb!\x00@^#=h\xad\x04\xb7\xbf\xc9\x03\n\x9c.\xfc\xc1?\x1b \x10\'\x05\xb4\xd8\xbf\x18\xa5\x80\x86s\t\xd2\xbf\x17\x00s\x10\xb8\x06\t\xc04\xd1R\xe1\xa4*\xf4\xbfg\x17\xd1+$\xb3\x03\xc0\x05m\xfd\x082\xcb\xf5\xbf3?c\xaf`\x00\xf1\xbf\x06J\'\x07\x05\x84\xe8\xbf\x1d#\xb8\x0b1|\xd0?j\xf0\xa0#Z\x1c\xc2?bJ\xe1\xf5i;\xa1\xbf\xbd\t\\\xa9Em\xce?\x9c\xc2bkn\xc7\xe1\xbf\x07\xfb\xads2\xa2\xfe\xbfk.]\x90\x8eY\xee\xbf\xbf\nn\x8fL\xed\x02@\x0b3\x9c\xed\xc2\xb7\xed?\x84\xef-]5\n\xe1\xbfy\xa7\x80\xaeC\x8e\xee\xbf\x99\xb0\xbc\x9a\xfa:\xe5?\xd4\x80+\x9f\x10\xa4\xe5?\xec\xaf\x0f\x9bCg\xf0\xbf}0\xeb&f\t\xee?\x14[\x89\x18\xd3\xfd\xc0?\xb55\x98VR\xf3\xfe\xbf\xf9\xd0\x91\x11`\xb4\xdd\xbf\xbf\xf9\xeew\xb9\xd4\x06@\xd3\x0e\xab\xde\x15=\xfc?U\xdf\xf9}\xa8~\xf2\xbf\x11\x17\x90\x99)\x8d\x10\xc0\xbb\xf9\x86"[\x1b\xee\xbf\xa1S\x1c~\x90\xf2\xf1\xbf\xa2[\x12&\x15\x19\x01\xc0\xb3\xc8\x9cdD)\x01\xc0\x07\xbc`\xd9+\xf2l?\x90\x1f\x01\xf7\x1f0\xc0?\x95;a^\xe6\x80\xe2?\x9fQt\x98\x9f\xc3\xe9?\x93z\xe9\xe9:\xc6\xd3\xbf\xe3gR \xfb\xb0\xd4?\x93~\x9eB\x91D\xf6\xbfs\xdcO\x17\x8d\xdf\xed\xbf\xe2\x99\x18\x1e_\xf6\x00\xc0~\xb0\x16\x08\x83^\xe7?\x95q\x16&\x14\xa7\xec\xbfKa\x05\x1a\xbcH\xdf?\xb1\x9f\xed\xe8\xf0&\xed\xbf*6\x19\xe5\xb6\xf0\xf3\xbf\xbep\x17s\xa2\xdc\xf9\xbf\xc7`Ja\x12a\xd2\xbf\xb6\xf0\x11\xcaS\xda\xfe\xbf?\xc5a\xea\x9b0\xc8?\xa8K6E"\xc3\xf9\xbf!8\xb51\x7f\x83\xe8\xbfYW\x95N\xef\xee\x0c\xc0=\xd1\xf7\xd6O\x1b\xe6\xbf\xa8\xcdeVS\xa9\xfc\xbf\xde9\xcb\xb7(c\xf8\xbfcx\x96\xb0!R\xf2\xbf\xae\xc2L\xbb\x1d\x95\xe0\xbf\x93}\xb7U\x88\xcb\x00\xc0\xd1\xf6]\x18\xd9\xa9\xea\xbf\xb6\xe1*Tm\xd7\xe4\xbf8\xe1,\xd5\xbf\xdb\xb4\xbf\xba\x1b\x83\x93k\xdb\xf9?<\xfd\xfedL\x00\xf8\xbf\xf3}K=\xe2\x10\xee?\xefl2\xado9\xe1\xbfo(\x94\xd4X\xc1\xd9\xbf\x0e\xa1|5\xd8#\xe1?\xdc\x86\xb8\xca_e\xde\xbftG\x1em\xcbC\xe8\xbf\xa0\xb7\xd0v\x0f\xee\xe0\xbf\x8f\xe7\x1ez\x0f\x15\xf3\xbf\xd3\xac\x10p\xdaX\xd5?\xe7^\xbb\x96,\xb2\xe3\xbf\xfb\x86\xbfQ\x05\x89\xd7?\xfd\xd8&[\xcf#\xdc\xbfI1O\x05Q\xe6\xe8?&\xb1\x1a\xbc\xeb\x03\xe4\xbf\x17\x10\n\x8aW\xa6\xc4\xbf\x9bb\x13\x1cF\xc3\xf8\xbf\x16\x0f\x10\xf4\x00\xc8\xfd\xbf\xe88`\xd9\xbf\xdd\xf6\xbf\xd7\x0eU\xc2\xfa\xc4\xd2\xbf\x9b8\xa4Q<\xc1\xb0?R\nw\x1a\x91*\xd2?PQ\xd5\x94\xb7\xfd\xda\xbf\x83\xc8Q\xe0G\x92\x97?<\xb6\n\xbb\t\xfc\xe3?\x11\x8d\x16/\xb4\xfd\xc5\xbf\x98@#\xc9\x95[\xd1\xbf 4\xa3\xdc.\xda\xc6?yf\xc5a\xde\xf2\xe3\xbf\xfb\x1f\xa1s+\x18\xb4\xbf\xc8a\xdf\t\x18\xf2\xda?|\x9cEY-\xe6\xf6\xbf\xa4\'\x89c\xc9\x95\xe6\xbfs0\xd3\xc0M!\xfe\xbf\xee\x86Y\xc9i\xc1\xdf\xbfr;\xfbK\xc7\xa0\xf5\xbf\xe9\xaf\xee\xc3\x85\xd5\x08\xc0\xcdV$x\x9e\xb7\xe3\xbf\xff\xa3\x07\x1ft\x96\xe4?\xc9\x06\xdf\xa4sE\xff\xbfL\xce\xed\xce\x8b\xd0\xf6\xbfP\xef\x81;\x85\xdc\xed\xbfP]\x0b\xec\xb9\xab\xed\xbfU+}\xd1\xa9\xb8\xc9?\\*A\x8c.$\xe8?w\xae\x91\r\xc5\xa3\xb1\xbf\xa4\xbc\xbf\xfb\x1a\xeb\xe0\xbf\x1c\x07 \xed\x1a\xbf\xce\xbf\x87\xcb\x7f\x9d\x0c\xbd\xcb?r4`2\xfeO\xed?\xdfb\x1c\xf5r\x1f\xe2?50\xfd{\xc6\x19\xf2?dl\x9a%\xda\x02\xca\xbf\x9d\xae\xdc\xb2\x9d\xf1\xdc\xbfv\xb9\x03*\x8a\xe9\xd4\xbf\xbc\x9cFo\xad0\xd0?\xcaw\x05\x97\x982\xe7\xbf\xcek\x8d\xd5\x87G\xac\xbf\'\xc0\xee\x0f\xb8K\xdc?n\x14\xc4p\x18\xfc\xed\xbfL1G^*F\xe2?\n\x06\xfb4,W\xf2?\xe9\xe4\x1c\xcf\x91\x91\xe1?\t\xf8\xe7\xadJ\xb8\xc6\xbfW\xa2Mz\xc8\x92\xf2\xbf\'\xe0\x91\xcb\xcc\xf4\xc8?\xe1\xf3;\x15\x08M\xf2?S\x1e\xb0\x0e}!\xd1?\xb5<\x87\xddh-\xe5\xbf\x0bY\x06\xabBr\xcb\xbf&ME\xea)&\xe5?G\x0cN\xd5\x7f\xef\xf0?s\xdf\x9c\xd7\x87?\xe9\xbf\xcb(\x178\x9d\x08\xf0\xbf\xab\x11\xbfE\'\x90\xdd?\x92\xd5Cv\xaa\xa4\xdc\xbf\x05\x1bGS\xf8\x13\xf0\xbf\x91u\xd7\xdbDN\xd9?\x15[\x84\x90\xb3\xa8\xea\xbfo\xd9\xdcnx\x14\xe6?\x86k\x87\x04\x81\xb5\xc7\xbfO\xef\x14\x14\xc4\xce\xb2\xbf\xa7U\x9a\x03;\x0f\xe4?\xe4\x0c\xb6>LM\xd9?\xbb\xc8\xdfxX\x99\xe6\xbf\xbc}\x8e\x0cZ\x99\xe7\xbf\xb8P(u]y\xd4?C\xb6&X1\x19\xdc\xbfT\'vn\x8e\xfc\xfc\xbf\x12+\xdeC2\x91\xfa\xbf\xa0!\x80\x01\xce\xb5\xd3\xbfB\x82\xcc8\xa4j\xc2?\xc8\xba\xa4\nl\xc8\xb1\xbfn\xe74\xe5h\xcb\xe7\xbf\xea\xdcV\xa6l+\xb8\xbfP\xc9\x0e\xccnh\xc8?@/\xf6)B\x0f\xe1?\x93\xac\xa5\x98dj\xf4\xbf\x13\xfe\xfaJ6\x08\xde?\xe1N2\xe8\x84\xa8\xbc?\xc8[u\x94\xf8\x02\xe2?1\x9f5\x87t5\xe3\xbf\x00U~\xd3PD\xd3\xbf\xb8\r\xe8\x86dB\xb0?7<\xadhq\x89\xe1?\x97\xf0\xbd9\xd8\x98\xe4\xbf\xd7\xa1;\x84\x94P\xe2?/\xc6\x96\x8b\xe3\x1e\xd3\xbf\xd0G\xf1j\xf9\xef\xef?#\x99A5\xfb5\xf0\xbfPk\xe3\x07{\xbc\xde?\xbc\x12\xd5\x7f\xbe\xc6\xd1\xbf\xe11\xffb\xbb\xdb\xde?|\xde\x9a]w\x1f\xd2\xbf\x9d\x0e\xe5c\x01\xcb\xd2?\xc9\xf9\xe5\xb1\x8d\xf1\xdb\xbf\x8b\xda\x11\x17@\xb7\xd6?\x849a\xd2\x8cT\xe7?\x9e\xd9\xcc\x8ac\x07\xef\xbf\xa5sIz\x16K\xeb?\xfc\xb2(\x81S\xd5\xf5\xbf\x9a\xeb\xc6\x83N\x1d\xb9\xbfyZ\x99\x14\x0bB\xe5?\x1b\xcbin\x11R\xd8?\xbc\t\xbd\xb6\xb2R\xf4\xbfh\xef\xe1BQ2\xca?\xbf\x18\x1cH-F\xf5?\x92\x80\x95\x7f\x82[\xb8\xbf\xf5\xd4[G\xdc\x8c\x87\xbf"\x01\xf9:\x06|\xdd\xbf\xab\x08\xbf\x84DN\xf1\xbf\x96f\xe8\x1f\xd0\x1b\xdd\xbf6\x9aD\xb9\xd1\x8e\xe0?\xe61`\x1b~\xc2\xe1?\x10-F\xaaBk\xe6\xbf\x9d\xc1\xf6\xbc \xbe\xb9?$vk\xc1\xed\x0e\xe6?\xfa\x06\x08W*\xf7\xda\xbfF>G_{M\xe8?p(\x9fS\xb3\x92\xe8\xbf\xf4\xdf\x88W]\xb1\xe1\xbfP\xd5\xaeZ\xb0J\xdb\xbf$\xe3\xb8\x06\xb0\t\xe5?\x00A\x1c#\xfcw\xe0\xbf\xc2\xf7\x1ahm\x04\xc8?\xa1\x02\xee\x1c&\xfe\xed\xbf\x82\x04J3\xb0\xa2\xb6\xbf}\xa2\x99{\xb7\x97\xe3\xbfr&\xf4\xa8\xaf|\xdc?\xafj\xb6\x00\xe3p\xf7\xbf\xdb\x03\xe4j`{\xb3\xbf\xbe!\xe3\x84hR\x00\xc0\t\xa9\x02(\x8f\xdd\xe3\xbfE\xcd\x18\x8dw\x90\x02\xc0\xbc:W\x8a3\xbb\xf8\xbf\xae\xcf]\xa8\xbb\x87\xee\xbf\x00J\xe2\x1e\xac\xa3\xfd\xbf0g,\xa4%k\xeb\xbf\xaa[\xa5\xf7*\xfd\xf2\xbf\xe2\xb6\xa1\x14\x9f9\xc6\xbfK`\xb6k8\x98\x00\xc0\xbeM\xdc-\xbd\xa5\xef\xbf\xd7\x05\xbe\xf6\xb4T\xa3\xbf\xd1j\xcf,i\xe0\xe2?=\x7f\x06\xb4\x8a\x8d\xca?\xd79\xa8\xd9\xefX\x95\xbfr"\xcd\xc7\xcd\x13\xe8?w\xa4\xc1\\\x8b\xf9\xf1?\x15_\xcczc\x9d\xbd?\t3\x99z)\xc9\xee?\xfc\x8f\xc6\x85<\x9d\xdb?\x1c\xc29>\xd2e\x97\xbf\xef\xf9\xff\xad\x9b\xb1\xf8\xbf\x82O\xd6\x08\x90v\xee\xbf\xd5\xc6fK\x9fg\xd1?\xb5\xd3\xaaP\x90\x08\xd2\xbfI\xd8\xe0!\x8a\xb9\xde?\xfc\xc5*,\xaf<\xc9\xbflOV}%\xbe\xf7\xbf>\xe3\xa0\xe8\xf4*\r\xc0?\xbd\x808U\x87\x0e\xc0X\xde~\xaeYu\x1e\xc0?\xa4\x9b\xbd\x1a\x13\x1d\xc0\xb0"\xf4s\x07\xf5\x1f\xc0\t\xc4\x93&\xa3e\x1a\xc0\x12\x8bR\'\t\x04"\xc0PK\x9d&(\xa7\x19\xc0\x151g\x04\xd4\xc3\x18\xc0\xdf\xcd\x85N\xff[\r\xc0\xb5\xa9\x7f\x18\xf3J\xfe\xbf\xe2\x1dL\x93po\xff\xbf\xcc\x95MO{\xef\xe6?\xc6\xe6\xcc\xd3\xf37\xf7\xbf\x88\x04\x05\xdd"\'\xf8\xbf\xaa\xe8\xb88\xaco\xd2?bW\xb5\xd0\xf0\xf6\xc9?\x03\xc4\x03\xa6@\xc3\xda?\x15dhHTA\xf1?\xc7\xa8\xbbZ\xae\x12\xd1\xbfO\x92\xf3K\xdc\xff\x9a?\xc6\x97\xfa\rd\xa7\xd2?\xa0\xf2\xa1\xd3\x00\x94\x8a?\xc2\x87\xd2\xf0\x12\'\xf9\xbf|\xcds\xeb\xc0\xbb\xe6\xbf\xacXK\xf0U\xea\xb8?\xb3\xea\x9e\xa2\x9b\xbe\x08\xc0\xc1\xa9y:?\x11\r\xc0\x96y\x9c\x97p\x1d\x03\xc0\x95\xbe\\\xbbq\xbd\xc6?C\x8e \xbe\xd2Z\xab\xbfI\xeaT3}\xdd\x10\xc0\xa16>T\xbe;\xd4?\x95\xa5\xc2e\xc4r\xe3\xbfe\x95\xea\xbaw\xf6\xc6?\xed\xdf\x02u\x85\x16\xd0\xbft\x15\x13\x18=K\xd7\xbf\xd6\x87)\xb7\xfah\xf6\xbf\xd0\xea\xc5I\xe1J\xf8\xbf\xc1\x9c\xf2\xfe0\x10\xff\xbf\x0cF\x94\xe51z\xd3\xbf\xcd\x90\x11d7D\xd0\xbf2\xea\xe8\xfd\xde\x07\xff?\xce\x91\x99to\xb7\xa0\xbf\xac\x94\xc6\xa9\xcf0\xeb\xbf\x96\xd5\x97\xd8\x13\x9c\xd9?\xcff\xc2\xc8\xc3\x19\xdc\xbf\r\xa7\x87\xcd\x88\xa5\xa9?\x03\x0e\x06\x849&\xd0\xbf\xcce\xcbm\xd6\xa7\xf1\xbf\xcd\x82\xd3\x8f\xca\xfb\xd7?\x95_\xcd\x06?\xce\t\xc0\xcf\xe6Hm\xb7D\xf7\xbf\xda\xac\xe0\xfaT9\x01\xc0l\x97!\xdf\xb9\xff\xf7\xbf\xff\xf4\x0c\x0b\x08\x1d\xcd?\x17gv\xd3\xc8\xa7\xf7\xbf\xfc\xc9\x0c5\x8a\x80\xdc?\x9a\xab\x8eJ+/\xf3?}R\x81\x104\x91\xe4\xbf\x90\xe5\xafVw1\xdf\xbfq\xdd\xa6\x90:F\xa9\xbf\x00\xa6f\xc6l\xfe\xd7?\x02\xdaD\xd0\xd2\x84\xd4\xbf\x86\xadL\xf4\x1e\r\xe8?\xc2\r\xed7u\xe2\xdb\xbf\xfa\xcd_ \xb2\xf7\xfa?\xe3*\xb3\x87\xb0 \xf0?Z\x00s\xaa\xe6+\x00@\xad\x16\xea\xda_\xd7\xcc?o.p\xa3a\x8a\xd9\xbfJ\x02>\xedoY\xe2?z}\x1b\xa1>}\xef?h\xd8\xb3o\xc8\xde\xe4?\xddY\xa2\x8c\x0b\x9d\xe7?rLLl\xcd)\xa8\xbfh\xf8>\x07\xb9\xae\xd3?_\x07\xb6\xc1\x10j\xea\xbf\xf9t\xa7\xdc\xa6\xa1\xf3\xbf(\x80qoU\x95\xf7\xbf\x95b%\xe5\x0b(\x05\xc0_<\xc8\xe2\x11\x03\xc9?\xfd\xbd\xfc&\xcc\x98\xf0\xbf~\x9d\xcbB\x9e\x02\x00\xc0\x9e\xf8gwR\xba\xd7?\x8b\xbc\x89\xf6\x01\x8b\xdb\xbf2\x1e\xb3 \xef\xa5\xe4\xbf&pry\x1b\x00\xc6\xbf\xb9)\xe9N)k\xec\xbf\x1eN}\x0c\xd5\xa9\xe8?\xdab{\x01E\x83\xd1?\n\xfd\x96\x15J[\xf1?K\xd6\x84\xa4C\xaf\xf5\xbfI^\xc2Xh\xf3\xfa?/\xb2\xe37L\x87\xdc?\x87X\xdf#\x18L\xdb?\xf7\xee\x18\xbc\xc89\xe6?Gw\xde%\x7f\xe8\xf9?\x1df\xdcI\xdc\x90\xee?\x8f\xba\xdb\xb0\x00\xe8\xd7\xbf\xc6\xdf\x92\xbc\x16\xa9\xe5?W\xbfb\xfb\x1c\x83\xa8?\xb0\xf7J\x8d\xae\xb5\xb8?\x1dEp\x9a~\xfa\xbe?Cw\x85~\xfd\xa5\xc5\xbf\x9f\'\xa41p%\xba\xbfe\xa0\x1cf9\x11\x00\xc06\xba\x06\xf1\x96\xe6\xff\xbf\x8e\xae\xf1\\\xc8\x8b\x07\xc0\xca\x98+mCe\x03\xc0\xd5\xe4N\no\xf2\xf2?\xee\x0e\x8b\xd3S}\xb2?s\x02z\xaa\x02\r\xe8\xbfx\x85\xd4q\xad\xa2\xf5\xbf\x9e\xaba\xcf\xce\xce\xf0?\x03\x84y\x96\x98P\xfb\xbf\xfe\xa1\x05\xdbP\x8f\xf6\xbf\xfa\xda3\xeajn\xcf\xbf\x8d\xc20\x9d\xacg\xed\xbf\xae\x1c\xa3\x92\x83\x02\xd8?\xad!\xf1Ja\xa9\xe5\xbf\x9c\xf8\xef\xc2_\xc0\xf2?\'\xceC\xb2\x87\xf8\xce\xbf\xd5\xc5\xf2\xc0W\xf7\xf7?\x99\xddS\x1d\x83\xb9\xf7?\xa5P^\t\x1f\xcf\xed?^\xdf\xa4\x1c\xb1\xd1\xf9?\\\x05\x19\xf4\x07\xa0\xe8?K\xcf\xb2k\xf8\x87\xdd\xbf\x9bFZ\xe9\xb4\xfe\xf5?\x10\x9a]\x89%\xf4\xe1?\xde\x05.\xb1p\xf9\xf1\xbf\x85z\x91\x85O\xcc\xd5\xbf!\xc1f\x82\xaa\x87\xfb\xbf\x0c\xa1+\x1e\x00\x0e\x05\xc0h\xe0\x17Q\xa8\xa0\xfb\xbf\x86\x1e%\x81\x81\x91\xe5?d\x8e\xde\xfb\xdc\x99\xf6\xbf\xa4\x08\xfaX\x8a\xe0\x91?\xa5\xf6\xb7\xd3\xc6S\xf4\xbf\x03\xdbe?Db\xe8?\x0cW\xf4(\xe8(\xcf\xbf0\x9a-B\xad\x01\xdb\xbf>\xd3I\xd4\xaf\xd5\xef\xbf\xddE\xf1\xd9/4\xef\xbf\xdd\x9bIIy\xa3\xab\xbf\xc6\xcd\xecK\xdbs\xcf?\xf1\x16\x84{\x91\x99\xe1\xbf\xb7\xf4vr;\x98\xff?C\xee\xd2x\xccL\xa9\xbf^\xff\x06\xbb\xdd\xb2\xd6?j\xe2&\x8e\xeb%\xdb\xbf\x82\xe9J\xba\x9b\t\xdd\xbf\x89\x0b\xec\xcd:G\x08@SS6\xdd/\xc8\x10@\x8f\xa1m\xaa\x90\xb6\r@\x10kbJ8m\xf5?\x936\xa6\x02\x07\xd9\xe3?\xa0\x1f\x9b\xee\x91\xfa\xdc?lH\\\x17\xcd\x08\xf0\xbf^\x84\xe4H0\xfa\xdc\xbf\xa0b\x19\xdd\x88G\x02\xc0\x18(\xe3\xb5\xdd\x18\x0f\xc05@\xbe\xfax\xd4\xe1?\x87\\C\xfa\xb1\xfa\xd4\xbfx;\xde\xf4\x17\xd8\xed\xbf\x87n\x8bF-_\xb7?\xc0\x9a\x1d\x94\x9fL\xc2\xbf\x82\x81o\xb3\x90\xdd\xfd\xbf2\xc0\xcdol\x8d\xf3?\xf2\xee\x1a9^\x01\xe4?\xb9q+\x0cg\x85\xe7?\xe8\x1d\xdb\x0c\xbf\xfd\x0c\xc0\x96\x89\x15\x14\xe7\x95\n\xc0s\xcc\xb5\x1e[\xd5\xe3\xbf\xc2E\x9c\x904\x91\xc0?\xce^d\x10\xe9\xc4\xfc\xbf\xb5z\x10d\xf7\x10\xf4\xbf\xb0\xdb\xef\xdc\xcei\xf2?n\x91\xb6\xbb\xf0\xd2\xed\xbf\x8e\xb1m\xb3t\xb2\xe5?6\xd3\xdd\xb5\xefu\x04@\xb3,w\xcd\x98P\x05@n<\xbbR\x06\xc9\x11@{5\xc2\xe6\xef\xf6\xf5?\x9bp\xb0~F\xec\xec\xbf\x1d\x07\xbbR\xa3g\xbb?\x03C\xc2\xc1\x82\xb8\xd4\xbfD5H=\x06e\xf1\xbfx\xf7\x85\xa3\xc6\xc6\xed\xbf\x17>wuB\x94\xb9\xbf\x90h\xaa\x95\xa8\xb7\xe9\xbf6\xb4\x92W\x07*\xc3\xbf\x1f\xd1\xb0|`A\x03@Y\x85\xa6\xd4\x12\xa1\xd4?N\x9a\xa1\xf5\x00h\x10@\x87\x93d\xda\x00\xf4\x13@W\x90_U^\x8e\x0b@\xae(\xb6\x1f\xa0\xf5\r@\x8d\xb4\x95\xe4\x00\x8a\x05@%\xbfyI<\x8a\x06@\xad\xe6U\xa5\x14\xa0\xfa\xbf\xa6\x18NL&0\x04\xc07\xe9\x16/\x08\xf7\x04\xc0\x81\xd5\xc4K\xc7\x1b\xee?s\x05\xbd\xddR\xd3\xee\xbf\x19\x1c?\x0e/\xed\xf6\xbf\x11\x8a\x8c\x16\xa3\xa5\x01@\xcdK\xdd_\x87\xf8\xef\xbf4\xc36\x85\xbc\x0f\xec\xbf\x80e\xddq\x95\xea\x08@L\x18\xad\xfc\xa8\xf6\x11@\xf7\x17.\xf2\xbd\xa7\x03@\xed\x9c\xa9\x90\x89\xef\xbe?\x90\x08\x12&k\xff\xde\xbfO\x91qU\x1b\xb1\xe0\xbfc:o\xb1$\xa5\xf6\xbf\xa2i\x17S,\xc5\xf1\xbfD\xe9\xba\xd1]\xb2\x05@(\xaa}i\xd7\xe1\x0e@;x\x1e\x9c\xcd\xcc\x15@\xb9\xe1\x16\xe9\x9e\xf7\x1a@\xbf49-\xdd\xca\x1f@\x8a\xf1kV\x9c\xc2\r@QQ\xe0\xc6"\x1d\xfd?\xe0\xea\xcf\xe8\xd4S\x03@[\r\xc4\xfb`\xd6\xf6?{\xd7\x0e*\x84\x1d\xfd?\xe5\xddO\xd5\xb2`\xf8?h\xa4\x97rM\xe5\xd1?\xb4\xec\xfe\xd35\xd4\xfa?\xae\x93\xc1\x9b\x06\xf7\xfc\xbfE\xcf\x99k\xabDJ\xbf\x1b\xa0|\xf69@\xc8\xbf\x97\x8b\xff\xda\xf1l\x08\xc0I\x84\x087\x915\xfa\xbf\x1d,n8\nZ\xec\xbf\xde\x16+\xf4\xc3\xc1\x08\xc0J\x1c\xa09\x01\x1b\x07@\xee\xf0\x89-w\x06\x15@\x0b\\\xef!\xf6\x0b\x03@<&\x0e9\xbe\xea\xdb?\xa8F\xecl2\xa9\xe0?\x1fVU\xc3\xaf\xfe\xd3\xbf\xbd-\'\xaa\xdf\xa8\xd7?\xe0\xa5\x0c\xc2Ih\xd0\xbf\xaft\x90\x05td\x17@\xd4r\xff\x84y\xdc\x17@\x10D\xf8\xb0X\xa6\x15@\xee]\xab\x12\n|\x12@\xe3\xa6t\xea\x1b\xaa\xee?\xe9\xad\x01\x1eH\xd3\xf9?\x8e\xdaF\xd4\xdf\xef\xf7?9\xc4\t\xbb\xf01\xd2?D\xa1\xf6\t\xcb\xc1\xf6\xbf\x92{\x171\x84t\xf4?\x0cI\x9e\xf8\xe6`\xe6?\x03\x11\xf57\x8c=\xfb?9n\xf2s\xa9\x86\xf1\xbf\x80O!]\x90F\xef?\xe5\x1c\xc7{\xbf\x0b\xc9\xbfq\x91\xd7_\xaf;\x05@\x9fL\xb3F^b\xe7\xbfl\x99\xabfP\x1b\xf6?\x07\xe2`j\xf9\x19\x0c\xc0x\x0eE1\x0b&\r\xc0\x87W\xad\xd6"\xd2\x00\xc0\x93Ii\xfd\xcac\xf7?\x19\xd8\x0e\x84@\xbd\xfe?\x88\xef\xdb\x7f\xb7\xa2\xd5\xbf\xee\xe6\xa6\x1b\xfdO\xe6?\xd2/\xf3\xab2\x8f\xe9\xbf\xdfR\xd6\xcdn\xa3\xf5?\x010\xdcXSk\xb0?\x0b\xcf\xf48"q\x0f@\x89\xb3\xacg>c\x06@1\xaa\x819\x1f"\xe2\xbf\xc5$\xa2\xc6)\xc1\xb2\xbfq\xcc8\x7f\n0\xf6\xbf\x89\xcd{\xb1\xe1<\xac\xbfs\x10\x94l]\xd3\xd3?%\r\'\xdd\xda\x0e\xd7?\xcc\xd8\x80iSR\xf9?n\xa9\'\xf04\xeb\xe4?\xb3(\x95\xd0l\xff\xc8?\'$\xd0_\xddu\xfc?t\x03l&\xddk\xeb?\x1aa\x8f\x01\xc9\x01\xe6?_{@\xf9s\xde\xe4?\xfa\r\xcf\x07\xb8\x15\xfa?[\xb9b\x85\x06q\xf0?rz%}I%\xf0\xbf\xd2^\x95(1\xcb\xe6\xbf+1lT\xdea\x0b\xc0$\xb1;I\xb80\x10\xc0\x1a\x8e\xf7J[\xbc\xf2?rW\xd6\x04\xc40\xeb?Vzo\xd0\x17Q\xf6?\xbb\xc6\xe6\xbc\xf3\x96\xeb?\x9b\x88Z\xff\xb6w\xc0?\x13\x8c\x1cM8\x15\xe0?\x158\xf0\xfc\xc1C\xf9?\xfd\xb3F\xd0\x9f\xb1\xf0?\x8d\xd6Ph\xfco\x05\xc0J\x0b\xf6\x9b\xc5s\xe8\xbf\x86\x15JV#>\x04\xc0#\xa1%\xd3\x00o\xa1? \xd6\xe6\x89\xe6\xab\xe6\xbf,7\x94\x151\x12\xe4\xbf@\xf8x\xae\xe0F\xf8\xbf\x031\xce\xe5\xe7\n\xef?w\xb0\xe1\xbc\xb7B\xf8?Y\x0b\x96\x87\x1a%\xe6\xbf\tK~\xef\xed\xdc\xfd??\xb1t:\x05K\xf2?\xdak\xe6x\xcb\xae\xda?\x93\x01\x000\xd4y\xc5?51\xd8\xc0~\x9b\xcc\xbf\xb8\x18\x80(\x97\xba\xe5\xbf\xa2u\x89J\xdb\xed\xe1\xbfb\xb3\x1b\x8b\x9as\xd8\xbfs\xaby\xbd\xa0}\x01\xc0:\xe4(q\xea|\xcf?\x96FI\x91\xc0P\xe7?;H\xb6\x15\xcd)\xf0\xbf\xa1\xc7ei\x86\xda\xf9\xbf\xd0a>W\xa2W\xf4\xbf\x86=\x7fb>?\xe5\xbf\xc2@B9\x03A\xee\xbfwP<[f\xc3\xee\xbf\xf5\x10x\x06\x9f\xd8\xf8\xbf\x0b\x15\xfa\x9e\xfe\xaa\n\xc0\xdc\xa4\'\x1ev\xa5\x0b\xc0G\x17g\xaf\x07"\xea\xbf\xd6\x12!`\x9f\x1f\xe9?\x83\xa7P\x9b\x00\xb2\xb5\xbf\x11\x8a\xac\x82\x92\x83\xea?C\xc8\x03\xb7jx\xe2?\x8b\xe1t&\xf7\x1b\xf6?\xd3J\x01\x15\xb3x\xe8\xbf\x03u\x0eC\xd5\x8a\x04@&}G\'\xc4l\xc6\xbfS\xad\xc5\xee\t_\xf4?&NoP\xe2\xb0\xed\xbf\xa6\xb1cw\xc3\xa0\xc6?(.\xcf\x15On\xba?\xf2\x0c\x04\x98\x99\x93\xe6\xbf=\x93\xbbt\x1d\xd6\xfb\xbfZ\xc0sw\x05\xa7\x03\xc0\xd3\x14\x15YJ\x07\xfe\xbf\xb4\xa3\xda1`\x14\xc2?\xd7[\xa6\x8f\xb2\xca\xbd?lM\x7f\xf2\xa6\x19\xe5?McA\xa8\xe0\xeb\xe4?\xd9\xf1J\xe4\x11\\\xdf?P\x82\xe7\x8d\x8b\x7f\xd3?=\x8aR\xf5\xd5\xe3\xee\xbf\xb9\x03$\xb9\xc41\x00@*\xcf\xc0o\xbd\x96\xfa\xbf\xbc\xa8G\xd6\xd7\xb7\x01\xc0\x18\xe8\xe3F\x14\xc9\xd9?\xcfN\x97k\xf5\x7f\x00\xc0G\x1c\xfc\xc7(\xa4\xb0\xbf\x06\x1a\x06\x85C\xf1\x04\xc0\xac6\xc2\x9d\x8bG\xff\xbf\x1dL\x10\xb6H_\xd7\xbf\x84f\xf1P\xe6\xfc\xc6?\xdfu~\x98\x14\x11\xd0?\xed\xbe\xefPV1\xcd?\xf7\xffa\x17\xa36\xf8?\xcc\xc8\xa2\xe4\x11\xdb\xe2?\xac\x0b\x1b\xe8S\x8e\xa4?\x82 /\xd8\x10X\xc2\xbf\x11Z\xab\xb4^\x10\xfe\xbf\x93\xce\x18\xce\x91r\x03\xc0\xc8D|\x85\x93\xe1\xec?:\xaex=\xa1<\x00\xc0\xce\x07\x94\x16DS\xf9?\x95\x92\xe6\x07\x92p\x01@f\xf2\x97\x8a\xe8!\xee?`\xec\\\x8d\x0c9\xef\xbf\xb5\x02\xe9c,D\xd1?\x02\xf4h\x82,\xe4\xd4?\x02\x05~\xa5)\x14\xf4\xbf\x10<\xb1\x8c\t\xef\x00\xc04k\x9d7vt\xe5?\x98%\x01\t9\xd8\xfb?\x0fL\xe7\xfb"\x9e\xf2?\x96\xc0\xe4\xad=\xcd\xf8?D\xed\x86\xab\xff\xa5\xe5\xbfJ\xcb1U\xd7\x9a\x05\xc0\xf4\x81\xd9_^n\x08@F\x86\x1b\xe2\xc5\xed\xe9\xbf\xbc`\xbd\x95\x94\x18\xf0?\xcb\xd0\xbb\x81\x05\x87\xf2?\x0b\xb4~\xb1\xc1\x0f\xf8?Y#\xe0\xd4n\xdf\xc2?\x01\xc5Z\xb1M\x08\x04@\x01\xe2P\x14-\xd0\xeb?\x1fH$>,\xa0\xd5\xbfSyM-8\xa4\xf9\xbf\xa4x\xd8\xcf\xc8;\xcc?\xb5\xb51]Kn\xe1\xbfi\x8e\x8dI\xae\r\xf4\xbf|\xeb\xb8Ny%\xfd\xbf\xc2\x14\x92\xd0|\x12\xfb?5|\xbf\x95X\xb5\xec?\x07\xb8i\xc6\x94\xb4\xf0\xbfBI\xcc\xfc\x85?\xe5?\xb2\x9bXs\xbd\xe8\xb0?\x90i\xc3qn\xfc\xe0\xbf\xb3\x95\x03\xde\x1c\x0b\xc4?\xeb\xeb\x9d?\xda\xb3\xd8\xbfM\x18\xb9M\xfc\xfa\xf8\xbf\xb8\xa5\xe9\xc9\x86\xd2\xd0\xbf:\xa3\x129\xf5\x8f\xf8\xbf\x03\x80W\xba\x83\n\xf8?\x06\x99\xca1\xa8\x9a\xd2\xbf\xfa\xbf\xdf\x1d.\x10\xf1\xbf\n!A\x1a\x01\xa1\xdd\xbf\x89G\xe4\xf6\x0c3\xe9\xbfb\x03\x94\x15\x08\x93\xfa?\xbd\xd6O\x18\xe3\xec\xd4\xbf\xd0{k\x10\xc1\xb6\xe1\xbfQ\xd1\xd1\xd5\x9a\xb5\x06@E\xe0\x8aF\xd7E\x07\xc0\xa7\x8d\xb7.\xb2\xd3\xf6\xbf\x1fKTy\xd9\x99\xfd\xbfD\xf0N\x12\xbfA\xf4\xbfv\xff\x13 c\x0c\xfe\xbf\xa1r\x0b\x8e\xa7T\xe0?\x87\xc6]\x12\x93A\x07\xc0\xebS\x08\x97O\xe7\xf1\xbf9\x8bD\xea\xd9\xe4\xe2\xbfv0t\xa0J\xcb\xe6?\r\xa5"k\'\xe6\xf0\xbf\x07\x8d\x99\xc5C\xa8\xc9?1\xec~\xb6\x7f\x9d\xac\xbfp\xde\xe2\xc5\xce0\xd6?\x02Y\xd3#yQ\x88?\x05\xb9\xde\xb8e\x8b\xe5?))\x81i\xce\xc4\x05\xc0:\xd0\xadx\xe9\x1b\xd9\xbf\xeb\xf3e\x05\x7f\xc1\xe7\xbf\xd5i\x00\xa0\x1b\xfc\xda\xbf\x17\x070t;0\xc1?9U/\x18\x1c\xe4\xe8?XlF@\xf5\x1bD?\xf8\x96\xddM\xdb\x98\xdd?\xad\xb5\xa4\rp\xab\xf7\xbf\xd5=\x9d\x9aVX\xf2\xbfo\xcb\xfaG\xe8\'\xec\xbf\x96\xb8\x84\x8fo:\xf4\xbf\xe0\xba\xae\x07c\xb1\xfa\xbfxG\xcb\xb4Q_\xd5\xbf\xd2\x94c\xa0\xc3\xa2\x05\xc0\xab\xa3j\tN\x17\xf0\xbf,\xf2z\xaf9\x8d\x01\xc0D\xe4Ss\xdf\xe2\xfe\xbf\xda\xaf\xebM\x1b\x86\xe7\xbf\x99\xbd\xaf\xca\xf32\xde?\xd8 \xe3VPg\xf5\xbf\xb8\\\xdd\x8b\xf7_\xec\xbf\x19\xe0NF\xe6\x9c\xe1\xbf\xd8m\x0b(\xa1\xb1\xe1?\xa4#T2l\xf0\xf2\xbf\x1a\x91\xe3\x8e\xed5\xbf\xbf\xb3\x85\xa6\xec\xec\x9d\xc9?u\xa7?l^Y\xe2\xbfQ\x945\x16(H\xec\xbfT\xc9\x0er\x97"\x01\xc0\xfa\xa3\xe9\xb1\xf1\x88\xf9?\x06sd\x19\xae\xc8\xe0?\x93\xa8\xe6b}<\xd0\xbf\x8eF$XX\xb5\xf8?\xb8\xdf\xdf\xe1\xb5[\xf9\xbf\xa7\x0f\xe3\x8e\x87\xa0\x00\xc0\xa3\x9f\x10\xc1ax\xb8\xbf\\\x13\xb4{\xcfc\x04\xc0\xa0c{f\xce\xce\xd3?\x1fz\xa7\x14\xbeY\xf7\xbfa\xe8m\xef4c\xc0\xbfo\xbe\x9f\x83,\x8d\xba\xbf\xec\xe5\x87\xdbt\xd0\xe2?\x8d$L\x98\xe5B\xe7\xbf\x04C\t\x8e\xec\x1d\xd2\xbf\xb4&?3\xdd\xd8\xe9\xbf]\xeb\x89\x90O+\xf0\xbf\x92E\x98I\x15\xa6\xe7?\xc3FB\xc5\xce\xef\xf0\xbfV\xbeT\xb17\xb7\xe5\xbf\x91\xccF\xf8\x1a!\xc7?\xae\xc6TKDG\xe0\xbfZ\x00\xe8xF\xc3\xe2?\xe7\xa1m\x01\x82\xfe\xdc\xbf\x9b\xbcOn\xc0"\xe3?7\xceA\xd8\x815\xd0\xbfpt\x99\xdcG\xd3\x01\xc0|yZ\xa1\xf0\x84\xe9\xbf6%\xcdg\xb9\x9a\xa4\xbf\x19\xb9\x0bd\x92}\xec\xbf!\xf1\x98:\xb0\xa0\xf3\xbf\x93e\xbc[\xab!\xf9\xbf\xc2#\x0e6\x98S\xaf?\x92\xb7\x90\x07\xe3\x12\x07\xc04x\xe8\xb2o\xe9\xdd\xbff\x84\xcf\x1a\x1dn\xee\xbf\xdab*\xb4\xdac\xf1\xbf\x80\x92\xbb\xf3?\xc9\xe7?\x1d\xf5\x99\x00P?\xdc?2\\\xc8\xad\x1b\x86\xed?\xd1\x9a\x02\x14\x195\xc5?\x16>C\xb7F\x0f\xe9\xbf\xa3\xdb\t\x15\x87\x04\xd6\xbf[\xe7\xd4\xae\xfa\xdc\x00@\x13\xd1\xd4\xf2\xcc\x95\x05@"\x12\xc6\xebC\xda\xe6\xbf\xf7}\xb3\xe3\x15\x99\xd2?\x1d<\xdf]\x919\xe2\xbf\x10\xfeU]\x9c\xc3\xf1\xbf\xfb\x85\xc6q\x883\xe9\xbf8\xb2\xfb\xad6>\xea\xbft\xa5\xa7j\xa6<\x94\xbf\xdb~\x979B\xe9\xed?\xacg\x83\x91\x043\xa7?bN\x06\xf9n\xc1\xe6?\xbbu\x15\x93\x92\x1c\x00\xc0\xf3\xf0s\x94\xc4P\x81\xbf\xda\xcam\xa9K\xc5\xc1\xbf\xec\x9a\xcb\xc6\xd7E\xe0\xbf\xa3\'p\x0eDA\xe0?\x95\xe3\t\x1f\n\\\xce?\xfes\xfb\xe6\x99a\xf4?2^ZFw\x0c\xf0?\xd2\x17\xce\xe0\x9fsu?\x8b\x0e:\xd5=\x04\xc1?u\xf8\xd7\xeb\x7f\xdc\xd5\xbfM(\x9f\x82\x1f\x1d\x04\xc0\xef\xb3[6\xf5H\xb5\xbfK\xb8\x95k\x12\'\xf8?\x10|;\x1d\tM\x11@5.\xe3U\xc7\xb1\xe0\xbfy\x87\x91]\x0e\xb8\xf7?\x7f/\x97\t=\x97\x0b@v\x95E\xa9\x08O\xc7?\xf4\xc7N&\xfa~\xe8?E\x8e\xfb\x17\xab\xdb\xe3\xbf)\x9a\x967\x84\xe3\xeb\xbf\x81\xc2#p\x0b\x89\xdb?\x84\xado\xa9&\xd7\xf1\xbf\xb5l\xb7s\xca\x8d\xf6?\xe5dV\xa1]\xb8\xc6\xbf^\x96N\xdd\xb8\xb6\xd2?\x01\xfe<\x8e\r\xec\xe0\xbf\xcacd\xfd\xdd\x0e\xf5\xbf\xd4?,\x98\x13K\x04\xc0p\xa5\xb1\x8e\x90\xb2\xf5\xbf~\x90f\xcc\x05\xaa\xf0\xbf\xed\nz\xcc}\xf8\xe0\xbf=nu\xfb&x\x00\xc0Se\xcao\xa7\xd0\xc4?\ts`\x00\xf1\xc3\xf2\xbf\xb2\x95\xdd\x86\x01\x97\xc2\xbf\xb0\xd1@*\x0fp\xc7\xbf\x85\xf9\xd7\\\xb2\xa4\xf3?j\xcc\t\xed=\xb2\xf4\xbf\x88.\x8a\x97\xbc\xec\xae\xbf\x89\xbd\xda\xe3\x8f\xbd\xbd?\xdcy"\x0f\x10\x0b\xf8\xbf\xa7j\x94E\xf4\xc6\xee?\x15*\xf3\xc7\x9d\x9b\xff?\xa3\xaa1\xde\xf3!\x00@\xd8V\xea\xe6\x0c\x9f\xe4?P\x0bdA\xe7\x1e\x00@f\xb2e\x84k\xd6\xea\xbf\xc12\xaf\xd8,\xdc\xe6\xbf\x9dz\x13\xb7.\xa1\xf2?\xac\x1b\x01\x8d\xf1E\xdc\xbfNPG@`*\xb0\xbf{\xf9.\xc8ho\xf0\xbf%\xca\xb2z\xf0\xa6\xf4?\x16\xeb\x9f# (\xd9\xbf\xfb[\xff\xf0\x9e\xdf\xfd\xbf\xe0\r\xc0\xd0w\x07\x01\xc0\xdar\x1cV\xc5T\x00\xc0GQ\x93\xf9\xf1\x1c\xf9\xbf\xa8\xe5V D\xc6\xb8?\xb0\xf8\xac\x8a\x9b\'\xf3?;A\xfe\x94m\x1c\xf7\xbfM\x14YC\xc4\x0b\xf4\xbf\x0c\xa6$\xdc\xb6\xd6\xb6?\xb6N:R\x172\xea\xbf\xe5X\xe2W\xcc\'\xf5\xbf\x1b\xdf\xc2\x16\xc4J\xc4?&\x19D+0\xef\xe8\xbf\xd9\xeci("\xf2\xe4\xbf\x0e\xa0\xe3*\x96\xec\xff?7\x19\xd6\xc9R]\x0e@\xeb\xa7\xbbx\xfdp\xfd?\x8d9\x15O\xd07\xf6?\t\x97x\xa9y\x82\xf0?\xfbM\x083\x8e\x1f\xf1?\xb9\xc2\x96\xfaG\xbe\xee\xbf\x8b\x0e\x82TD\xda\xea\xbfa\x12\t\x99\xc1\xbf\x16\x9d>u\xef\xe5\xcb?\x94\xa0\t\xc6\xcf!\xc9?\xc0_\xd82\xa8R\xf2?\x10\x9a\x14\x90\x16\x82\xf7?\xab\x04\x08\xcd\xbd\xef\x03\xc0\xdf\x96e\xd7\x8e\x01\xc8?Bo\xb9\t\x85\x19\xd9\xbf\x15\xdc\xdf.\xb7\xf3\xc1\xbf\x9a\x9c\xfc\xe9\xe1Y\xf3\xbf\x0f1\x1c\xf6S\xaf\xf1\xbf\xbf\xed\xa1\x9e\xb0\xce\xe7?\x83@\x06\xc6\x0fv\x08\xc0wH9\xf3\xa1\x05\xf1\xbf\xc1\x05\xdc\t\xf1|\x00\xc0\xb4\x14Hy\xa8\xd5\xcb?\xad_\n>s\xf4\xf5\xbf\xdc\xe6\xc6\xa7vz\x01@l\xcb>\xf6\x94\xfa\xd0?|\x8d*\x8c\xc2\x8e\xe6\xbf\x19\xc5\xd7?\xbe.\xe2\xbf|2s\'0\x1c\xc3\xbf\x94\n|W\x8b-\xff\xbf\x1aD_t\x7f\xcf\xee?\x1e\xbf\x9c\x9dr\xc0\xf3?\xf3EW\xb9j.\xf2\xbfL\xd2\xb9Z=\xdf\xcc\xbfX\xf6\xee\xabqH\xf2?M\xb5G\xe4\xe1\xe7\xfb\xbf\x83*\r\xdc\\.\xc4\xbf\xa65\xa9h\xbf\x86\xf5\xbf\x04(\xc8x\xb3\xdb\xf6?\xb4\'*\xcc\x12\xa4\xe8\xbf\x95T\xbdl\xdeE\xe1\xbf/\xb06\x0f\x00\xe6\xe3?J&\r\x85\x97\xd6\xfb\xbf>\r\xcb\xacQ\x04\xdd?\xbfW0N\xaf\xc8\xe2\xbfS\xf2\xf1\xa8\x85\x1a\x04@_\xee\x1d\x12w\xf1\xe7?\xdc\xa9:\x10\x99\xd1\xe7\xbfp\xb4\x92\xafn\xeaY\xbf\x00\xa0\xbf\xddZQ\xe7?\xfe\xde\xfe\xc0I\x96\xbf\xbf"\xae\x0c\xef\xd4B\xef?l7H\xf8\x126\xd4\xbf\x12\xaa\xfa\xafh\x07\xd9\xbf\xc4\xben\xed\x1a-\xf6?\t#\xc6\xc9Fn\xab?\xed!\xf0^\xc4\x18\xe1\xbf \xe3]\xe2\x8bL\xe4\xbf\xfa\x18\x1d\xf8\xd8\xf3\xec?\x0f\xb4\xed\xb1\x88h\xd6?u\xa9\x91\x19\x86\x9e\xda\xbf\xc5)&\xd2<\xe4\xed?,B~\xc0\x05\r\xeb?*\x8bI\xde\xdfc\xe1\xbf\x88\xdc(\x80ES\xfe?/\x13R\xc6\xdf\xfa\xec\xbf\x8d\x01\x9e\xcb\xf8\xa4\xb4?-\x95\x83\xb7e\xc6\xd5?\x84;\xebk\x89N\xcd\xbf\xb1yG\x9bTE\x87\xbf\xe5\xf8<\xf3\xfas\xff?\xf7D\x96\x8b\xf2\xbc\xbf\xbf\xe6\x9f\x8b\xe82\xde\xe5\xbf\x98Mo}\x8aZ\xd1\xbf\xd4\xee\xc3\xbb:s\xc6\xbf}\xf0\x11\xea\xf4\xd6\xec\xbf#\xc5\xf0\x8e \x97\xd9?\x04\xfd\x19>\xa0K\xc2\xbfph\xc0\xbd\xae\xdc\xeb?\xe4o\x9d\x89\xeb\xab\xf2\xbflac\xe6\x06\x84\xc0\xbf\x1c\xb8T\x89\xfd\xed\xfa\xbfg\xc6|N\xa9\t\xd3?\xba\x90\x08\x1f\x9aF\xc1\xbf\xfaFX\x91d\xfe\xe6\xbf\x8b\xbf\x89\xeeH\r\xc4?\x1c\r\xa2\x17\x88l\xed\xbfR\x9dJ\xfc\xf9 \xe7?\x94\x83\xb2\xb3\xaf\x90\xd6\xbf\x8a,\xad\x8d\x10\xcb\xf0\xbfw\x16\xc3\x15\x1d\xdd\xef?,\xedA]\xd3\xd5\xf4?+?\x1c[\xf1\xcd\xf1\xbf\x87H\x14\x0b\x11=\xf4\xbf\x86$\xc4\x84\xac\xb9\xc8?s6\xa5u\xfe\xb8\xf2\xbf_3v\xc8Tp\xc0\xbfU\x85\xe4Yz%\xdf\xbf\xcep\x8aQf(\xe3?\xd2\x92\xf4mQ\xd7\xf2\xbf-!/\xf8<\xde\xd8?x%\x01\x19\xc0~\xed?\x1c\xcf\x84X\xd4\x8e\xf3\xbf}n\x0eq\xe9\xc4\xe3?\'9\x80,\x10*\xc7\xbf\xdd\x8ay\xca\xf1\xed\xdb\xbf\xb6\xfc\x84\x197S\xe4?\xa2\xe2\xff\x96z]\xe1?N\xba\xe0\xf7\xa4\xa4\xd2?O\x87\x03\xb8\xfdF\xdd\xbf\xbd\xf6_\xd2!\xe0\xf0\xbf\x8e\xbb\x8b\x01\xe2\x12\xf1\xbfs\x03\x10+\xfb1\xc1\xbf\nD\xc5\xf5\x11c\xb7?y\x85\xd4/:;\xdb\xbf\x1fYB\x10\xc7\xec\xd9?\x8b\xec\x84Jl\x13\xcb?\xbb\xe3U\x1e/\x94\xf2\xbf\xeb\xf8\xf12!\xd6\xf0\xbfT\xdc\x1c\xa3\xeb\x15\xc1\xbf\xbb\x94\xc99\xa4\x04\xce\xbf\x06\x98\x12\xd2\x08\x90\xd4\xbf\x06\xd3O\x9d\xda9\xe8?H/Y\xd2\xde\xeb\xd4\xbf\xe1\x83#\xd1\xf0\x93\xcf?\xf5\xe6\xdfU\xaf\xe2\xe6\xbf~\xbfK\x9ch8\xd2\xbfz\xc6)\xfa\x96\xe2\xd1\xbfmu\xb8\x8e\x86p\xec\xbfE\xd2X\xe1\'\x9e\xd8?\x8e\xb6\xda\x9c,\xe1\x9d\xbf.\xbc\x81?m\x90\xf9\xbf\xfe\x90\xa2\x9eH\xa4\xe3?L\xb6hJ\x05\x8a\xe7\xbf\x95\xa0\xa1\xe9&\x8d\xf7\xbfy\xd9\n\x07\xeba\xf4\xbf\x83\x85\x91\xc6\x08\xaf\xb5\xbf>\xd8\x96\x86\xf8\xd2\xe9\xbf\x93y\x10\xcc{9\xf2\xbf\xe5\x07E%\xc1\xcd\xec?S\x7f\x04\x8e\xd4\x1b\xd4\xbf\xeb?\x94\xa4\xffe\xea?b5\xde \xab&\xe6\xbf\x18J\x90\'\xb6\x87\xc9?\x99\x0c\xc7my*\xf4\xbf\xc0,\x7f\xabt\x0f\xcc\xbfQ\x1dj\x04\x97\x9f\xd8?\xb6\xa6)\xfc\xf5\xe5\xe5?\xc8\xd10u%\x9a\xc8\xbf\xe7g\xce\xaevI\xd1\xbf3\x9b\xef\x11l\x16\x97\xbf\xd3\xf9aT\xa0\x83\xe7?\x99(\x90v\x01e\xb6\xbf\xd3S\xa2\xcf\\O\xd1?"\xe1\x84\x13\x83l\xf6\xbf\x14\xa8\x11\xe8\x83\x0f\x00\xc0\xa1$y%\xc7$\xd3\xbf\x0fZE\x91s\xcb\xe7\xbfL\x1c\x18k2~\x0e\xc0O\xa2>h\xc9\x14\x0c\xc0\x12\xf0\x99\xc2\xf5\xe9\xcc\xbf\xaa\xb41\xd5\x05I\xf6\xbf\xfe\x1b\xa4J\xd0\xc8\x04\xc0i:D{\xc72\xf1\xbf\rMa\x8eta\xe4\xbf\x96\xa3v\x84U\xd3\xea?\x84=\xc3\xe7\xd3\x1c\xe5?)\xad\x02\n\xc0\x02\xf0\xbf\x9e\xe7\x0f\xf9~c\xf1\xbf\x08\xc8\xfa\x8c\xb7;\xfe\xbf\x8af6yQ\xcf\xf8\xbf$\xb8\xb5K\r@\xc2?f\xcb\x87\x92eO\xdd\xbf\x91_\xca\xb2\xae[\xe2?\x83\x8a\xf8a8\xb2\xcb?\x84\x8a\x11\xa6w\xb0\xec?\xed\x08\x08\x17r\xa6\xcf\xbfT\xe8\x92C\xf1\r\xe6?\xaf\xfa\x0e\xe1\xe5$\xf9?\x8bKS\xae8\x8c\xe3\xbfeL\x84\xe0\xa6$\xe4?@=V\xe4\xe2h`?\xda\xeb\xae\x0b\xf6D\xe8\xbf\x89-\xe7%\xc08\xcb?&Y4E~\x9f\xf1\xbfP-\xcb0\x96\xb6\xd8\xbfso:W\xadM\xc4?e\xfd\xe9\xbb/\xa4\xec\xbf\xaa^\x8f9\xb9\x80\xff?l\xcf8#\x06-\x05@\xafA\xc6\xacL\xd6\xf7?\xf5\xd8\xfa\x95\xf8^\xd9?\xb3?\xba\',\xf8\xfc?;\x94\xde<\x8b\x12\xb5?\xb9\xc7\xfa\xb1\x13@\x00\xc0\xa9\xbbC\xee\xdc\xcb\x00\xc0o=v7\xe3\x98\xf6\xbf\x1fW\xb7q\xd5\xb3\x03\xc0\x0b\xa7GI\x95\x97\xee\xbf\xc5\x9a\x17\xa6\x02\x85\xec\xbf\xa44j\x9b\x90\x10\xdb\xbf\xa1\xbc\xfb\xb7A<\xf4?}\xb0\xeef.\xa9\xc0?\x94)\xfc\x86\xb7\x91\xf2\xbf\x163g\xea\x9f\x1d\xe2\xbf\xba\xd2\x10\xa0\xcfo\xd5?\x7f\xf8\xec]Ad\xd4\xbf\xa4\xcf\xcdpf\xeb\xbf\xbf\x08\xaa\'\x93\x97\x88\xa2\xbfJiD\xa8\x96\x19\xfd?x\xb0\x81.am\xd6\xbf\xdc)\xe3\x0eM\xc7\xd1?\xacb\xddR\x98\xe6\x00@\xa5\x9d\xc0\xf4\x98\xd9\x05@T\xbd\xc3\x9f D\x01@\x8e`u\xdbH\xfb\xf8?\xe79\xa2\xef\x90O\xff?T*\x9c\xf8\xa9\xd0\xe3?\xd1_\xa7bJ\xef\n@\x04\x97\xee]\x14\x9b\xfb?\x16K%\xcfV1\xdf\xbf\x0b\xaa\x19\x17\x17\x00\xd8\xbf\x02\xf8d$\xbb.\xfa?\x82\x12[\x96p\x04\xe6?\xfbh\xc3\xaf\x88\'\xcf\xbf\x95\xd2Wsj\x80\x06\xc0O\xe4x?\xbb\xe7\x05\xc0X%2\x8eYY\t\xc0\xb1\xb2\x7fU\x90G\x02\xc0\x13C\x16\xd41\xb1\xfb?\xca\xe9(\x1cx|\xeb?_\xea\xd4}\x9d\x0c\x88?\xde\xb8\xeci\xc5\xfb\xc4?m\x17O\xd6\xc5V\xea?q\xa3\x7fN~7\xc6\xbfq\xdc__\xe2\x9b\xc1\xbf\xbbo\xbf\xd3\x92g\x03@\xc6M\xf9\xcb\x15k\x12@\xda&;jw\x0b\x0c@\xbc\xe2{<\x86\x0e\x04@\rX\xec\xe6\x14i\x9e?\x86}\x18\rb\x1e\xf2?{\xdb\x0ej\xfbn\x03@\xbd4\x13G~\\\xf7?\xa4j\xc6\x88\xd7P\xdc?\xd8\x04\xcdx\xb3n\xf0?\x9bz\x86P\xb2\x17\xe9?n\xad\xee\xdfh\xa0\xf4?L\xfc\x87\x95\x08!\xfa?B!n\x83\x8cY\xf1\xbf\x9f!A\x92\x8d=\xed?\xa1B\x81\x8c?\x15\xca\xbf\xa3\xf6f\t\xcc\xad\xd8\xbf\x1d\x1d\x97\xee\xa05\xaf\xbf\x8e\x893\xe1?\x07i\xa5\xb2:p\x00@\xb9z\x9cw\x9fw\xfc?c\x1cvrr\x90\xfc?Oz\xebW\xdaj\xff\xbf+?\x9a\x92\xc9\xe8\x00@\x83\xe9\xb7D\x89\xb2\xf4\xbf\xa6\x91\x89\x80\xf7t\xc1?Ox\xd1\x1ea\x01\xef?L\xb2\x1d\x02\xe31\xe9\xbf\xb0\x88\x12\xa7\xdc\xaf\xf7\xbfR\xc39\xa2+\xae\xf2\xbf?]\xb0\xc7\xc0\xc0\x02\xc0\xbe\x91\xb8K\xc3w\xb1\xbf\xb1\xd6n\xd7}\x82\xf6\xbf\xcb\x18UC\xdf\x92\xd7\xbf:\x08\xfbM\xaa\xb4\xd1?\x18=t\xe5\xb0m\xe2?\x01%^\xe7q\xb1\xf9?\xf7\x18j\xe8\xd67\x06@O\xbe.$Sf\xf9?\x02\x1b\xdf\xa7\x1c\xd4\xeb?!\x8a@9|(\xf0\xbf\x99\x89\xb1\x14\xd8#\xe5\xbf\xb3\x1e\xb1\x97\xcc`\xb4?\xd0\xdc\x99\xbe\xed\xb8\xd0\xbfj\xab\xb7S_*\x0c@[\x86r]0\xf6\x00@=\xda]\xf4\xcd\x97\xe6?\xee_\xbd\xe1E]\xc9?\xa8p\x8b~\xe1=\xf7?N7\x100\\v\xb6?(\xfb\xa3`\xe7*\xf3\xbf\xe5|\x10\xeb\x1e\x08\xe7?\xd1\xf7C\xaa\xd5q\xe7?\x1aq\xb1H\xb8C\xe2\xbf-\xc27k\xe9d\xfb\xbf\x7f&\xfc7\x1cX\xe5?\x0e NO\xf0\xe5\x10\xc0\xdd\xdb\xf4\xee\x90\x9b\x18\xc0\xce\xe9\xa6\x8b\xf4\x07\xfc\xbf\x8b\xad\xe5\xc5\xc2\x8e\xc2\xbf\xb6\xeaa@\xc4S\xf2?\x86yA\x13(P\xda\xbf\xf3\xa9\x97\x84\xc3\x13\xff?a\x98\xa7>\xad\x92\xf3?\xaf\xcc\x1ce\xaf^\xc7?]\r\x9c\x83!~\n@\x10:c\x08\xeaW\xf4?z"\xf74\x8f\xc6\xe2?T\xff"\xc4\xadp\xf0?\xff\xd7\x8e\xb0\x1e\x18\xfa\xbf\xa6\xc1,EE\x9d\xdc\xbf\xe2xn\xa9\xfdU\x05\xc0\ng-\x19\xbd\xc0\xeb\xbf\x95\x89y\xc54\x10\x0b@\x94\x0f\x90~,c\x02@\xd8\xa30\xae!9\xf9?\xfd\xebf\xbf\xe0\xea\xf0?\xc8>\x16A,o\xe5\xbfC\ts?\x82d\x02@\x100\xdf+\x8a\xdb\xd4\xbf\xf7\x9a\xce\xec\x86H\xf3?\xbb\x81\xbd5U\xb0\xea?\xf1&\xc0C\x8d\x11\x00@\xca\xdb\xa3\xfc\x07\xc3\xe6?\xdd\xb9\xceo:h\x12\xc0\xc2*\xea;\xa2\xca#\xc0\xb4\xe7\x1aq\x9b\xc7\x04\xc0!,\xaa\xe4\xa9;\xf2\xbf\xb6\x0cW\x92\x1d\xe3\xc0\xbf(\xc9\xd6\x00]\x01\xdc?@r\x93\xb8\xbfA\xd0?,s\x8f0\x84\x96\xe3\xbf\xc5\xdfD\xf2\x90\xa4\xff?\x1a\xc0\xb2/q\xb1\x1d@\r\xdb\xdax\xcb\xc9\x0b@:\xfb\x92\xa7A\xae\xb0?\x83\x94\'V\x93C\xeb?U\x95g|\r7\xcc?\x92\x15\xe0\x98\x03\xf7\xe9\xbfK\xe7B\x00\x8b\x12\xdc\xbf\xd2\xf9\xca//Y\x06\xc0\x9f\xc3\xfe\x11\xa9\x13\xb7\xbf\x0c\xf0\x9b\x85\xee\xaf\xe1?\xde$O\x08\x03\xe8\x11@g\xec\xec-lU\x11@8\xb2\xf0\x8e\xa8>\xbf\xbf\xe6\xd0\x10<\xa4\x8f\x02@\xb9\x92K\x81\xae\xe7\xf5?\x91m^\x8e\x8c\x9a\xf3\xbf\xa0|\xf6\xee\xdc|\xe7?\x07\x02O\x98d\xbf\x00\xc0M\xc1F\xa3\xd2\x00\x06@\x1f\x9a\xc8\x890\xba\x05\xc0\x13\n ~\x136"\xc0g\xfd\xbc\x9b\xa3\xa5\x07\xc0\xbd\xbb9`\xe4\xe6\xc2?\xff\x9a\x0e\x93\x9ac\xf3?\xf6P)\xf9O\xd8\x8c?\x85\x19xL\x88\x83\xcc?\x87>\x94*\xac\x92\xc9?\x86\xca\xbc*2>\xf7?X\n\xe7\x18\x95I\x0c@AB\x82\x9fi\xc4\xf8\xbfX\x9e\x80\xf4\xbfx\x18\xb1\xbe\xef\x10\xe6?R\x86\xffW\xf0\xd8\xe8\xbf\xde\x83aT\xb9\xa2\xe4\xbfUl\xa8\xc8\xd5\xd9\xe9?:\x18n\xf8\xea\xfd\xf1?\xb2\xa1\tP\xf83\xfb\xbf4\xaa/\\\x92/\x14\xc05\x86O\x98M\xec\r\xc0\xf9\x12\xc6\x1eYe\xdd\xbf\x90K\xfd\xe7Y\xed\xe5\xbf\x94=\xdf\xe6\x10\xfe\xe4\xbf-i\x0b\xfe\xe1\xa4\xec\xbf\xc8\xb1\xe38\xad\x1d\x10\xc05\x8cZ30\xd2\x11\xc0\x18\x19\x95\xc3\xff\xdd\x06@\xf1\xac\xa4/9S\xe9?\xbe0\xdfA\xbad\x00@j\x9e\x1f\x8f\xcb\xe5\xd6\xbf\xbc7Y\xe3\xa8\xe1\xe8?\x07\xd4r<\xaa\xf3\xc3?>W\xf2Z\x85\xc3\xd7\xbf"?\x87\x0c\xea\xc5\xec\xbf\xf7\x91\xcc]\xdc\x0e\x0c\xc0W\xd3\xbdl\x9a\x97\x0b\xc0\xdczo\xe5\xec\xd1\xf4\xbf\x16\x96,\xb7\xb40\xf6?\x99|\xb0\xfdl\x01\xd5\xbf\x9e\x0c(\x1aQF\xcb?\xfb\x93\x15\x07\xb9G\xb9?\x10\xcb!\xc8\xf6\xe0\xdc?\xb5\xd3\xff0\xc7v\xe2\xbfw\x7fP\xd4?K\xf1?\x15\rQ\xc1)\xbf\xe6?mS\xed\xf4\'\xa4\x16\xc0\x9f\xddLg\x8b@\x13\xc0\x7f#JR7\x1a\x0f\xc0.\x93}\x9e6N\xca\xbf\xc7:\xba]\xab\\\xf7\xbf\xa6X\xf2\xee:\x92\xdf\xbf\xaddw\xbd\xfaa\x04\xc0\xa3\xa9k\xb5B\xe0\x06\xc0u\xfd\x85\xfa\x8d\x17\xe9\xbfUD\xf1d\xc2=\x02@\xe1\xc8I\xb5\xa0r\xf2?\x18Iuq\x07\x97\xf4?\xc3H\x943c5\xf8?\x96\x03H\xf1\xece\xe7?\xb9YD\xb4\x92\xa4\xd4?\x05=\xd3W\x96\x96\xf2?ME\x1a\n8?\xf2\xbf\xf6\x91[6k\x8b\x0c\xc0\x13\x0c\xfc~U\x04\x0e\xc0\x88\x04W\xc4At\xcc\xbf\xbc(c=\x87\x0c\t@\xf3\t\xba\x80@\xe5\xf7?q\x0e\xee\x8cw\xb2\xea?\xc8\xb5\xd2Wc\xf7\xf0\xbf\xaaj\xc2t\xb9o\xe3?\xa1\x94\xde\x82\xdd\xac\xe6?\xf51/\xe7d-\xfb?\x1c\xa6_\x01=\xb9\xcd?\x1b[|g\xaa\x82\x11\xc0[\xf5\x88\xba\xee\xb1\x13\xc0\xfb\xc5\xac{\xb2x\xe5\xbf\xa4\xe3\x17\x02\xc7\xc5\x08\xc0\xb8V\xa0j\x90\xd8\xf6\xbfb\xe8q\xafA&\x05\xc0c%\x8e\xc1\'\x1a\x08\xc0hI\n\xca\xbd\xf3\xd2?\x0f-P\x08\xa9\x17\xe1\xbf\xcc\xf9\xc4E\x8eE\x03@\x97\x91\xa1\xbc\x9f\x04\xf1\xbf\x9eH\xee,\xcfK\xfb?\xe1$}\xda\xf6\xd9\xe3\xbfOu\xba\x94\x13n\x01@\x8d\xb9WFO.\xdd?p\xd5yY\x95|\xf8\xbf-\xcfm\x85\xc6\xf6\xf1?\x84\xfah\x1a|9\xff\xbf\xc8\x97\xae\xa0N$\t\xc0\x99\xae\x92\x1aW\xce\xe7\xbf\xf3\xc1\x81\xfc*\xb3\xff?\x00\x9b\x81\xf8\xde\xf1\x06@\xd3\xc0Q\x93\xa0\xb1\xe0?~\x07V\xec|\xb3\xd0?P\x9d\xf3*,\xdf\xa9?\x02\xdf\xb2_\xf6\x8b\xe9?G\xed\x92\x80e\x19\n@2\xe5Ie\xa3\xca\x04@\xdd\xe0\xfd\x9b\x04\x15\xfe?\xbez\t\xba\xbe\x93\xe6\xbf\x07Q\xd6\xba\xf1\n\x08\xc0\xed#u>\x19\x82\xd2\xbfo\x9f!mmd\xe9\xbfqy\xc0C\xf4\x8f\xfc\xbf\x98\xb2\x1d\x84>\xf2\xbb\xbf\xee\xa3\x04\x07\x0c\xea\xf8\xbf\xe7\xae>\x92u\x0e\x05@\xe8\xc4\xd8\x89-\xd0\xe1?\xdb\x0cz\x8e\x95\x1a\xf4?,\x84j\xef>\xd0\x11@5\xe1\x91\xd1\x95\x10\x80?%:\xe8\xc0\xc1\x13\xc9\xbf\x80\x1c\xbd$\xe3\xd2\xe4?\xf1\r\x1ac6_\xed\xbf\xe2\x81\xce\x1c/)\xf2\xbf\x12$vs\x1c\x80\xde\xbf\x0fp\x87\xbf;+\xff\xbfd\x16\x8e\xf8\xce9\xc7\xbf\x182in\xc8\xba\x06@}\x85\x80\x16TM\x04@\x94u+@\xe5Z\xf2?\x96\xfc\xa0\x98s\xfc\xfc\xbf#\x8a\xb7\xdb\x01\x05\xe3?w\xba\xec:\xbc(\xe1?\xa4\xb5\xb9\xb0\xcc\x16\xf5?LK\x93\xa6\x95\xa3\x01@%\x8bq\xa7Nq\t@\xd1E\x9by\xa5\x16\x03@\xf7`\xd4\x14\x9b\xea\xe8\xbf\xd2\xc2\x080\xddK\t\xc0x\xf8^\x83\xf3i\xf0?F\xecr\xc0\xce\xa4\xe4?\x0f\xcd1\x80\xbcv\x02\xc0z\x92\xad\x0b\x12\xab\xc1?&\x99\x16\xf6\xe7\xdf\xed?\x1d\x13;\xce\x9e%\x05@I\xdb\x07\x8d\xde!\xf4\xbf3\x0e\x84\xfe\'\x85\x02@\x02\x103Xwb\xc6\xbf\x99\xee\x11m\x10\xd9\xf7?SV\x872\x8f\xfa\xe7\xbf\xc4\xee\xc0\x8fb8\xfa?.B\xe6kW\x9b\xe0?[\x14\x0f\xc2\\\xed\xca?0`\xd8:\xbew\xe7?\x13Fi\xe0\xf1A\xf4?,\x0c\xb0Nd\x88\x11@JP\x14\x92\x15)\x04@\xe7\x91\\\x07\x0c\xec\xda?\xe9\x85\xe4\xbf\xe2\xda\x8b?ex\x83[\xbf\xb3\xd2?zv<\xf0\xbc\x12\xf1?\xe1\x8f4\'\x91\xb2\xfe?WIJX\xd1\x06\xee?\'\x19\x80\xe81\xb2\xe1?\xbb\xb1\xfe\xd62B\xd8\xbf\x15gz\x0b)\x07\xfa?8\xce\x86<\xc5\x87\xc9\xbf\xdaBz\xc7\xdc\xac\x01\xc0\xd8\x98\xad\xddv\xf5\x10\xc03\xa4\tT\xe9\xab\x0c\xc0(O\x91\xc1)\x0e\xec?\xd5\xea\x94\xf4\xf1\x9a\xfc?\xbfT\xceOVK\xe0\xbf\xebl\x8e\xf1$\x98\xcf\xbf[\xd5r\x15V\xa0\xc4\xbfm\xf2\xc5\x11\x8e^\xd6\xbf(\xde.\x96\xb0+\xe3\xbfS\x91\x1e\t\xb7\xa3\xea?\xcf\xe4Z\xcd)\x10\x04\xc0Gi\x19AT;\xe8\xbf\x81\xdeX\x1e\xf9C\xed\xbf\x9cA\x10\x05\xb6\xf4\xd5?91\x9c\xbfP\x19\xd2\xbf\xf9\x933\xcb\x038\x10@\xbd#\xdc\xbfl\xd8\xf8?R\x82GU\x06\xf7\xbd\xbf\xcdp?I\x9cY\xc3?\xee\x99o\x8d\xa6\xe1\xdc\xbf\xf0&\xed\xdd~q\xaf?\xfd\xc2\xa7Q\xdbN\xfd?\x1e\x81>\xb5f\xb9\xf6?C\xa2\xc7\xfb\xf3\xd9\xf2?\xc5q\xce\x9b\x85\t\x00@\x84\xaen*H3\xe2\xbf\x16zG\xc8\x974\xd2\xbf]\x95\xc9\x90\xb5\xe9\xf5\xbf\xd1\xfdR\xbeW*\xb1\xbf\xd5o9\x0e\xae\xf5\xfb\xbf\xa7\xe0\x85\xaeS\xbf\x12\xc0\xdf\xc3d\x9a\x90P\xa5?\x0fu5V\xc3K\x06@\x1e=S\xfc\xf4\x81\xd2?\xa0J\xa2\xf9\xe7\xcb\xc5\xbf\x00\xe3\x02e8\xb4\xf1\xbf\x1a\x053\xc3\xb7\xfe\xe3?#\x1d\xaf\x19\xc3\xfa\xd2?\xe5B\x81&;\xf0\xc3?kJI\xb0\x85\xf5\x00@\xee\xe0~\xac\xc2\xe7\xf6?\xe4hM\x15<\x01\x12@qN\x8a..:\xfd?t:\xb3\x95\xffP\x08@\xeaQ;\x1c\x14\x19\x07@g\\*\xaa\xeb\xb6\xfe?\x00\xe4L\xb7\x10K\xbb\xbf\x8d\xfb\xb1\xb6M\xbd\xf0?|\xae\x9b\xf5\xe1\xf5\xac\xbfU\x03\x95\xa4\x05\xef\xd8?C\xec\x98{\xa3\xcf\xee?Wp\xc1\r\xad@\xe1\xbf?"\xecV\xc3\xfc\r\xc0\x16\x84\x01\xfb\xa0?\xeb?\x86Kw\xcb2\xfc\xfe\xbf]\xa6n\n\x0e\xc2\xf0\xbfug\xfa\xe2\x05\x1f\x07\xc03{\xeeI\x07\t\xf5\xbfm\xe4\xb7\xc5\x05\x16\xe8\xbfK^hI\xfb\xc9\xe0\xbfpmq\x06\x90+\x97?\xbf\xa4\xfdr{\xb5\x00@\xf9+\x17 S)\xe8\xbf\xef~\xb5\x07\xedu\x04@=\xaa\xff4\xb3\x83\xf9?\xa8\x17\xcd\x0f\xca\xa0\xe5?\xebp\xd5\xa5"\x1d\xeb?\xcfku\xb6\xa2\x95\xbb?\xed\xfa*\x89\xc3\xa9\xd4?\x96\x95E&\xbd\x17\xf9?\xbc\xd0\x00\xfc\'\x07\xf3\xbf\x8amP\xa7\xf1\x1c\x0b@9\xc5\xafJ\xe6l\xf2?\xf25*\xb0N\xe6\xc7?\xbc\xbb\x1b\x82/i\xff?RP\xd7\xa1\x13h\xf5?W\xdbg@W^\xbe?\xfed\xd7\x90\x9c\x96\xec\xbfY(fY\xea<\x12@\xf6v\x1fa\x9c\xd0\xff\xbff\xf0\xf7]\x0f\x0f\xf0?\xde\x7fzJ\xa8P\x0b@H\xc1\x02\x90#,\xd6?Ybr)\xa78\x04@3{\x02\xd4h\xbd\xe1?\\2\x94\n\xb0v\xe0?\x15R\x10\x83hC\x07\xc0\x9d%\x01S3\x0c\xf6\xbf\xa4i\xf4\x0e\xdd\xca\xec\xbf\xba\xec\x17\x90<\xe0\xe4\xbf\x90\x90&\xea\xb8\xc7\xf5?\x87\xee\xa0\x8d\x97\xd8\xf7\xbfPO\x92\x1bt\xf9\xf2?\xed8\xa9\xe1_\x0e\xfb?D_\xf5 \x85y\xff?}\xcc\xd7\xdaw\xf5\xdb\xbfc\xebK\x82m\xdf\xb7?8a\x81a\xa2C\xf0\xbf\xeaOP6\xbb\x86\x04@\xaf\xf2\x00\t\x93\x85\x00@^\x99\xf0\xdau@\xdd?\xe8\xe1\xd3\xa9\xd4T\xee\xbf7\xcf\xadx\xff\x1b\xe8\xbf\x97\xd7\xc6D>\x1f\xce\xbfps;\x86Q\x9c\xef\xbf\xed\xce\xdc\x04\xc0\x08\x9df@\xd7_\xe1\xbf\x92\x1c\'c\xb0"\xf2?\x8dH\nN*]\xeb\xbf\xf6\xf7\x030\xed\xff\x96?\xfcR\x95okD\xed?5\x8a\xea\xfd\xb8\xbe\xca\xbf\x92\x1b%c\x0b\xb4\xe3\xbf\x80\xb6M\x18\x8a\xc7\x9c?k\x19u\xf2qny\xbfR+\x83\xdfJ\xde\xe2\xbf%U\x9cR\x02\x1a\xff?r\x11\xe9\xf9%\xe6\xcc?\xaalD\x0f\xa9\xc3\xe7?0\xfb\xbe\xfc#m\xc0?\xc0\xa3\x1c\xe5\x82D\x00\xc0\x01\xbe\xf6^\xa5|\xf9\xbf\xabN\xa7\xe1\x17\xfa\xc3?\xaaO\xc2\x8bF\xf5\xf2\xbfAY\xff2\x11\x80\xfc\xbf\x1b\xf0Ds\x7f\xe2\xe3\xbf:n\xb2[[\x91\xfe\xbf\x94\x7fy\xabz6\x04\xc0v\xa9\xbf!wQ\xe8\xbf\xc4vm\'\x8bc\xf3\xbf\x90\xa4\x89\xeaPv\xfa?$\x84\xaa\x10\xd1\x8e\xee?4o.\x14\x06r\xf4?G\x92y\xd1!\xd8\xf3\xbf\xd0\xa5\x15\xe5\xc3\x1b\xc3\xbfel1I\xbc\x1a\xe0\xbf\xc7,\xc7|\xa5\xf9\xe1?fQ?D\xb8c\xf5\xbf\xff-\xd6a\xad\xd6\xef?/V\x88K\xedk\xd4?\x02\xd0\xee\x9a\r\x95\xd9\xbf\xbe>}\xa7*\n\xec?\x8e\xdf\x87x`\x0e\xe4?\xd2\xfb\x82\xdae\xae\xea\xbf\xe5\x11d\xb3\x1f\xa3\xc7\xbf\xe8\xccxL\xb3\xd8\xe8\xbf\xec\xf6\'\xce]\x04\xff?N\x84\xd55\x9a@\x06@S\xf8\x8eB\x08\x81\xdc?\x96D\x92e\x04W\xf0\xbf\xdf1\xeb|\x05\xac\xcf\xbfR\xd0\x04)m`\xc8\xbf\xaf\x05\xca\xebT\xa8\xb6\xbf\xb8x\x1c\xbf\xd7i\xd2\xbf\xaf\x96\xe8\x12\xb5\xbc\xb9?0\xf0\x9f\xf4\x94W\xd7\xbf\xfe\xf6\x8d;\x87\x9a\n\xc0\x8e\x96\xdd\x0c\xc5\xc7\xff?E\x08\xe1\x98&\x8f\xc2?\xafcn\x92\xa5\x14\xbd?\n\xdc\x8bg\x0c\xb8\xe7?\x8ap9E@\x87\xda?\x11\xd0\xe4q\xe0!\xf9\xaa\xb4\xbfE\x92\xa7\x12\xe0\xf2\xa9?=\xa1\xea\x82\xed0\xf0?C\xa5\xba\x8e2,\xec\xbf\xe6\xf2\xb2\xa3#\x0e\xdf?\xccR\xb7JJ\x01\xea?\xcd\xa1\xb6G\\b\xe7?\x12\x0f\xf0\xa4\xf7J\xf7\xbf\xb82zFPz\xc1\xbf\x00n\xf9\xa6\x15i\xeb\xbf\xe8\xa2\x16\xa7Y#\xd7\xbf\x08\xd5]\xa4\r\x16\xd8\xbflh\x8d\xcf\xfdV\x8d?\xe9\x8d+\xd2\xd8\x08\xe6?\xe1\xf3./RN\xd7\xbfT\xf2,\x1a\xa9\xe5\xde?\x1e\\\xc8\x00\xb6B\xd0?^\xc5<&\x1c\xad\xe0\xbf\xfb\xf7F\xf9\x8d$\xc4\xbf+ \xc9\xd9\xec\x17\xc0?%\xfaU5\x0c\x94\xa8?\x80\x8c\x96\xb9]F\xee\xbf\xf2X\x89\xa4F\x10\xf2?E\x05L[\x99K\xe0?\xda\xf7P\x12<\xb9\xf1?\x9f\xf0\xcc3}\x7f\xe9?\x19U\xb0\xb5\x9a\x97\xd6?\xd6xb\x02X\x1d\x9d?\xcb\x11.\xed\x0c\xab\xf3?\x93\xe3\xaa\xe9Wq\xca\xbf~)uD\xae\xb0\xd3?\xd39\x96\xe1;\xcc\xd7\xbf)1\x93\xb4\xbba\xf0?\xae\xb0C\xb9n\x15\xe0?\x900\x98\xd9\x88\x8f\xe5?\x9b\xe3r\xdeQp\xb3\xbf\xff\xbe\xe3H\x96\xeb\xe2?\x1c\x90\xe3\xc0n\xed\xe8\xbf@\nI\xe4,\xec\xd1\xbf\x17\x9d\xd5p\x1d\xe6\xfb?\xcb\xe8\xf9rU\xfc\xba\xbfE\xed\xd2~\xc2\x1f\xb2\xbf\xf8_\xde6\xe1\r\xf8?\x08\xb3\xc5k(\x0e\xd6\xbfr\x83\x93Xl#\xde?\xe4o\xde\x06&\x08\xd0?\xac\x08\x82\x11\xba\xbd\xd0\xbf5\xcfA"\x13y\xf7?\xb4P\xc0f\xf2\x1b\xf4\xbf\xb66\x9c \x05\xfa\xd0?i\xa2\xb2\xf9\x1d\xee\xee\xbfV>\xec\xd8#\xb9\xd0\xbfn\xca\'{\x94\xcd?\x0b3\x96J\x16\xc2\xfe?\x02\xb5\xd2\xb5_\xe1\xe0?\x97G\xf2\xc9\xfe\xa2\xe8?#\xf1|\x8dX\xc0\xf7?A\xeb[\xbd?\x9a\x06@WqQ\xc7\xda\xc0\xf5? Rh\x11\x12/\xf8?k\xa0\xb3G:\x1a\xf7?#P\xba\xa3\xef<\x05@\t\xfb\x14SEW\xf7?\xfaY\x08\x1a:\x1d\xf6?\xe3\x84\x9b\xf4\x1e_\xf0?`\x87MRB6\xea?W\xa3RZ\x90z\xe3\xbf\xcb3\xf5;\xa9\x90\xe6\xbf\x08\x85\xb0\x97\xce\x9e\xf7?)\x1f\x9f\xbdS\xa3\xe8?[e\x9a\x9b+j\xdd?\x99\xd9\xae\xe0\xd0\xcf\xe0\xbf\x90\x07\xcbNOG\xed?\xc9j\xb2?\xbcT\xd1?\xdb;\x0bD\x8a\xd1\xe2?\xdb\xb24\xf0U\xc7\xc3\xbf\xf3&\xd8b\xca:\xdd?w\xdcBF\xcc\x0b\xdb\xbflw\x99&\xa34\xd2\xbf\xeec\x12\xd14\xae\xd6?\xa3K\xab\xad\x7f\xf0\xe3\xbf6\xc8W\xc1\xe3\xa0\xf2?$]\x17FU\xbf\xfb?\x11\xf1\x06\xe2\x84\xb9\xe0?\x14\x9bB\xcf\x94,\x02@\x12?E\xf5\xf2\xfe\xe7?\x14$\xbb\xae}\xd2\t@\\\x0f\xe3\xcc\xb6\xa1\t@\xee&fO\xfe\x84\xfb\xbf\xd9\xafg\\\x0c[\xe6\xbfM\xc2t\x9d\xf1\xab\xf6?\x8b\xff\xf6\xed\xa8\x17\xfe\xbf9t\x07\x91\xe6\xd2\xf3\xbf\xad(\xe5\xbd\xba\xce\xe2?@\xbc.P\xa5\x03\xde\xbf\x9d\x02\x0e7\xaa\xb0\xdd\xbf\x18T\xb6\x8dI?\xe0?%\x89zX\xa5K\xf6\xbfQTt\x97\xe7@\xc9\xbfs\xd1*x^<\x9c\xbf\xa6\x1a\xb2\x87\xbb\xed\xbb?\xc9\xa8a\xe2\\3\xb1\xbf\x85 \x11\x85\x88.\xf0\xbf9\xe3\xfd\x83\x15\x91\xe2\xbfxj\xa8\xa3\xfb\xa3\xe7\xbf\t_E\xfaDh\xeb\xbfol\xc9*\x96O\xdd\xbf?\xb3\xe2\x10\x83O\xdd\xbf\x9b\xcb6\xf2T\x11\xaf\xbfq\x02`H\xe5\xa2\xdd?\xff\x0e\x9b\xcf\x93\xc9\xf1?8\xcb\xd7\xc6/\x7f\xf0?t}d\x97\xdb.\xe2\xbf\x14\xc8\xa6\xdf\xde\xa3\xf4\xbf\x1e\xc4>\xe2\xf0\xe0\xc0\xbfXL\x05{\xb7\xf8\xeb?+\x89D\x93\xd5\xeb\xec\xbfQ\xben\x97\x1ad\xef?\x16I\xccRAB\xea\xbf\xbb\x9cL\'q\x82\xc9\xbf\\\xc2\x0b\xa8\xd5K\xe9?\x01\x8a\x9a{\x05\x88\xd3?\x90\xaf\xe5Rc.\xb5\xbf<\xa9>\xef\xc6\xb9\xa7?\xff8m\x01\xaf\x96\x00@\xa8\xc3\xe6_%Z\xf7?\x99P\xb3X\xd4\xca\x06\xc0\xe9]Nk\xd1\xd2\xe8\xbf\xe1\xef\x18\xcc;\xb6\xc9?\xfb\xcc?h~A\xbf?\xf4V\x14\xfe{\xbe\xe6?\xd9\xd3a\x83:\xcb\xd6\xbf\xff\xdb\x11d\xa6[\xe6\xbfp\x00\xee\xf2c \xea\xbf\xb0\xd9\xba\xd8\xcfy\xfe\xbf@y1%Q\xbb\xfa\xbf\x90\xe5\x99\x82\x9c\x18\x94?\xd3\x06\xe5\xa2\x85\xf3\xea?\x08s!\x1a\xab\x8d\xf3\xbf\xcd\xf2\xdb\x9cR>\xf6?\xb3F\xd1O\xabD\xe3?|\x01i\xe9j\xa7\xe7?:9M/\xfe\xd6~\xbf\xd0{\xa2\x1b]`\xf3?O\x83\xf0T(\x12\xdb?g^Q\x063\xd7\xf1\xbf\x8fC\xfeZ\x88\x8a\xdd\xbf\xb4\r\xf66\x9b0\x00@\t\x1c\n\xe7\xa6\xae\xfc\xbfx\xff:\xc3VB\xec\xbf\x83\x9e\xa3\x1c\xd8\xd9\xe3?\xa7\x86n\x8f\xa4\xea\x05\xc0\x94\x02=\x07*\xe6\xf7\xbf\x7f\xdbm\xca\x7f|\x02\xc0\x9a\x85\x1e\x1f\x0c\x9ch\xa8\xf5\xbf\x92\x0b\x01vLz\xea\xbf#\xef\x92\tF\x9d\xb4\xbf\xd9\xd8g\x01.\x92\xea\xbfx_\x9fhK\x86\xe6?\xfbYrm\xfa\xc9\xb7?\t\x81\x08E\x9ac\xa4\xbf\xf2yL\xb4\x89\xdd\xfd\xbf=]<6\xd9\xef\xe5?E^\xde^n\x80\xf7\xbf\xa8\xe7|\xc1\x8fB\xf2?\xe7\xb0\x8f?\xa9\n\xd9\xbf\x8c\xacGI\xc3\xdf\xe6?\xc0\xbc\x08De\x89\xf5\xbf\xdeB&\xd3%]\xe2\xbf\xcd3\xf2,\x9ds\xf4?\x9f\xaeU\xfe\xf0X\xd8\xbf\x19\x96\xb9j\xb7^\xe9\xbf-\xe0\xc7\x8f\xc0J\xfd?\xd9\x05L7,\xe9\xee\xbf\xb8i\xc6\xd5Ab\x86\xbf\xad\xc9\xf2q"V\xed?\\h\xfb\xcf\xa3\xf2\xfb\xbfVLk \x9cF\xb2\xbf\x93\x01\xfe8.\x94\xe0?\xc7F1\xa7,$\xc1\xbfs\xe8@\x06\xba\x0e\n\xc0\x97\xf7\xd5\xb7k<\x17\xc0j\x9cO}"\xb0\x00\xc0\xac\xae\xc8\xb5\xce\xa2\xdc\xbf\xcdz\x076\xa3\x83\x94\xbf\x05\xc7\xcbe\xa9\xe3\xe3?\xa0Q2\xa2\xb50\xe6\xbfw.\x98y\x1d\x03\x02@}Y_e\x86K\xdd?\xf4\xc3\xa61$^\xe8?\x02s\xce/\x1bl\xf0\xbf\x13\x8bz\xce\xa9\xe0\xf7\xbf\n%o\xed,\n\x04@\xe7\xc7UiU\xca\xa1?\xf2\xef\xaf\xcf\x18Y\x00@\xd0{LH14\xe7\xbfG\x04\x8f\xf1?\xaf\xb6\t\x82_r\xb1\xbf\xa5V=\xe3\x82p\xf3\xbf\xebO;\x9e\xd2\xa1\xde\xbf<\x89\xf2\xa6\xf8\xa1\x14\xc0\xba\xdc\xdb\xcdJ\x1a\x15\xc0v%\x1dK\x14\xa7\xf6\xbf\x98\xd1\xac\xeb\x1b\xb4\xf7\xbf2\xb5\xc3\x14\xcd\xc7\x17?\x91\x9bZ\n>k\xc3\xbf\xd1\x90(\x05u\xc3\xe8?\xec\xe0=B]A\xe7?y\xfa\x8bp\x12\x1d\xef\xbfk\xcbv\x15[k\xf2\xbfJ\xb5\xed\x8a\xc0\xc4\xd6\xbf\x1b\xe1E\xca\x02\xf6\xee\xbf\xbe\xd8\xb0\x04\xdb\xfe\x05\xc0a,\xe2^\xe1>\xd5\xbf\xfbq\xa1\xf1H\xc7\xdb\xbf\x9e\x1c\x1fY\x81\xc7\x05\xc0\xfb\x04\xda\xa7-9\xf1\xbf~\xda\xd2F\x968\x14\xc02\x1b\x18\xdd\xd3\xa9\x19\xc0e\xb6\xc6\xd3\x1b\xed\x10\xc0\xb6\x02.\xe0\x96u\xd5\xbf\xb3i\xe5\x18\xaf\xa2\xfa\xbf\x95m8\xa84\x03\xe5\xbf\xa7o\xeeT\xbcK\x01@\xa3fz;m\xb3\xe6?\x06\x07\xbdeh\x0c\x04@\xb6\xcfy\xc5\xa8\xef\n@\xea\x82p:\xdb\xd8\xdd?\x88\x10\x95\xee\xcf<\xd7?`\xec\x99\x11\x16\x13\x00\xc0]\x93\xf4\x84\x1a/\xcd\xbfV\xd5q\xbb\xa4P\xfe?\xfd\xc8 \xc8\x89:\xd0?;\x92\xf1\xc3\t.\xdf?|\xd0\x01\x1a\xf1Q\xd1\xbf\xbf^f9\xb6e\xb7?\xb4q\xfdyRC\xf5\xbfQ\x16\x8fK\xc2\x93\xc1?\xf4\x00\x00\xf1\xa0\x93\xda\xbf#\x95\xb2\x13n\xfc\xe7\xbfi\xeb\xc5\xa3\xea\xf6\xf1?\x11\x07\xcb@\xfd\x8d\xe7\xbf\xe6\x8cR\xb9PM\xfb\xbfY\x9c`\x98\xdfN\xfc\xbf\xb1\x18g\xc2\xd9\n\x08\xc0\xf8\xf3y\x15\xefb\xf3\xbf\xd2\x90\'\xcfR\x8d\x15\xc0\xfdE\x8b^pB\x0b\xc0\xfd\xc8\xa8\x15\t\n\x06\xc0\x8f\xf5|v\xb3>\xdf\xbf\x9b\x1f\xbf\x89C\xd8\xfd\xbf\x0c\x0bL:\xf2\x041?\xe1\xad\xdf\xc4C\xc6\xf0\xbfd\x017\xae\xf8\xc4\xcf?\x91h\x04Zw\x99\xff?s\x0e\'\'\xb9\x8f\r@g\x87\x88 \x93n\x08@@\xdfIm\x86\xc4\xd1\xbfk\x15\xc3\x08\x04\xb3\xfd?\xcd\x94\xc0\x99\x12)\xeb?\xa5\xe2\xb4Me\xbd\xee\xbf\xf8\x08\x04\xba\x06\xb3\xf5\xbf\xdcq\x9d\x8c|g\xf2\xbf9\x06\xb1Ia\xc4\xbb\xbfD]\xe7 ]\xc0\xe0\xbf\x0c\xa2Z\xe6\xd6T\xc3?\xfd,\xd5\xf7\xfc"\xf6\xbf\xd6x\xdd\x8c^l\xed\xbfN`\x0f\x03z\xc9\x03\xc0J"\xae\xa9c\x02\xde?#\xaa\xbcc\xc5\xc3\xd0\xbf\xd4u\x9eV9x\xf0\xbfY\xcb\x9a\xac\x8c\x0b\x12\xc0\xc4\xd9\xea\x1b7o\x0e\xc0.\x8d\xfd\x9clE\xea\xbf?*\x8f\xcd\x86\xf2\x13\xc0R\x9c2\xf8\x9a\xf7\x06\xc0A\xe6\x1e\xaf\xa0\xd3\xfe\xbf\x89OP\xb5\x0fb\x06\xc0=\xf9\x8bBy\xa9\x00\xc0>?9\xa8\x1a\xe7\x06\xc0\xfa\xf7\xe0\xa8\x8e\xe1\t@\xc7\x02zH\xe2u\xb2\xbf\\\xd1+\x0cS\x1f\x08@4\xce\xb4D\xf6s\x13@\xad\x18\x8e\x15eM\x05@\xf5\xa3>w4\x97\xf7?\xf3I\xb6\x96?\x1f\xe2?\xdc#6_\xbc\xfb\xbb?h6\xc7\x8d\xd8\xec\xbf\xbf\x8f\xf4\xc4\xd2\xb4\xe7\xf7?\xfc\xaaq\xc8h\x84\xef?;O,\xa0\xf6;\x02@2\xb1 \xf6\xfe[\xf9?\xa0WC\x06\xdf\xf7\n@\xe6\x10\x11rv\xaa\xfe?j7;Q\xe6\xf2\xf6\xbf]\x80:8\x80\xbf\xeb?G\x1c\xdf8]\xa0\xd3\xbf\xac\x02l\xd6"\x83\xdd\xbfj\xd5@\x97\x8c\x7f\x00\xc0\xad_\xf4y\xd7\xd9\xec\xbf\xaa\x03D\xdb\'h\xe6\xbfo\x0eu\x9e\x96\xe9\x08\xc0\xef\xb4V\x041\x9f\xf9\xbf\x95!\xf5\xf8\xa7g\x07\xc0Z{\xc3kj3\xf1?:\x11\x812d\x9e\xea\xbfa\xdcM\xd2\xfd\xcf\xf6?\xf1\xc1\x92\x87\xb7\xfb\xd4\xbf\xfd\xfajZ\xb8N\xc3?R\x19U\x0fT\x01\xf0?\x19\xa1\xa2\x0f\x07\xde\x03@B\x05D\x9a\x1e\x1f\x04@\x08o\x94(c\x94\xf1?\xe0\xf3\xf8pP\x1e\xd6?r\xcb"\xab\xder\xdb\xbf\xd5M\x00<\xe7\x89\xec\xbf\x04\xbd7\x86\xbc\x96\xef\xbf\xbe\xa7|\xab%\x9f\xd2?\x8bJ\xf2`\xcf\xea\x03@\xc9C\x075]{\x0b@d\xb8,\xabP\xb3\x14@A\xdc7\x8bn\xc9\x13@\x92h\x92?K\x1a\x07@}@\xd13$\xd7\xe1?\x85\xc8\xf0us&\xeb\xbf\x0f\tO\xf7\xaa1\xff\xbf\xf5.q\xdd+\xa6\x04\xc0=N\xd2\xdf\xf6\xbb\xf9\xbf\xf0e\x12,\xdb\xe1\xf8\xbf\x95w\xc5\xb1z\xeb\xf6\xbf_\x9a\x95g\x06\xba\x02\xc0\xdd\x93\x1bD\x86\xba\xe8?\xd6\n\xb0M#\xd9\xf6\xbf\x8f\xfc\x1c\x9b\xcd\xef\xf3?\xd36\xc4\r\x10c\xbc\xbfrAw\x1a\xe0\xd0\xbc?6\x96\xb3\x8d\xadg\xfa\xbf\xf0\x1b\xb9\x8f\xe4\x07\xbe\xbf\xcb\xa4\xc9}\x9f\xa2\x0b@S\xc3:@:\xee\x06@\xc1\n\xb0\xce1I\xeb?\x85!t\xbfb\xb2\xf0?\x03\x8d\x8f\x8c\xdc\xac\xe4?\x8bM\x9fW\xbao\xc8\xbf0vv\xcc\x05$\xc2\xbfe\xe1w\x10SQ\xf7?\xa5\xae\x08\x94ij\x00@\xad-\x17\xc1=A\x00@\xa7,f\xc1T\x19\x03@)\'n\x9dI\xe1\x0c@\x00\xba<&\xaa\xc8\x14@\xef\xc5Vv\xd1v\x14@\x89\xc8\x12\x01wT\xca?\x92S\x97\x17:\\\x0b\xc0\xbc\x1ffn\xeb\xb4\xf8\xbftu\xb9=\xc9\xef\t\xc0\xee\x18\xea\x93\xb6\x05\x05\xc0\x98\xfbb\xa6\xfcn\xe4\xbf\x92\x84\x06\xfc)\xbd\xc7?d6\xddb0\xd8\xf3?b0?O}y\xd5?\xd5\\\x07C\x9f\xf7\xf8?\x84\r\x98\xcf\x8e+\xff\xbf\x11\xd8z\xcc\x12\xc0\xf1?q>\x1cmk?\xaf?-\x8d\xfe\xd3\x8a\xdc\xd0?#lIH\x12 \x12@\xfa\xeb`\xdd\x062\x1a@\x8e\x014\x9f\xa2R\x04@\\\xa5\xb2\x1c\xb7a\x02@\x835\xb9G\xfa\x12\xd9\xbf\xf6`\xc2Ch\x84\xb5?\xde=\x0e\xea\x89\xab\xfa?)\r\xd3\xaej\x08\xd8\xbf\xe6\x19\xf5\n\xabI\xcc\xbf\x12y}\x975Z\xf7\xbf\xd3`M$>%\xe4?\xf3\x17\x7f\x06*\xb8\xf6?\xba$A\xf7\xa9\xb2\x0b@\x1f;\xe7\x08\xfa\xe9\x17@\xdb\xa2\x9b\xee\xb0\xf9\x1b@7r,\'LL\x0c@5\xbf}\x9e;\x95\x04@\xdc\xff\xdd\xc1\'\x98\xbb\xbf\xfc"p<\xf3\xb7\xd8?%\xd6\xf3O\x9bK\x00@\x9b\x02r\xed**\xf7?vn\x90\x05\x89\x16\xd5\xbf\xacM\xadi{\x87\xe3?&\xbdc\x127}\xf1?0\xdb\x18bW\xf1\xf3\xbfi\x97c\xa3\xdd\x15\xdf\xbfs\x0b\xe5\xc0\x8e\xba\xcb\xbf\xd7\xbc`\x990\x8e\xf2\xbfV\x93\xb8\x7f\\\xbd\x15@$\x89\x07\xe7\xf9-\x14@J\xf7\xe5\xe83v\xf4?\xb6\xc7\x0f.\xe7\xb7\xf4?7R~\xb3g\xe4\xb5?\x05d\xd3\x1c6\xcf\xea\xbfd\x98\x04\xb6\x8a\xdc\xe3?\xff\xfdw\xdf\xf1\xc2\xf5\xbfk\xa9\x04\xf7\xc4!\xf4?(r\xf2\x16\x90Q\xf6?E\xd6/\xd3\x17&\xfd\xbfFc\x13\x1e\x9d[\xf6?\x02V(6\xb1R\x07\xc0u\xca\x10\xa5\x05,\xc2?\x15:\x8c\n\x00\xe3\x1e@\xf5\xb4\xb8\xa2\x0b\x88\x10@\xbd\xe7H\x8eRl\x0e@\xac\x18L\x0f^(\x05@`g\x7f(\xeeu\xe1\xbff\x15\xf0\xc5\x94\x8c\xe3\xbf\xc1\xdc\x0bcw\xc9\xea?\xfd\x15\xb7\x07\x04\xf2\xd9?\xc0\xfbk\xd2\xb6\x8d\xd8?\xf5\xbd\x9c\t_|\xe2\xbf\r\xb0loQ\xbb\xe0?\xc1\x10\xf4\x15\xbb\x0e\xd7\xbf\xfbe1g\x8d\xe1\xca?V\x1b\xccr\xee+\xdb?\x1b\xcd\xd5\xeb\xab[\r@\xda\x8aWZ\xb5(\x00@I\x04\x06\xef\xc9\x86\xed\xbf \x106\xaa\xba\x06\xca\xbf\xf0k\x0c\x10\xfc]\xd9\xbf0t{\xd9\xe3\xe2\xee\xbf\x07\xc0j\x87\x9c\x00\xd2\xbf_\xdcd\xba\xd9\x9c\xe0\xbf\x8b}9\xe3\xfa\x9f\xc9?\x89;6\xf3e\xc1\xf8\xbf\xd2\x92\x91\xfe\x9f\xdd\x00\xc0(Yj\xe1\xbb8\xf0?y\xc37/:N\x80?\x91P\xa5_\xa0\xf6\xd9?6Q+\xceO\xa8\xfb\xbfsu\x07\xc8\xbez\x03@\xfbir\xca;\xa7\x0f@\x1a\x1c\xcd\x97\t\xdf\xe3?\xf4\x94\x87\x8fW|\x02@\x00\xe9\xe3\x15-\x85\x01\xc0Q\x1f\xbc\xc0\x1ad\xf9?\xe0\x85\xc3x-\x87\xed\xbf\xe7\xe9\x8a\xc28\x84\xe9\xbf\xfe_\xfe\xbf\xb0\xc6\x02\xc0&\x99-\xe9\xc3\x81\xf2?\x01\x97\xb6\xbdM\x91\xe2?\'Y\x100\xd6K\x05@\xcf\x11A?\x1eS\xd2?X\xa0\xe0\x9d?P\xf8?\x03\xc4E\xb9\xae\xf7\xe2?\xf0+LPP\x95\xe6\xbf\x14\xabd/Ha\xee?\xcc\xb2&)D\x14\xf2\xbf>\x8ap\xc4\x03\xc2\xe4\xbfNlW~:\xa7\xde?\xf05\x11I\x072\xf1?\xeb\xe5\xa4\xe6\x8a\xcd\x90?\x81A\x8e!\xac\x1e\xfa?9\xaa\xc6=jD\xde\xbf\x03F\xa1\x1d$\xc1\xfa?\xfc\xfbx\xe4~p\xe0\xbf\xa6Q\xb6U\x8d\xc3\xe1\xbfZ\x98|\xaca\xa4\x96?H6\xb11\xe9\xba\xf3?\xdb\x944z\xa8\xd0\xf7?\xfb\xf1\x05h\xca\x07\t@\xaa\x1d\x1f\x7f\xc99\xe5\xbf\xe8h\xb2`\x8d\xa4\xe9?G\xce\xcc\x89\xbc\x19\x03@5\x13\xa6\xd185\xe5\xbfv\xc6\xe2\xda\x95\xd6\xc7\xbf\x86L\xe1\xec\xfa_\xda?2\xbf\x9b\x1f1\xcb\xd9?\xfey\x02ZQ\xe9\xe7?(\x13\x04\xb7\xe3\xe2\xd6?\xb8&\x91\xd6$t\xee?M\x14?Gg\x96\x03@>\xb4\x8by]R\xcb\xbf\x0ck\x16\xb7j\xd4\xee\xbf\xde\x9e\xdf\xf0&\xa5\xe6\xbfW\x05G&\xc4\x8f\xe6?\x02B\x88\xf0\xe2G\xc0?i0mE\xc1B\xef?\xf6\xfb\xcf\xdb6\xdc\xdb?i\xd5\xd2\xb1\xb2D\xe8\xbf\xf3x\xa4\xbd\xb0\x82\xe8?\x8d\xc5\x05[\x0c@\xf3\xbf\x0b7\x0f\xcb\xa4-\xe0?c\xfc\xda\x84=:\xf8\xbf6\x0c\x18G\xf0x\x06@\x8dZU\x16_\n\xb9\xbf\xd7\x91\xd6\x1a2\\\xe9?\x05\xce\x9bhT\xc4\x02@/\xfc\xe9\x81\xc4\xc9\xd5\xbf\x1d\xdb\xb4L\x92\x0e\xed\xbf\xce\'\x9e\xad\xea\xa7\xff\xbf\xb7E\xc1\xcd\xa6\xb2\xd2\xbf\xce&6\xd5\x1a1\x90?\xec(\xcb\xdfK\xb0\xa9\xbf0>+e\x8e\x8a\xf8?\xd9\xaa\xb6e\x8d\xba\xe2?\x88\x9a\xf8}\x02\xf4\xea\xbf\x9f\x96\xdb\x8e%\xf5\xf2?\x03M\xeb\xd8\xd2_\xfe?\x03\x0b.\xe0J\xcc\xff?\xf7\xbe\x82@BX\xec?\xae^\x0f\xf58\x93\xe2?\x12-\xa3R\xcc|\xea\xbfi;j\xe6\xf3\x98\xef\xbf7\xfcq\x93\x91\x99\xd7?\xdc\xee\x18\xf7\xc5\xa5\xf5?\xf1\x9b\'\x08\xf8\xb4\xe7\xbf\x8e"k\x93\xeb9\xf6\xbfU\x9e=?\xf9G\xfe??\xf3\xf0D\xd0\x91\xc7?#3Uz\x95D\xc4?8\x84\x9el\x13\x12\xf2?I\x16\x83b\x8a\xe0\x81?_\xb0GX\xfc\x07\xdb\xbf\xc9\\\x04\x05\xc8Y\xd6\xbf\x03#\xe2\xe5-c\xe1?\xfe\xffS&\x945\x05@\xbd\x9e\xb6\xdb\x8c\xd8\xf2?\xeb\x0b\xd0\xe5\xac\xbf\xf0\xbf\x98\x1462Nv\xc1\xbfz3\xf2\x96\xde\x88\xc0?]_#S8\x07\xf0?\x960\xad5\xf2u\xe7\xbfV\xbe\xf6\xd3\x17\xb7\x08@(\x08O\x8f\xfex\xce\xbfL\xc3\xfa\x84\t\xe2\xfe?;"\xe7\x92\x16\xfd\x02@+\x88ro\x7f\x9a\xf5?\x12\xc4\xc4l\xea\xd7\xf4?\xfbn\x19l\xde+\xef\xbf\x9d\xe5\xc9\xae\xac\x08\xe3\xbf\xa8\xca\xeb\x87\x11\xdc\xf3\xbf\xfb\xdfz8\x92\xa3\xd5?>\xcedm\xc1N\xda\xbf\x86\xbe\xc8\x12\x82\x89\xf0\xbf\x169\x7f>0m\xe6\xbf\'\x90\xd2\x9fk\xcd\xed\xbf}\x92\x1d\xd3\xd1\xde\xd4?\x1b\x85\x84\x96\x03H\x04@\xf0KE\xe6\xafz\xf2\xbf5\xf4W\x987\xf6\xf7?/\x8d\xcah{\x06\xf2?Vq\xf2w!\x90\xee?\x05\xfas!n\x07\xe3?\xec\x936\xc5\xa4%\xe4\xbff\xec\x11(\x1c\xbf\xb2\xbf\x10Vv\x0b\x0c\xa4\xf6\xbf\x95c\xf1x\xb1:\xe9?d\xa9\x08)\xa1*\x04\xc0"!yi#$\xdf\xbf\t\xad\x00\xe1\xeb\xfc\xf9?^\x9eP\x95\x00\xe9\xf8?\x83\x1d2l\xae\xb8\x06@\xce\xa3\xc6\xed\x01\xbb\x05@V\x11\xeays/\x02@\xcf\xf0,\t#;\xee?]\xaf\xcfO(;\xeb?V\x1c\xbe\x8a\xca\xb0\xfb\xbf\xb1\x8eSo\xcaa\xd1\xbf\xb8\xf11\xd4%\xbd\xdf\xbf\xb9|\x05\xd8f\xc4\xf0?"1\xfdu\xcam\xe3\xbf\xe1\x07VG\xea\x91\xf7\xbf\x98\xbb\x13E\xa9\xd2\xfb\xbf\xed\x00@\xe3^\x86\xf1\xbf\xcd\xe0\x8f\xca\xbf}\xf9\xbf\xc5\xf9,\xe0\xf2{\xd6\xbf\x82\xb1D\x12\t&\x00\xc0&\x12R}C\xa1\xe8\xbf=Y\x19\xb6P\x9c\x01\xc0e\x03&\x9e3!\xdb\xbf\x92\xf3\x87\x88\xc1\x15\xee?{\xe6g\x85\xb7A\xf8?\x88.8\x8c\x97\xa1\x00@2\xe5\xbc\xba\x10\xab\xd2\xbf\xde\xca\x00f\xb0)\x02\xc0@\xcc\xfc\xbf\xe9f\xfa\xbf\xc7*\x8c\xe6u\xf3\xf1?\xbeWl\xd1\x0b\x02\xf3\xbf\xd1zi\xfaE-\xf2\xbf\x17\xc9"\xf2\x16t\xc4\xbf?7\xb0\x11\xafC\x03@\xbav\xb7B\xb38\xf7\xbfr\xd5P\x0f>g\xd3\xbf\xd1\xa8Z\xc4\xc4U\xf0?\xb3\xe4I\xda2x\xeb?\xf2\x9d|Yh\xe4\xca?W\xe0/K\xca\xbe\xe2\xbfWzO[jV\xda?\xb0\xb8r\xe7\x1d\x95\xc4\xbf\xfd%\xa0\xf2\x9b\x91\xe6\xbff\\\xa4\xb1\xee\n\xf3\xbf\xe3\x05;\xc5\x11\x17\xea?\xcb\xc3\xba\xcb\x94k\xda?\x86\x07\xb9\xc0X\xac\xd3?T\xd5S:\xa7\x86\xe0\xbf6\x856T\x93g\xf7\xbf\xe8\xb8\xdek@\x8a\xc8\xbf\x9e\xd6\xadMR9\xc8?\x17\xbf\x992\xafL\xec\xbf\x01\xdf\xf1\x8fn\xac\xf3\xbf\x18\xd9_\xdab&\xe8\xbf\x08}\xa6M]&\x0b@\xd3\xd6G\x06\xc4J\x07@\xf5\x89\xda\xe6\x8d\xc3\xd6?\xec\xab\x9b\x88bW\xd7?\x80\x16^\xe1\xf4\xc9\xee\xbf\xcf\xf1aIa\x98\xe6?p\xdc/\xf8\xb8\x1a\xd8?Y&y\x9f$9\xe3\xbf\x10\x1e\x05$2B\xe6\xbf\xa1\x86\'6\x8e\\\x00\xc0\x89\xad\xcd\x8a\xdb\x81\xf2\xbf\xd8\xff\x94\x84\x9b\x85\xb7\xbfc\x01\x1f\x97\xe7\xcd\xe3\xbfE\xe0j\xd2\xe7?\xde\xbf\x10\xb2?\x89:\x95\xf3\xbf\xe1\xbclY\xc1\xd9\xd4\xbf?c\xbb\xb7\xa0\x8f\xdb?h\x1ea\xb3\x8b\xfa\xe6?\xba0\xf7\xd0a2\xd3?\xbai\xf6sJ\xd6\xf0?\xfe\x97\xa8\xb8\'o\xcb?\xde\xab\xb8X&\xb0\xe4\xbf\x02hSh8<\xe6?I#\xa8\xfe\xe0t\xfb?\xa5L\\Q\xd7\xe3\xed?\xb8C\xf3WH4\xf4?{c\x84\x14\x97U\x07@\xc8U\xc9\xadb_\x02@\xb3\x8a\xb2\x05];\x05@\xe1\xa7b\x08\xd9q\xf2?7E\xcd\x90*\x88\x00@\x94\xac\xfe\x9f\xb4\x13\xa1\xbf\x19\x05-\x90\xe4\x03\xee?w\x054\x91\xce\x98\x9e?\x8e>\xcf\xd7\xdc\xb0\xe0?1{\x80\x92\'\xb3\xc8?[Z\xf0\xf6\xa7W\xd3?\xd3[p\xae\xbc\xfd\xb2\xbf\xf6\x80\rJ\x8d{\xc5\xbfs\x1e\xe1\x16sK\xbb\xbfL!\x10\xf0\xb8r\xd5\xbf,Q\x86\xd2\xf4\xd5\xd4\xbf\x02\x08\xd4F\x84\xc1\xe8?\xcd.\xc6\xa8\xa5\x17\xd8\xbfa\x896\x81\xb4\xd1\xcb?"4\x98g*\x0c\xc0\xbf\xfd\xc3o\x84\x15(\xe8?Q\x04\x13Xa\x90\xf3\xbf[\x18\xc8\xf6U\xd1\xe5\xbf\xd6;yS\xf1\x86\xd9?\x04\x99\xac"/\x1c\xe1\xbf\xb1_qnc\x8d\xe3?\xdc\x11\xa4\xb3\xc4\xa4\xe2?\x81\xda\x8eG\xd2\xcf\xd0?\x83n+-\x86\xa4\xd6\xbfb\xaf\x880\x871\xd7?\x1d\x8f\xaa\xac\xa6\x1b\xe2\xbf1\xa5\xee-\xe1\xe2\xe7?\x05\xd4\n\x00\xad\xa6\xe1\xbf\xd8\xbeq\x92\x88*\xc4\xbf\x02o@\xaa\xcf\xd0\xc2\xbf4\na\x8e\x90=\xa6?d\x18\xb9\xfc\x10i\xed\xbf\xe8D\x17\xca\x04\x06\xe3\xbf\rJ\xc0\xc9\xff\x8c\xfb\xbfq\x95pV\x01\x8e\xdd?\xb7\xf2\xdd\xb6{5\x02@\xfc\x08}\x98#{\xe4\xbf\x0b.\xbc(\xe5X\xca?\x1a\x93\xc4\xdb9\xe3\xc2\xbf/g\x18\x92\xea\xa1\xff\xbf\xc89\xed\xb9\xf7\xbf\xd9?\xdc\xd9\xf2Z\x95\x87\xd8?\x06\x8c)\xe1\xb7\xe0\xe3\xbfI\xba\x1d\x0e\xcbI\xc4\xbf\xf2N\xa1iLF\xf2\xbf\xff\x04\xc6qq1\xf3\xbf\xe7b\x8d\x95\xee\xf3\xea?E\xb7\xf3\xb8\xc7\xc0\xce?ag\x1dQ{\xb4\xf8\xbf\xce\xbeB\xae\xd3E\xc0?_\xddq\x12l\xac\xc9?\xc5X\\*~\r\x85\xbf>\x8e\xda\xb0\xe1\x18\xa3?\r\x01\x8e\xd3\xd8U\xb8?\xa6\x97zO\x1aX\xe1?s\t\xec\xf5o\x12\xc6\xbfu\x99y\xf8\xd7\x13\xbf?DX\x82\xf2H\xb3\xf7?\xd8\xb2\xf3\x8c-\xe0\x94?\x9d\x0f\xffk\xf7\xcb\xda?\xd2\x8bWp\xc3\x05\xd4\xbf\xa0\'DL&\xb9\xcb\xbf$%@\xff\xce%\xf5?\xdc\xc9h\xbc\x920\xf0\xbf\xf5U\xeb\xbc\x11Q\xee\xbf\xc45\xdd\x91+a\xc6?\xb1\xd5s\x88\xa7\xbd\xc9\xbf2.\xf5\xd9hX\xa5\xbf\xa8\xf5 )\x01\xf8\xf0?\x8e\x0c1\x1f\x8e\x7f\xf4\xbf\x14\x9d\xaeG<\xcc\xa2\xbf\xa6$\xe4\xe8K\xad\xe0?b*X\x0bG\x08\xc3?\xfe/\xf5Z\xd9\xc1\xef\xbf+\xbe\x80\x15zC\xe2?\xebo\x00\xa0\xbex\xe6\xbfX=\xf5\x85\xc9 \xdb?v\x07\xddxv\xb2\xe0?\x89\x88w\xac8\xa0\xe6\xbfy\x8bK\x8aG\x1a\xf6\xbf7\xadp\x8b\xf0\xb2\xe2\xbfq1e\x05i\xad\xcb\xbfW\xa8\xd8\x03\x9c\x9b\xed\xbfY77\xecZ(\xe3?\x88`*\xd8\xf0\x8f\xd6?i\x91\xed^\xe6\xb7\xf1\xbf\xa3p\x10\xa6\xe6\xbe\xbf\xbf\x8f{\xad\x19\xf7C\xf4\xbf\xdf\xba\xc2\xf9MN\xdb\xbft\xbf~k\xe3f\xd6\xbf5<\x97(\x0cW\xd6\xbf\xee\x87\xf2\xb9`\xd2\xb7?.\xf1+t\x9fB\xb5\xbf\x0fbe.\xe1\xf9\xc0?\x1a$X.\xad\xbd\xd9\xbf9K\xcc]\xbe+\xd7?\xac\xda\x91\xde\xb2\xbe\xd6\xbfZ\x84\x90<\x80Y\xf7?\x10x}\xbb\xd7\xb2\xb2?\xd2|\n\x0b\xd3\xc2\xf0?\x90\xf1\xd2N-j\xe2\xbf$\xbd\t\xaaZ?\xd8?~\x9b\x8cE\xe9\x84\xca\xbfEA\xbc\xc2@\x01\xe4?\xdc(4\x08;F\xf3\xbf\xe2\xd3\xda\x02\xb1\xe1\xd5?\x1b\xf9\x07\xe92\x80\xf1?\x1a\t\x98A\x11\xac\xfd\xbf\xc6\r\xde\xfc\xd1\x14\xc0\xbf\xd0*\x89T\x0fy\xdd\xbf\x7f~n\x9d\x13\\\xe2?\xcf\x08\xc8!\xe0@\x9f\xbf\xec\x93\xf1N\xc1)\xfa\xbfGjSug\xf8\xb8?id\xc3\x0f\x19\xeb\xc2\xbfD\x1f\xcd\xc7\xe7\x1d\xb3\xbf\xec\xd2M[\xb9B\xc4\xbf\xcek\x0e\x94\xa1h\xbf\xbf%\xd1\xcd6\xdcD\xef\xbf\xa6!\x88d_\xdc\xbc?\x13\xf3t\xce\xba\x9eF\xbfT>\xd9l\xbdp\xf1?\x82\xf3 \xee\xcbc\xff\xbf\xd7H\xb0,&,\xb8?\x0c\xce.\xe9\xd4\n\x8f\xbf\xc0\xa5\xcd~\x1d\x07\xe3\xbf"yX\xa9\xa2\x17\xe8\xbf\\\xbf\x0f\x9a>|\xfb\xbf\x95\xb9\x87\t\x88\xad\xe4\xbfC\x9e4\xaf\xe8\x8e\xe0?u0{\n\xf6\xfd\xef\xbf\x03\x1f\xaaa%\xc4\xf6?~\x9f4\xec=\xf9\xb2?1\x89\x9dCA\xbd\xed?\x98\xe6\xc1\xca\xb1\xb1\xf1?0u\x96\x90\xd7v\xfc?\xaa\x1fx\xc5\x05z\xe3?6\xad\xa1\x1e;\xbe\xb7?\xf7HDW\x19-\xea?\x0e\xf3a\x92m\xd9\xff?\x14\x13]\x0e\x82>\xf1?\x81\xfb|[g\xf3\xa4?\tn>\x81\xb2!\xdf\xbfc\xc5\x81z\xec\xd9\xee\xbf\x93\xb0\x87\x144\xc3\xf8?\x06l\x04\xaf2-\xba?\xe9\xf4Y\xb3\x12\x06\xdc\xbfm\x95\xbf-2<\xfc\xbfh\x82\xe0M\xe7\x1e\xf6\xbf\xae\x1a\x957\x988\xba\xbf\xf9\x85\x7f\xfdjo\xca\xbf/<\x9a(w\xf3\xa9\xbf\xdd\xbb\xd3\xdb8=\xc1?\xca\x9eDF\x0e\x81\xcf\xbf\x0b@\xb8\xbe\x17\x7f\xc8?\xf5\x7f1\x91\x9c\x95\xb8\xbf\xd6\xf3K]~\xe5\xe1?i\x1b\x11\x8c~\x84\xe9\xbf\xca\xe3)\xc1\x87\x03\xf7?*\x02\xfe\xed\x886\xf7?\x15\xab\xe5\xbe5%\xfa?\x1d\x81\x00/\x80k\xd8\xbf\x91\xe1\x03\xf4)\x8f\x04@t\x13\xe8V\r\xe0\x00@\xcbp\x92$\xb0B\xf2?U\xc6\xd0/\xa9\xf6\xdc?\x81%\x8a5\xb7\x99\xf8?*\x1aL\xfap\x9e\xff?\xc3\x9dO\x0e\x06:\xe9?5L\xf3/g\xcb\xd3?Q\xafs\xe3\x89\xf0\xf5\xbf\xd4\xb8\x82\xec\x1c\xd3\xf7\xbf\xa7-\x8bg\x9f\xed\xca\xbf\x01_\xef\x82\xe2\r\xf6?\x96H\xee\x0f\xf3Q\xf1?s\xe8H\x820;\xd3\xbf\xfd\x1d\xe2\xd6\xfcw\xe0\xbf\x89\xd9\x1e\xc0\x7f\x03\xcc?[\x8d\x80\xdbaz\xeb\xbf\xe2\xaf\xbadZO\xe7?V\xa9\xfb\xdf\xf8\x87\xd8\xbf\xf3.\xf9\xe0\x83\xa6\xf2?\x06^ik\xa1<\xe8\xbf5\x01\xc6\xbc\xf0+a?h\xe1 \xb2Y\x7f\xf0\xbfP\xa3\x06TW9\xf1?\xd3\x12CP\x172\xea?\xc1\x13\x15-K\x88\xf0?\xb5\xb0\x8em\xc2\x8b\xc2?xw%o2\x98\xeb\xbf\xe6\x8e\xa1\xa3e\xa1\xf5?){^\x99\xdf\xd2\x18\xc0\x0f\x9e\xb9\x02f\t\xf5\xbf\xf4\r\xc9\xf9|\xfd\xec?\xb1\xdcR\t\xa8E\xef?\xb3\x08\xb6-+\xce\xf3?4\x11\x05;1\xcc\xe3?\xc9=C\xa8%\x86\xe3\xbf\x89\xdb\x82\xa7\x1f<\x07\xc0\xe5\x1c\x8b\xd9i\xeb\xd7?\x82:|\\\xb9\xb2\xe3?=5\xda\x98\xeb\xba\xce?\xf9\x95\xe9\xb9\xc5\xbe\xd6\xbf@?/\x92x\x0b\xcc\xbf\xcf\x99eS\xb6\x91\xd0?F\xc7\xd0\xca\xa0\x87\xeb\xbf\x06@\xac\xd4\x11Q\xf6\xbf\xd9&t{ao\xbb?\x96\xcd\x10\x9b\x15\x9b\xeb?\xe9d\x81\xf0\x15r\xe0\xbf]\x94\xe3\xf6G\xa6\xd3?\r\x08\xea\x96LS\xf6?\x16q\xc1\xf2\xa9\xef\xd9\xbf\xa4J\x8e\xdfK\xb5\x03@\xac\xcd\x9a\xb5B\x8f\xf4?\x87\xf8\x7f\xf3;F\x10\xc0a\xb2\r\x84\x1f\xc9\x0b\xc0\xb4U\xef\xcd\xadD\x07\xc0\xa4\x1e\x9c\x14\x97\xd5\xfd\xbfc:\x00\xdfD\xe6\x06\xc0\xc2H\xca\x93\xc0\xd8\x10\xc0\xbeO-l\x88/\x0f\xc0\xe3\xd1=L.\xec\x11\xc0\n\xa0\x14l&\xb1\x0b\xc0\xfb\x1e^Gy_\x12\xc0\xcb\xf1\xd8\xa4\xf1\x92\x04\xc0Y\xfa\x14\x9e`\xd1\xcf?\x89\xb1,\x13\xfe;\xf0\xbf\xba\xae\x84C\x8d\x93\xf0?\x85}\xf3\x93\xfb\xe8\x12@\x02\x86a6\xf8\x1e\xf7?|\\\x81\x19Z\xaf\xe7?\xbf&T6\xf8\xf9\xc3\xbf.\xb2z_\xd7\xe2\xf0\xbf\xe8FI\xcd?\x95\xe0\xbfa\xffY\xb1\xde\xef\xe2\xbf\xcac^\x9d\x863\xf6?\xb2\xb3R\x14\xf7:\xc8\xbfw\x11U\xec\xa5r\xf8\xbf,S\x0cem\x16\x03@(\xbf\xa9\xa4\x90:\xe6\xbf\x85L\x88\xf5br\xd2?\xdcF\xe7M%\xfd\xdc?Lzi\x9a\xb5k\xf9\xbf\xd6\xbf\xee?L\xee\x00\xc0l\x18\xe0\xc2\xea\xbb\xf8\xbf\xf6`\xc4y\xbe\xe7\x0e\xc0\xcc\x0e[\'\x05X\x0c\xc0\x07\xd3~\x12\x92\x15\x17\xc0\x8c\xe1\x1f\x8d\x0f\xd2\x0e\xc0\xca\xe0\xbaWh\xaf\x12\xc0G?@\x02E\xd0\xfa\xbfE\xb4\xc1\x96g\x88\x00\xc0b\x8b\xe6\x89\xfe2\xe4\xbft\xec\xea`\xcf_\x14\xc0P\xe6\xe9\x8e}]\xe3\xbf\x9a.X\x92L}\x9e?C\xd5\xf4~\xaa\x83\x8f?2\x93@W\x0e\xec\x01@\x9c]\xaa<\xa9\t\x06@Ccs\x88\xe1.\xf5?\xaa\x0c\xcc\xe8IQ\xf4?\x14Oe\xfb\xd7\x9f\xe1\xbf\'\xc3Ai\xf3r\xd6?\xd2\x9f\tJ]\xba\xdf?Ge\xcc\x10\x93m\xcf?\xae"\xb4\xa465\xe2\xbf\x93\x1d\xc2{\xca\xec\xf7?\xd4\xb5\xf1\x1f0g\xd6\xbf\xe8}t#\x84\xfe\xd2?\xc08\x89\x1cp\x89\xf6\xbf\xb0\xeb\xc3\xd6\xbdt\xda\xbf/\xe2\xb0\x04\xc52\xd0?q\rgNc\n\x04\xc0r\xf7\ti\x99S\xfa\xbfQ\x1f&\xb5\xf5\x84\xf5\xbf\xa74H\xf1@\xed\x13\xc0\xd8\x89cs\xc2\x81\xd3\xbf\xbc\x84\xea;\x16\x80\x18\xc01\xaa\x0b\x10\xe2n\xe9\xbf\xf4\x9c\xec\x99\xf1\r\x03\xc0F\xd4\x00[\\\xf6\xf6\xbf\x1c\xe8\xb0z\x80!\xf5\xbf\'\x11j\xa8\xe2l\xa0?R\x99\xc6\x11\x1d,\xb9\xbf\xa4\xf6\x94V\xa3q\xd3?\xd3\x11v\xbb\xc6Q\xf2?1\xfa\x92f\'z\x02@\xab\x14r\x7f\x90(\xea?\xd01\xbb\x1b\xd8\xc9\xe0\xbf\x83\xf6\xa3F\x92\xbd\xbc\xbf\xa1\xbf|\x87.\x9a\xd4\xbfn\x12a\xda\xb0\xad\xf4?m\x7f7\x88\xcc\xd7\xd9\xbf\xaa\xfe\xe97\xd1\xf9\xdb\xbf\x9fM\x1a\x7f\xff\xce\x01@!#\xbb1)n\xf8\xbf8\xf9\xe0\xbe>8\xda\xbf~\xfd\xde\x97\x1f\xe9\xf6\xbf\x01\xb9\xe9jX\xf8\xf1\xbf\x04o\x1f\xb2\x1a\xbd\x06\xc0\xde\x9e\xfeMCc\xfa\xbfl(\xfb\xae\x9c\x8f\x06\xc0\x9b\xd9\\\xab\x9e\x9e\x01\xc0\x122\xb9d\xces\x17\xc0\xdcK\xd6\x0e7e\x17\xc0\xc8\xb9$Hx\xfd\xec?!r!9\xac\xb0\xde\xbf\xdbmZA\x851\xb2?\x01\xfbA\xe5N\x07\xc4\xbf\x0b\xc9\'\x90\xa1\x00\xe7?;_\xa1\xf9\x1dA\x06@\xd8;\xb5\xb9H\xbf\xd1\xbf>C\xd8\xf8\xf6\xbd\xdc\xbfW@{\xe1\xe7\xcd\x8a?\xd2"\xbaF\xfcT\xc8?\x18\x8a\x90\xb4\x08\xf3\xd5\xbf\x97\xdb\x00\x85\x91\xc5\xd6?Z\x1d\x06t8\xe4\xe8\xbfm>c\xd1\xbb%\xf0\xbf\x87^\xe0\xf6\x8c\xcf\xd2\xbf\xf5H-\xdbHB\x06\xc0ln\xdc>\xb4\xf6\xda\xbf\x1f\xc8\xd3\x9e\xa99\xd8?l\x11QA\x11\x18\xdc\xbfcm\x80\xd7(1\xf6\xbf\xf0\x13[\x10\xa6R\xf1\xbf\xb06\xc2o\xff\xe7\xef?A{}\xa7\xf0\xbc\xf0\xbf\xba\xb6\x1d\xd8\xdfs\xe7\xbf\xfb}\xdd\xc4\x9b\xd8\xe1\xbfb\x8e\xaa\xf63\xc4\x07\xc0\xd6{\x9a\x15\xf8\xf1\x1b\xc0\xd8N\xaf\xd9\xc0\x04\xee?\\!\'\x12g\xd1\x08\xc0\xfa\x1b\xcdo\xd2\xb4\x00@)\xe2\xacmT\xf6\xe2?\xe0\x9e\x0eA\xc9&\xe2?\xc1R\xb5\'\xd6_\xe6\xbfU\x00\x8420\x9b\xfb\xbf\xb5fo+\xeaV\xc7\xbf.\xf4\xfa7\xa2\x89\xfc\xbf\xe5tC\xdan\xb8\xe3\xbfg\x12+\xce=7\xe2?\x14~%\xa7~\xd7\xf1?\xb2\xa1J\xba\x9e\xb2\xd7?:lR\xbc\x93^\xf2?\x04\x1c\x90\x87\x8b"\xbb\xbf\xb3u\t\xd2\xd5+\xdd\xbfK\x1eZ\x8f\xf1\xe5\xc9\xbf\\\xf5\xd9\xecSH\xea\xbfiM,\xbc\x10\xee\x01\xc0\x13z`\xf7\xeb\xe7\xeb\xbf\xcco\xf6aT\xae\xf2\xbf:a\xe3\xdf\xde \xee\xbf\xdd\xa5[\x15\x7f\xba\xf5?\x1c\x0bq\x13\xc4\x0b\xe6\xbfL\xa2\xebl\xfdG\xee\xbfZ\x02\xfb\xb0c\xca\xdc?0\xf9\xda\xa9\xcc\xf5\x1d\xc0mRi\x02$\x91\x03\xc0\x85Z\xd5\x83\x94/\xf0?\x86"\x86\x9fE\x17\xe4?\xddj\xc8\xda\xf3D\x01\xc0\xdb\xc8\x9fEb\xee\x05\xc0U\xad\x85\xfa\x8f\x90\xf4\xbfj\xe4\x95pV\xce\x01\xc0\'Y\x8f\xc45\x00\x06\xc0\xe5i\x18\xc2s^\x0f\xc0\xf8;\xd8h\x1bm\x05\xc0\x86\x83\x04\x80ZD\xe3\xbfD\x86<\xd1!\x8c\xc6\xbf\xd5\xa5u.\x9a\xed\xd2\xbf\xe1z\xe7\xcfIE\xfd\xbf\x9c\x98\xab\te\x9e\xb9\xbf\x88\xfd.\xba\x80\x1f\xe1\xbf\x12\x12\xb4=\xa8W\xb6?I\xbb\x19\xee\xef\xe7\xf2\xbf\xb0\xd1\xb5J\xdc\xd3\x06\xc0\n]mR:\xa0\x0e\xc0f\x8d~\xf5\xfc~\xf8\xbf\x97n\x9f)\xa6\xf4\x01\xc0\xc8\xe1\x83\x07\xa0\xe3\xe6?\x19\x92\x11r\xb2V\xec\xbf\x8c\xabk\x8f\xc95\x08@q\xdd\xfd\x10\x8cT\x07@|~N\xb6B\x9a\x13@\x99\x01<\xa9\xc2Z\x0c@w\x84\x8d\xf1s\xbc\xe3\xbf\x1eL\\Te\xb0\xe1\xbf\xba\xd9w\xbbg\x9c\xf9?\xeeAR\x8c\x03+\x03\xc0\xd2\x92[&a\x90\xf1\xbfl\xb7 d\x13-\xf3\xbf\xf2DF\xbc\xad\x12\xf9\xbf\xee+\xafa\xabG\x03\xc0?x\x1a9T\x82\xf4\xbf\x08\x94\x0b\xfc\xdf\xfc\x07\xc0\x14\xe7~[GZ\xf3\xbf\xf0M\x15\x1a\xc7\xeb\xea\xbf\xdbm\x96\x87\xef\x9f\xe2\xbf:3Gv\\\xbd\xcb?\x1ea\xed}P\x8b\xc7\xbf\x01\xce\xc36\x85\xb2\xdb?\xd4\x9a\xa3{\xcc\x94\xe8?!\x1c\xb0\xcd@#\xfb\xbf\x7f\xf3\x1a+\xd8>\xf2\xbf\x1c\tj\xa0\x00!\xe4\xbf\x965\xa0J\x9cP\xfd?\xfc\x0e\xb1\x8e*E\xfa?\x91V\xef\x06\xd7\xaa\xd5\xbf\x8e\xa2\x0c\xcdC\x06\x07@\xdbQ\x9d\xe5+\xae\x0b@%/\xa3\xf0\xd9\xfa\x0f@\x8c\x19\xde\xeaze\x1d@\x02?\xc8n\x9c\xf5\x9c?c\xaf\xcbN\xb8\xec\x11\xc0\x19\'3\x94\x97*\x0b@\x97\xdd\x05T0z\xe4\xbf}g n\xf0>\xf4?\xe4\xa4\xaa\xd6\xc5\x82\xc1\xbf\xcf\xa0eo\n\xb5\xd3?\xc1\xb8\xb9\xd4\x0e\x7f\xc9\xbfb\xaaJ\xe9\xd5J{\xbff\x00\x87\xbd\x83a\xea\xbf\x92\xa2\xc5\x07\xb7\xd8\xdb\xbfO\xe0\xabd=\xde\xe0?\x84\xc8CG\x921\xc0?~\xb0\x80\xa6\r\x17\xf3?x\xc1Y\x96\x03\xa7\xe9?/2.\xa7T,\x84?[V]\xff\x93\x84\xee?\x82\xaeb\xb7\xfa\x9e\xe3\xbf\x04\xe9\xf6\xb2\xae\xf7\xdc\xbf\xef\xff,\xb5WH\xd4?\xe0_\x83\x9c\x04E\n@W*\xfc\xd9\xc9<\xe2\xbf\xe8\xc2\xf8%\xe3\x92\x11@\x0f\x9d\x11;\x9f\xbd\xe1?$^y\xf0{]\t@\xc2b\xc4\xa7\x11.\xed?\'\xbcj\xca\x16*\x14@\xb2\xe0\x9b@\x8fJ\x13@#\x82\xde\xe4\x06\n\xfe\xbf\r\xaf\xd6\x83\xcb\xa5\xf7\xbfaC\xdd\x97\xbd\xa4\xf5?\xff>c_p\x02\xd4?\xf9\x0fX{+\xf2\xfd?m\x07ZR\xf04\xff?\xae\xfc\xb1) :\xeb?Ty\x8d?E\x97\xfd?\xa9\xcf\xdaV\x18j\xb9\xbfy\x92\xce\xa3\xba \xe9\xbf\xd4\xfd\xef-?\x19\xf3?v\x04o*\xd9K\x03@1\xc0\xad\xe2*o\xed?\xad\x07\xd3\x1e\xab\xc8\xf2?\x87\xb7FVp\xcb\xe7?\x12Ew\t\xa7\x86\xb7?n\xbc\xd7Jh)\xe8?\x94\xb68[J^\xed?JT\xeb\xa9\xaa\x03\xc7\xbfb\x0b\x0e\xc4\x07\x1c\xdd?\xbd\x15\x9az*H\xf3?\x8aq\xf4\xa0 \x18\xe9?c3e\xd4\x8d\xc5\xf0?\xab\n\xab\xee\xcc\x05\x08@\xeek\xe4@\x17t\x12@\xe4\xdf\xbe\xf4\x7f!\xe4?*\xc8`9J\x14\xd7?\xca\xec\x82\'\xc7\xa0\x12@\x80lp\xee\x1d\xe2\xc4\xbf\xab\xdd\xeb^\xcev\x01@3`5\xdd\xf7 \xe4\xbfsn\x00\xea\x19\xbb\x11@\xec\xd0aH\x89\xc6\xe7?\xcc\xc8w\x81CZ\xf5\xbf\n\xf6H\xb7Ti\x00@\xbf\xb3\xe4\xf6\x01\x9b\xdf\xbf,\x9eZFZ\x18\xb6?6\x16\xe0\xcb8\x94\xf3?\x81+\x05\x0eJ`\x07@\x04&\x9e$i\x7f\xfc?AZ\x12^=-\xeb?M\xd7\'`\xde\x93\xf7?\x15?\xbd\xb2p\xc4\xdf\xbf\xa4CK\x12\x0f?\xea\xbf\xac\x83\xebo\x1a\xed\x95\xbf\x0c/\x04\xd0\xa9\x04\xc8\xbf\x8b\xeby\xcb\xbaw\xf8?\x8e\x84\xf3r\xb3\xeb\xbf?\xb5&\xc6\x0f\xd9\x1f\xca?\x8b\xe3\x1b\xd0\xab\xfb\x9c?T\x85\xec\xd2\xd8\xb8\xf3?\xba\x04\x0c@\xddu\xf0?$b\xab%\x00\xf3\xd2\xbf\xc0~~\x0f\xc2r\xdd?\x96\x99\x82B\x863V? @\xa5\xe2\xd2\t\xe6?\x14\xbb*\xcf)\xb5\xd3?\xfeJ\x02\xcf\xda?\x11@\x99\xbdx\x95\x1d\x8d\x14@\xa3V&\xed\xc7+\x05@w\x8b&\x112\x0c\x07@\\\xd4\xe3a\x93\xd4\x0c@\xbe\xf3\xfej\xe3V\x15@=\xd0,\xf7\xf3\xf6\xf2?\x99\x9f\xd9."\xbc\x01@\xfb\x82\xbb\x8e_[\xf1?\x17\x12:\\\x9eB\xf6?\x981\xf5z\x11\xe2\x03@o-\x8d\xa6\xd4#\x05@#\x0c`~\xd6\xc1\xe8\xbf\xd74\\\xb1\x1f\xc1\xce?\xc2\xccH*X\x8f\xe2\xbfC;\r\x12nw\xcf?e\xa6\xe4\xfd\x07\xe1\xf7\xbf\xb6\xfc\xea \xa9\xb7\xca\xbf\xfdyJ\xa0\xc6\x01\xf5?\xd8+\x97\xde\x1b$\xf3?\'\xcd\xe3\x13\x00\xe6\x02@\xc2\x8b\xf5\xe8\x1f*\x03@\x80\x04\x84\r\x87\xb8\x00@K\xc4\x12\xcb$\x02\xf7?\xc6|{\xa5\x81\x11\x00\xc0\xcd\x9f\xc9}a\x91\x00@\\\xc8\xc7^\xed\xa56?\xa5O\xb0\xa1\xa2J\xe6?\x07\xbe\xf78\xbf\x11\n@\xb0\xc0\x80\xc64\x8d\x02@\xfc\xca\xdb4L\xf5\xfb?\xfdAV\x9eC\xcc\xeb?\x04\xc4\x0b0\x04\xd8\xfa?\x17\xcf\x8f\xef\xf6\x1a\x91?4\xa8)\xf8_\xf5\xfe? \xa8\x8f\xd1?\n\x0b@\xf6\xd7\x84\xcc\xd7\x91\x0b@`\xb0"C.\xbf\xf5?\x96\xee\x8dP\xcd\x7f\xf0?\xb7\xae\xa8\xc7L \xef?M\x00\xf5\xb2\x9cm\xe9?\xa8\xf7~\xa4\xc53\xec?T\xb3#\xbe\xd7\xce\xc0\xbf\x1f\xd8\xb5\xf9[\xb7\x91?N\xac\xff\xa9\x1b=\xec\xbf\x8fg\x01\x87H\x82\xf3?\x01t\xb1\xbbZ#\x0b@b\x02\x86\xec\x1c\x1a\x13@\xbd\xe3oxc\x19\x05@\x85\x81\x99\xc43m\xde?`z\x85\x11\xc0\xd0\xe8?\x11\xcay$W\xa9\xd7\xbf\xf8Z\xae\x80?\x16\x05\xc0\xe1-\xb7:\x0c\xe3\xf3?/,\xac\xde\x1d:\x04@.N=l\xf6\x1f\xce?.m<^x\\\xf5?\xbd\xe1\x1dF\x06\xb6\xec?\x12Y\x883\xa8E\xfc?\x1f\xdb\x0c\x0c\xbd\x95\xfe\xbf\x1b\xb9\xfa\x16\x9b0\xfb?\x0e\x0eDei}\xd3\xbf\xf0\x80\xd1db\x1c\xf3?Zv\xa8\xd9\x13\xb9\xf5?\xe3\x06<\x91"\xef\x02@\x03\x94\x14\x02\xb8\xbe\x01@\xf2\xc2\xf1Y\x7f\x8e\x03@wE\xad\xa2\xaa~\xde?\xa6\x1c%\x0b\xec7\xdd?4m\\\x12\xbe\xac\xa6\xbf\xfc\x83\x94S\x97\xaa\xef\xbf\xdag+\x8e\xca\x80\xea?\xf4\x9awx\xb9\xdf\xf0\xbf\x1d\xb0N6\xc8\x1f\xe2?\x06\xba9\xe4\xd5v\xfb?\x9e\x81|\x18\xc4\xbf\x10@V\xd0\xe0\xb0\x96\xa9\xee?cl\xcb\xbb7\xd4\xea\xbf\xf7\x99QG\x00}\xfe\xbf\xb8\x19\x0c\xfes\x98\xe8\xbfI\xfa\x1e\xceM\x1b\xf5\xbf\x80\x96\x06\xe4\xdd\x91\x08@\xc40\x85\xde\xb4\x07\xd7\xbf\xde^}\xf3\xe8[\x0e@\xfaR>\xc2$\xb2\xfa?b\x83\xeeQ\x8a\xd5\x07@\xdf\xddm\'OZ\x05@9q\xe2Gq\xeb\xf1?\xfe"\xef\x9cHr\xfe?ho\xc1\x1f\xce\x95\x05\xc0\x85\x911Yg\x12\xd6\xbf\x00*\xac~\x14\xb5\xbd?op\xc7\xe2)\x88\xea?\\\xbd\xc4n\xc7\xd6\xfa?\x0c\xb7\xbb\'\xf2X\xdb?r)\xb9\x94\xc8\xef\xe3?\xbbn\xe9\x80u\xdf\xf8?v\x83\xb0\xad\xd7\x80\xcb\xbf\x9cW\xeb\x0e\x95\xea\xc3?\xefs\x9a\'8\x15\xf1\xbf\xb9\xd8\xea\xf4\xb4@\xe2\xbfi\xd6\x83\x91\xbe\x93\xd2\xbf\xc1\xa8\xfe=\x05\xe3\x07@\x16B\xa0\xa8\xf0\r\x05@.X\xae\xfftQ\xde?#\xf4\xf8\xe0\x8b\xb9\xf4?\x7f\x18\x15\xc5\xd5\xf6\xe3?`\xc3\xca\x86Y\xb9\xcd\xbf\xf0=\xf8G\xcba\xf1\xbf\xfd\xa9Q?\xad\x85\x02@\nrd\xc4j=\xf4?X#z\xc6~3\xc5\xbf?\xa6\xcfsm~\xa1?\xf7B\xd3\xbf\xd2\xe0\xf7?D7\xf9\x080]\xf6?\'U\xb8\xd9Ve\xf7?\xfb\xd8\xf9\xc7$v\xcd?\xe1t@\n\x16\xd1\x10\xc0/y\xe1\xda\xf7"\xf7\xbfo\x8e\xbd\x82\xcc\xb6\xdb\xbf\x82\xe8\xe9e\x15\x06\xf1\xbf\xffxs2g\x8f\xa2\xbfoXf~\x1e[\xe9\xbf\x9d\xa5\x98L\xafL\xa5?\x13\x84y]\xf5\xfb\xe2\xbf\x8b\xe2\xc0\xde\xb3\x99\xe7?c\x05\xa9\xe8O\xa2\xdd?\x990#\xad\x14Y\xe9?\x89\xc7/\xf5\x12\xc0\xe1?\xd6\\w\xda\xb3\x17\xe3?s\xdc\xff\xbe\xd1z\xf1?\x03q\xf6h\xa1\xee\x01\xc0YL\x1a\xc8~\xfb\x04\xc0"\x04\x1d\xbd\x88\x15\xf0\xbf\xc3\x91\x96Z@~\xe5?=\x02wU\xa5\x19\xf9\xbf\x9c\xe2.\xdaw\xed\xf8\xbf1]\xc8t\\\t\xf4?\xea\xfe\xf5.\xce\x7f\xd7\xbf\x04o\x96\xa7\x89\xf3\xc1\xbf7\xba\xbd\x8b\xff\xa0\xe4?\x97\xd3\xa6\x15\x80-\x07\xc0Jp\xc5oc\x17\xfa\xbf=\xe8YN\x90\xac\xec\xbf\xd2\x9e\xb0\x19s%\xf3\xbfEy\x9c\xdf\xd7\xd9\x04\xc0\xa2\x1e\x7fs\x1c \xf7\xbf\xb1\x85\xfcwTi\xf3\xbf\x18&P\x82|:\x00\xc0\x9b6i\xe7\xba%\xda\xbf\xca\xb4\xc0\x89\xe3\x1e\xe5\xbfF\xef`\x8d\xdb\x1c\xec?\x19I5D$\xb2\xd0?n0\x9c\x0e\x89\x9f\xd4\xbf\xf7Dfg7F\xe3\xbfOFP\xc7\xb2\x0e\xdd?%\x82K\xc6\x8b\x02\xd1\xbf}1\xa5\x1e-\x85\xeb\xbf\xde\x85Y\xf9;\xe9\xb7\xbf\x14\x9c&\xa7\xca\x17\x08\xc0q\x1d\x10\x03\x17\x13\x07\xc0\x80\x97\xb1"Rh\x01\xc0\xd6h(ko0\x13\xc0\xac\xaal\xd8\xd9y\xe2\xbf\xdc\x16\x1cn\xb5_\xf6\xbf\xef_\x0e)\xbb\x06\x04\xc0J\x04~^\xfc-\x12\xc00\xf2a\x18\x97D\xff\xbf\x8a\x000\xb9\x94\xa9\x0b\xc0V7\xcb\x05V\xfb\xe7\xbfGryM\x8bE\xfa\xbfYQ\xbc\'\xd0:\x00\xc0\xe9\xadX\xe7\xc2)\xe5\xbf:$N3\xa1-\xe4?\xfa\xbd\xc0w:\x91\xe9?dU\xdc\x97\xb4Q\x01\xc0\xebM\x01\xecC`\xf8\xbf=N\x1f\xb2\t\x11\x03\xc0Y\xa6\xd3`J\xc1\xf7\xbfL\xa4u}{C\xe0?\xa9\x1a\x164\xf6?\xe6?\xa8\xa8,Z\x17\x9d\xf1?\xa7\xe4\xc4e\xbe\x92\xd4\xbf\xb1\xd3\x80\x0c\xe9A\xf5\xbf\xc5\x8a\nh\x996\xf6?Ch\x8a[_\x83\xe4\xbf\x02\xd8\xc7$\xbc{\xee\xbf\xf2f{/\xf8-\x08\xc0\xb5\xd8\x1a\xcd\x95\xaa\x0b\xc0&z\x8a\x01\x0c\x0b\x03\xc0\xd7\xa7/\xa9\xce.\x01\xc02\x8f\x1d\xc3[\xbc\xf5\xbfz;\xf0\x18\x96\xe9\xfa\xbf\xfb\xae+h\x89c\x00\xc0\xc6\xf8|\xbbo9\xe9\xbfn\xa8\xf5\xf5\x19\xac\x06\xc0,T\x8ei">\xfe\xbfK\xaf\xd1:S@\x07\xc00\xf4il\x0f`\xf9\xbf\xf3\xa2%cS@\xed\xbf\x9aI8N\'\x18\xea?\xe4A_J#\x05\x03\xc0\x04\xd3\xbe9#\xae\xff?\xafmk\x95\x89(\xe2\xbf\xcf\x1a\xeck\xf8\xee\xfe\xbf\x1f\x0c\x075\xa0I\x08\xc0\xd7]p/!\x89\x04\xc0P\xfd\xc5\xe3)\x86\xec?\xc9 ;BVZ\xa1\xbf\xe8\xf6$\x91%\xd7\xd8\xbf\x9eA\xf9ot\x9c\xe9?\xe0cmc\xecq\xee\xbf$|-/=\x85\xc2\xbf\xb0\xed\xc5\x85\x8a\x06\xe2?Q?\xf8x7\x0c\x97?\xb0[q\xa3\x1c$\xcd?\x18N\x89\xc5\x19%\xf9\xbf\xfe\xa1\xb9c\xe9M\x05\xc0\xe8\x03\xack:\xa5\x04\xc0\xbbb\x990H+\xdd\xbf\xf6b\x90:\x00\x14\xf1\xbf\xef\xcc\xd73\xe2\xe9\x94\xbf<\xe7\xca\x81\xac\xce\xec\xbfjA\xdc7u\xf7\xe7?rNX\x87\x88\x8d\xbd?v|\xc9\xd2O\x80\xfa?q\x98s\x90\x1c\x06\xd9\xbf\xb7\x0e\xad[q\x8b\xd1\xbfP*\xe5\x07}\xa4t\xbf\x10\x94\xc0O-\xfc\xff?\x06\xd5"\xc2\xd1\xb8\xe2?\xea\x82\xa3\xf9@\x90\xe7\xbf\x81\'g\x82"\x00\xfd\xbf\x86\xed?,\xe0\x9b\x02\xc0\x9b\x93@\xd9\xc6^\xe4\xbf\x96Ij\x9bc\x85\xd9?J%?\x89\x00P\xd3\xbf\xcc\x89\xdbj\x95_\xe3\xbfI\xc0\x80!?D\xdd?\xb2\xda\xad\x82\xb0I\xe3?\x99\x81gi\xf1\xc6\xed\xbfJw\x01\x05\x9f\x8f\xb1\xbf`fC$\xb3@\xf1\xbf@p\xa1c\xda8\xf4\xbfz\xf59j<\xea\xfd\xbfj\xc0\xb7K\xe2v\x10\xc0\xac\x7f\xafP\r\xd0\x0f\xc0z\x88\xf0@\xadC\x11\xc0\xf8\xe1?\x0b\xb9\xa5\x12\xc0$\xcc\xa1\xacx\xe3\x03\xc0":\xae]\x13\xac\x12\xc0W\xe6-\xdfz\r\x03\xc0\xd5/x\x1a\xf5\x82\r\xc0\x1f\xef(\xb3\xff\xc8\xfa\xbf6\x00n\xe51j\x04\xc0|\xc0\x84z\x94\xda\xfe\xbf\x98\xd3}\xd0*j\x0f\xc0\xde\xc7\xe1\x00\x17e\x00\xc0I\x89xj\x18\xd9\x07\xc0&{\xcc\x13N\xd2\x08\xc0\xdb\xd1C\xee\x80\xbc\x03\xc0E\x94c7B\x90\xf3\xbf\xbf<8~\xb3l\xe4?\xf1iq\xfc\xa4\xce\xe8?\x19\xb9\xa0S`~\xda?\x8f{\x9f\x9dC\x89\xb0?B\xf8\x13\xe2\x0e\xed\xe5\xbf\x9f\x1by\xe9&U\xec?\\\xb39\xcc0J\xa5?fx\x93\xd9\t\x05\xec?d\xd1\x06T\xc5O\xda?l\x80W\xfc\x95\x95\xff\xbf-\xf5G\xb9N#\x04\xc0\xef\xc2\xb3\xfd\xd5\xa6\xf4\xbf\xc2\xf5\x8d\xe2\xed\x95\x07\xc0l\x11\xb2@\xa1}\x0c\xc0E\xbb\xd9\x9c\xd7-\x12\xc0\xb4#\x97\x85\xa9\xf1\x0c\xc0m\xe5\xea\xff\xd1n\x12\xc0\xfc\xea^\xb1\xef\x9a\x14\xc0#\xa5@\x14\xe2\x96\x1b\xc0\x8a\xac\xf2\xf5\x01b\x13\xc0zz\xc4.l\xcf\x10\xc0Tt\x1e\xc1\x18\xd4\x0b\xc0H\xf5Q\xe3\x85\x1d\x0f\xc0\x9d\xa3\xafb\x0bp\x0e\xc0\xf4\xd5D\xc6y{\xf2\xbf\xc6\x14|\x18f]\x01\xc0\xfcG?\x19\x04\x02\xf9\xbf\xd3\x85\x84\x04\x9f\xd3\xf2?]15\x8e\x8c\x03\xbf\xbf\xdeOyq3\xd0\xc1\xbf\xba\x06f\xecdH\xe0\xbf\x05\x93\xd2}m>\xd2?\x19\xef\x1f\xdc}\xaf\xe0?\x0b\xbc\x88\xe3\x98\xe5\xda?\xd4\xdf\x9c\x9f\xa32\xdc\xbfx\xb8\xa0\xb0\x92\xc3\x9f\xbf\xbe\xb4\x94\xeb\x87C\xfa?0\xfe\x0e\xaef\xec\xf3?\xd6\xb1\xe2e\x9e\xc8\xf2\xbf\xd5o \xf8\xef\xc0\xe5\xbf\xf8*D\'\x9b\xbd\xe8?\xd4\x07L\x1a\xd8\x0c\xf0\xbf\x97nh\xcb\xfd#\x99\xbf\xaeP\x80\x06\x9b\xae\xd5\xbf\xac\xd1\x0f#\x01\xa2\xfd\xbf\xeb\xad\xc0\xfe) \xe7\xbf<\xba\xa4C4\x1a\xf1\xbf\xdfa\x19\xe3l0\xe2\xbf\xdd\xd2\xd0\x01\xb5i\xf2?\xe8u\xcc\x1e\x86\x8a\xac\xbf87\xd6\xf4\x84<\xe9\xbf\x9dMB\xb2\xd2\xa9\xf7\xbf\xc8\x04\xd9\xfd\x8d_\xb8\xbf\xc9\x87/\xd0\xbf&\xa6Hi\xc8\x1e\xde\xbf\xfd\x83\xc9\x94\xe6\xd6\xdb?\x04\x1a+S\xd2\xf9\xc0?-\xc9b\xcc\xaf^y?\x164#\x83\xc2g\xe8?\xecR\x8b\x16\x1fv\xf1?\x97I\xad\xa0\x87\xdb\xe6?\x1e\xc0\x8b}R&\xe6\xbf\xca\x1c\x85[\xde\xf0\xdc?\xfd\x83\x00\xae\x190\xe0\xbf1\x92\xf8\xc4\xc0?\xe6?\xe1+\x90\xc8\xdap\xd2?g,\x18\x01\xb9\xf7\xf1?\xc5@\x9b\xad0E\xd0?L`\x9b\x95\x18=\xda?\xaf\x8d&\x17\xa3B\xf2\xbftM\xd0\xed\xc9\xf2\x9a\xbf\xc6(\xe7\xd8\x17\x87\x95\xbf1t\xbbEe\xfe\xf1?\x14\x89\xfcP\x0c\xed\xf1?\xd5\xa3\xecJ 3\xdc?E\xae\x1bH\xbc\xe3\xc1\xbf\x01\x91\xce3*y\xc0?\xe5\xabR\xfb\xeeQ\xba\xbf\xd2o"\x1dk"\xe6\xbf\x9e\xd7\x16\xf48\x82\xb3\xbfd\xa14$\x11Q\xb3?\xef\xcc18\x8a\xb9\xe2?\x0c\x96\xba=\xe4\xbb\xc0\xbf\xcf\xfd\xfb\xa3S\'\x8d\xbf<\x14\xae\xe4\xd0\xbb\xf2?F\t\xa34@\xd8\xea\xbf\x10\x9b( \x10\xbf\xbb?F\\&\x04K\xfc\xd3\xbf\x8e\xee\x8c\x04Y:\x88\xbf.\xeekP\x1cg\xf5\xbf\x9f\xdf\x81U\xa4\xd6\xdc?\x1c\xfa\xebr\xd1r\xf0\xbf|\xff\x7f\xc8\x86\x99\xe1\xbf\x8d\xfb\xb4\x03\x0b=\xac\xbfk\xf2\x87\xbb\x87\xdc\xc0\xbf\xb3M\xc5oh|\xf3?g\xe9\x8b\xa2eA\xf1?\xf1\xfc\xd2,V\xd6\xd2\xbf\x9d\xcf\xb0D\x84R\xd7\xbf\x89\xf6*\xb9\xa2\xcd\xe5?\x81wt\xf2\xc7\x8c\xfa?\xf7\xe4*\x93\x93\xbb\xf2?\x9e\xc8|%h/\xb6?\x03]\xc5\xff\xc6\xed\xfc?\xd7\xeb`\xfcSN\xd0?g\x93\xc7n\x18\x9e\xe9\xbfK\xe7N\xbeh\xfc\xf1\xbf\x90\xaf\xf2\xcdi4\xea?\xdc\xef5A\x10\xce\xc8?\x1a\x0c\xac\xb4\xd7B\xde\xbf%\xb94\xc2N\xe8\xbd\xbf^\x9bKT\x0e\x15\xe2\xbfY\xc7O\xd3\xb8C\xdb\xbf\n3\x9a\xb4l\xda\xf1?\xdc\xa9\x1fh\xa1,\xcf?k\xee\xd7\x90g\xea\xf2?5O\xa8\x89\x05\x80\xf0?\xc9i\x1d\xbb\x08\x1e\xe3\xbf\x95v8J\x94|\xe1?)\'\xe7\xea \x9c\xfb?Qu\xe9\xb4\xe6\xa7\xe6\xbf@\x93\xf1e\xb4\xa4\xf3\xbf\xa8&4\xa7^L\xee?\x14;|\xbb\x1c\xba\xa5?b\x8c\x89O\x9e(\xfa\xbfu\x18u\x02\xaav\xda\xbf\x08js\xa4\x02u\xf6?\xae\x82\x82\x83\xfe\x85\xcf?\x84\xfeyF\xe9V\xc4\xbf\x1d`\xf1\x1f8\x93\x01@\xcc\xac\xad\xcbf$\xe1?%`\xddT\x86\x98\xa4\xbf\x82N\xe4\xd4hE\xd6?\xed=\xea\xb8\x18\x13\xd4?\xcbjN\x8b\xf4\xdf\xef?\xacR\xd0\xd4d\x9b\xd3?\xe8\xf3} *\xe7\xe5\xbf+-\xc4\x9c\xf0{\xda?\x11vs\x02\xc6\xfc\xc4\xbfL\x0f\xc8\xe4^\x8c\xc8?16(\xa0\x8c\xc0\xde\xbfEq&\xb9\x97\x1a\xbd?O\xae\x8di8/\xda\xbf\x83\xd7K\xa3\x89\xaf\xf6\xbf\x0e\x97m\xe1\'l\xd7?\x12\xf4kb2I\xab\xbf\x89\xfd\x0b\xeb6\xcb\xcc\xbf\xec\xcf\x0b\xad`\x95\xd2\xbf\x1c\x10\xd8\xbcKN\xf4?p#\xd3\xdcj\xa1\xec?Q\xd0MC\xb7\xac\xf1\xbfVDJ\x8d\xb7\x07\x04\xc0^\xf6\xeb\xc0\xcb\x14\xe7?\xae\x8e\xb6\xcd[\x85\xc0\xbf\xfcV\xc6E9W\xfb?\x17^\x16\xcc&w\xd0?\xb2\x8eJC\xf4C\xc1\xbf\xd6\xd1yj\x04\x06\xe8\xbf\xca\x1d43\xad#\xfe\xbf-k\x1b\xb7\xc0\xf8\xed?e>\xcf\x1a\xc1\x03\x08@PH{\xc8[\t\xfd?\xc0\xceiNY\x9a\xf2?\xac-\xa04\xf6\x7f\xe0?\x15\xa8\x8d\n\x1a_\xe2?\xbdQpz\x8av\xe6?\x8e\xad\xa4}f\x18\xd1\xbf8\xa0\xea\xc4\x92\xbd\xd2\xbf\x00\xbd6\xf7\xe0a\xc6?L\x9c\xa3\xea\xd5:\xc2?CE\x89\xabkE\xa4?\xce];\xdf\x90\x94\xf3?\xc0rs\x97}e\xaa?\x8edS\xc9N\xfd\xe5?\x81\xb0I\xf8\xf1t\xe2\xbf\xb17Z\xdb\x05\'\xdc?\xcf\x86\xfc\xfa\x0c\xe6\xd0?\x96\xdat\xa4\x83Y\xe5\xbfVX\x96\xc9\xef:\xfa\xbf\xc5\xd9\x9d\xfb\xbaL\x00\xc0\\OFx\xe8\x8b\xfa\xbf\xdbu\x08\xd9\xaa4\x06\xc0\x02\x88\xe4Z\xf3\x08\xe7\xbfC\x03\xf76X?\xf9\xbf\xf5\xd6\xcb\x85\xb5\x90\xff\xbf\xb3i\xba\xb1\x06\x07\xe0?\x9c\x965\xff\xb7H\xcb\xbfx\xb4\x9b\xfcl\xdd\xdf\xbf\xb8\xdb\x8d\x06_I\xe6?\x06\x11\xea\xf3\xa55\xfe?h\xad\xb4\x88\xb8w\xa6\xbfK\x96\x02\xd9\x93A\xf9?\x8e\xe7\xe9Bj\xa7\xf7?,\x15\xa0\xd8\xca\xcd\xe5?w\xc8\xda*\xc6\xda\xec\xbf\xd28\xe39\xaaK\xd6?\x18\xc7\xf8@\xaa:\xe0?\x98\xacQ4\x18\x19\xec?\xb0\x0e\x12\x8e\\k\xb3? \xef\x0eG\xbf\x0b\xcd\xbf\xf1\x865\xcb\xb6a\xc4\xbf\x81\xe9q\x85\xbf\x88\xd9\xbf\xaa\xf6N>\xb8D\xd4\xbf\xee\xe9\xaa\x85\x14\xab\xf5\xbfc\xdd(\xe5\x9f\x99\xe1?\xa7#l\xafR\xb5\x05\xc0\xb2\xf0DU~\xd7\xf9\xbf\x7f\x0el]\xf7N\xda\xbf\xf1\xb5\x9e\xd8\xcc\x8a\x05\xc0\x14\x14\xd5\xeb\xc6B\xf6\xbf~\xc1#\xdc\xd4h\x00\xc0\xc5\xa6\xa1*M\x1b\x11\xc0\xd1\xb5z\'[\\\xeb\xbf\x1a\xd6\x08\xd5:\xda\x06\xc0\x89\xb6\x17\xa0\x96!\x06\xc0J\xae\r\xca\xc4\x12\xda\xbf\xcaY#)\xee\xd2\xe6\xbf\xbaa\x19\xc5\xd6\xa1\xed?\xed3\xdb\xdf\xa8\xa2\x00@\xe1\xec\x99\xe96\x9c\x07@#\xfbD\x88\x0e\xb6\xe1?x`\x97\xd6{q\xd9?\x02\x15\xf2kK\xfd\xfb\xbf\xc9q\xdd\xbc\xa0\n\xcd?wj\xa5\xec\x96\x95\xdf?\x94a\xf4\xf3i]\xe7?M\xe3\x9fK\x02%\xdf\xbf\x17\x1dQ\xcc\xb6)\xcd\xbf]\x9f^Q\xa2\xbc\xe5\xbf\xe7i\x9f\\\x02\xcc\xac\xbf\xfa\x08m\x05\xfa\xd8\xd9?\xe6\xba\xb2>\xee\xeb\x00\xc09\x00I`\x81Y\x04\xc0\xb25\x98\x85\x0b\xbe\t\xc0\xb0\x7f\x1fa\x06\x0b\xfe\xbf\xc3|B\xfc\xb5&\x06\xc0\xf2)\x92\xfc\n\x16\x06\xc0#\xdf\xee<\xee\xb5\xe9\xbf\xe2\xe93\xe1b2\xd1?\x92\xc4v\xe0\xfc\xfe\x81\xbf\xf5D\\\xbff\xae\xf7\xbfx3z\x83\xed(\xe5\xbf\xdc\x02M\xd9\r\x9e\xf0\xbf\\\x83\x15Q7u\xcd?\x88\x00D\xb7\xd2\xc3\xf6\xbf\x194A\x8dj\xaa7?\xdf5\xf0\xf4\xf2z\xf5\xbfx\xfb!yF3\xe6\xbftH\x9a\xf2t\xaf\xe6?\xa0\xbd\xfa~<\x0f\xf7\xbf\x0e\xf8\xcb\x9a A\xd8\xbf\x94+g\xa5t\n\xe8?F\xb1\x0cJ\xa2\n\xee\xbf\xdf\x8eD/z\xb2\xf0\xbfm\xa9\xa1\x12\xd3\xff\xba\xbf\t1\x86\x9dl6\xe8\xbf\x1b\xdd\x11q\x07\xc0\xc0\xbfQB\xa7\xdf8\x82\xfa\xbf#\x9f\xa8\x9a K\n\xc0A\xfc\x90.\x90\x13\x08\xc0\xf0\x8eX\x0b?m\x02\xc0=\x8ac\xde\xa1\\\xf4\xbf6\xb8M\xc1m@\xfa\xbf\x85\xc0N\x00D\xd2\x03\xc0X\xce8\x95\xc5h\xee\xbf\xea:g\xcd\x82\x99\xef\xbf0\x15\xcbPh\x0f\xfb\xbf\xcf\xe4\xac+\x02\xfc\x02@\xd2nM\x19m\xc5\xec\xbf\x03\xb7E\xfd\x98\x9f\xca?\xa5\x1fR\xd3\x1e\xe0\xe0\xbfx\x8dwh\x16\xb0\xd0\xbf\xce\xca\xf5Z \xf2\xe8?\xb80\xe2^\xa15\xe6\xbf5o\xda\xd1\xc3a\xbb?\x16j\x8f\x17\xe5\xab\x00\xc0\x07\x1cmnUn\xf1?\xed\x04\xd8\x93$\x1c\xec?\xbb\xab6mmd\xa5\xbfq\xac$\xde\xc5\x1e\xfb\xbfk@\x14\xe7\x9e\x96\xde\xbf\x04\xb3\xc8\r\xf3V\xc8?\xb0\xd4\xd9\xe2\xf8B\xd1\xbf\xc0\xfc1\xdf\xee\xae\xd1\xbf\xda@=\xd4\xcd\\\xfc\xbf\xbb\xdb\x00^rP\x00\xc0U\xeb\xacL46\xfc\xbf\xd3+\x8b\xf2\xb4\x99\x04\xc0\xa9S=F\xed\xf2\x0b\xc0x`+\xe1\x93\xba\x01\xc0l\x90\x00\xb1\xae\xbb\xf5\xbf\xbeL\x06\xe4sf\xe6\xbfG\xcc\x1a\xe8\xb9\xe3\xfd\xbfZ%\xa6\x0b{K\x03\xc0\xb45\x93m\xfa\r\xed\xbfwXi\x11\xbaH\xe9?E\t-\xda\x03\xe2\xb9?Q\xc4y\xa9\xcf\xb1\xef\xbf\'+\x9byQl\xd4?m\xf3\xc7\x93\xfbp\xf0?\xfd\x1f\xb8#\x18/\xe6\xbf\xc3;9\x13\xed\xfd\xe8\xbf\xb5\xcbQ\xc3\xe7\x02\xf7\xbf\x89V\xc2\x91\xd1(\xfc\xbf\xf0\xc4\xd9\xc4\xf1\xec\xfc\xbfj\x1c\xfa\xe0\x9aZ\xf0\xbf6\xe8r7\x10\x17\xf1\xbf\x13\xff\x9f\xcd^h\xf9\xbf}q\xda\'\xd3z\xf2\xbf\x12_;\xc0W\x95\xe2\xbf2\xd3;\xed*M\xdf?P\xdav\xe5\x87\xa1\xd0?\xd2\'#\xf4\xa8\x8f\xf8\xbf\x9b\x02c~\xd5\x95\x14\xc0\xc7$\x9a\x80\xc0\x11\x12\xc0\xd1p\x1a-)\xa0\xc7\xbfFA\xf6\xe2q\xeb\xf6\xbf-\x10C\x88\xe7]q?8\xef\xe1\xc3K\x96\xf9\xbf\x95c?\xcdE\xba\x96\xbf?\x18\x8a\xc4\xf3\xcd\xc3?Qq\'\xb3\xa5L\xbd\xbf\x04N\xc5\x9fh\x0b\xe1?`\xf7\xec\xb6W\x18\x06\xc0`\xf1\xcc\x07\\\x14\xf2\xbf\xde\x04{\xb6^\x08\xe3\xbf.\'\xe7\xfc\xefX\xf3\xbf!\x16\xc1\xecTN\xfa\xbfE\xfa<"d~\x02\xc0\x95Yv\xb2\x97\xccy?\xd4\xb7\x80\xb9Bj\xfc\xbf\x9d\xb3d\x86\xca&\x01\xc0\xcb}\xd0\x19\xc6q\x15\xc0\x9e\xfa\x15\x00\x1b\x95\x0c\xc0\xc2\xb1\xc5\x1c\n"\xee\xbf9\xb7\x08\x9a\\\xb3\xe1\xbf\xfdMxQ\t\xf1\xe6?\x99\xedM\xa5\xf9\xbd\xf4?\x9dk\x8elB\x0f\xd5?*\xde\x0ez\xd2\x86\xf4\xbf\xb9\x95O\x9a\xf5\xc2\x04\xc0z\xa3\xe1\x93\xd1\x93\x02\xc0P\xf7?i\xe6\x96\xfc\xbf\xd9\xf1\xe9C\xb1\xcd\xca?\x15\x03t\x15\r\xa0\xd9\xbf\x1cvZ\xf3\xdc\x01\xe4\xbf\xd2 \x11!\xac\xc9\xf6\xbf\xf8\xd3\xedb\x9e%\xd8\xbf\xe6\xd6\x985p\xba\xff\xbf\xd3\x7f0\x9c\xd0L\xa7?\xa3\x19\x03\xb73\xd5\x0b\xc0\xc0\x89\xdaY\x11{\xde\xbf"\x88|\xeb\xf3F\xe7?\xb2+\xdc0\x08\xcc\x08\xc0\x8c\x07\xdch\xb5\xd4\x06\xc0Z\x14\x05\x95\x82\xae\xe5\xbf$\xa6\xc1\x8e3 \xda\xbf\x11M[\xb0\x0c\xb9\xff\xbf\xe3@B\xf8D\x9d\xf0\xbf\x1aI\xca*\xbd#\xef\xbf \xc9\xbdj\xc7\xf7\x0f\xc07\'X\xb2\x8am\n\xc0A\xde\xf4\x16\x01\xa0\xfa\xbf\x15W\x818\xf9\xc2\xe5\xbfR\n/\xd99^\xe7\xbfY\x99\x10\x0e,\xa9\x83?D\xe2\xec7\xdeq\xdb\xbf\x06[\x8a\x8aP\xce\xb9\xbf\x163\xc9Z\x98\x8d\xf3\xbf\x13vx\x83\xe2\x7f\x00\xc0Zd8\x98\rZ\xf5\xbf\xe6\x8bm\x8dl\xf1\xd0\xbf4\xc9\xcb+\xcd\x95\xf0\xbfPhy\x01Q\xd3\xcf?{K2\xce\x085\xfc\xbf\xdaw3p\xa5\xe1\xe8\xbfE\x16%%\xd4n\x03\xc0w\xbd\xc4\xa6\x1f\x8e\xca?\x19[\\\xeah\x1c\xdd\xbf\xe6\xccB\x02\xb9}\xd1?\xea&\xc0z\xee\xd0\xed?\x1a\x9d[\x04\'\x15\xc8?\x9fP\xe6&c\xef\xe7\xbfM\xe1\xdc\xb9\xbc\xb7\xf2\xbf\xc1jY\xfc?\xd9\xd5\xbf\xdfdy\x8b9\xb1\xfd\xbf\x99\xd4\x89\x85\x15\x10\xf3\xbf\x17Uu\xf74\xf5\x02@uIuG\xae<\xdf\xbf\xea\xec \xf2<\xab\xf7\xbf/C0+YC\xfe\xbf\xfd\x0f-\xbbHw\xe4\xbf^a\xc4\xdc\xb4\x11\xd1?\t{p\xee6\x9c\xe6?\xce\xc7\x01\xa0\xb7w\xe6\xbf\xf3Se\x8d\xc7s\xf2\xbf\x14\xc99\x95\x95F\xdb\xbfd,\xb9\xea\x08\xa7\xe2\xbf\xb3\xc8\xb8\x03ef\xa2\xbf&\x14\xf4[\xf4\x11\x0e@:\xab}\xe7?\x85\x01@\xa6\x8f\xc7\xf6!\xde\x04@!t"?\x8dI\t@\x9e\xe1\xf9\xfb\x18\xdc\xeb?\x8a\xed\x0c\x06\xdf\xb4\xa8?\xc8\xfc);=}\xf3?\xb6\x16P\xc4\x92@\xfa?I\xb1\x868\xf3\xac\x08@\x0c5\xfb\x13\xaeg\x04@6\x8d\x1c\xc2\xf1d\xcd\xbf\xdc\xe2|\x13\x8d\xc4\x02\xc0D\xa3o\xdbF$\xd0\xbf\xff~\x96\x08:W\xc8\xbf\t\xb2\xb2\xfc\xa4\x86\xd2?\xa91]\xe1\xcfk\xe7\xbf\xb1\xdb\xbb\xd9\xd6\xdb\xf3\xbf\xbf\xdf{\xd0\xe45\x00@|\xe0(0\x82D\x00\xc0R\xb7\xb4\xf1]G\xf5\xbfH\xce\xfc\xb5E\xebc\x84\xfe?\x85p}^*y\xd8\xbf\rr#-V \xb0\xbf\xed\x88\xcf\xee\xd7&\xfe\xbf-\xfa[2+\x83\x00\xc0z:\xba\x03T\x13\xca\xbf\xb1\xe6\x849(j\xf2?\x15z,\\\xe0}\xf0\xbf\x88\xdd\xb1\xc0\x06r\xcb\xbf\x8ds\x95\xa5\xe9\x0b\xd7\xbf\x8d]\x04i\x98\xe2\xed\xbf\x86`\xb3\xa8\xfd\xe8\xec?\xe4\xb8\xe6/\xce\x1a\x03@\xfa\xf9\xad#\xbbn\x84\xbf\xd5\x81=^!U\xf7?>\xdf\xd1\x08^\x1c\xe9\xbf\xf7\xcd\xdf\x83\x93\xcf\xcc\xbf\xf7\xa2f\x86\xc3\x1a\x05@\xc3\xb7,9\xb6Q\xf5\xbf7\xe7d\xb2\x16f\xff?NG\xf3h6^\xf9?i\x04\x82\x93\xde\xed\xce\xbf\x08\x15\x86G\x993\xc7?j\xb1KQ\xc0\xc5\xe1?d\xedI\xb4\xe9\xaa\xeb\xbf\xe2\xe0\xad\xd2\xce\xf9\xf9\xbf,C\xfc%\n\xb8\x00\xc0Y\xac\xf1i2\x15\xc9?~\xa0\xb4jqh\xfb?\x1b\x06w5E\xb7\t\xc06M\xf1\xa6\xf7\xc4\x10\xc0\xfc\x95\xd4A\x90G\x05\xc0\xa4\xf5\\\x18\xf6\x15\x00\xc0a\xcf\x8d\xfe\xed\x11\xe8\xbf+\x17\x93\xba\xf1\xab\xea\xbf\x92H\xc1\xbb\xecJ\xe6?\x96\x81\x92.1\x0b\xe1\xbf"\xcd\xbc\x15\x0b9\xeb\xbf\xd16l\xf0V\xaf\x04\xc0Q\x00%\x17\xc2\xc5\x0c\xc0\xe0chP*1\x04@\xba\x0b\x87\xa4\xe6)\x11@\x1a\xc9\xe1\x9c\x7f)\xe9?\xc8\xb3\x8c\xb3\xec:\xd4\xbf\x0f\xe4\xc6I\x8d\xd6\xfa?b\xca\x92\x93\x8cq\xfc?\x8f\xbb\x85j!\x04\xf4?\xa0~4\xda\xa0Z\xb0\xbf\x19\ru\x9d3D\xef?O\xb1\x9f\xce\xf77\xf4?&\xc9\xe2\x9aX\xc9\xe1\xbf^\x08\xb6\x04cL\xdf\xbf\xad\xa4\xdf\xcaT\xab\xdc?UU\x8e\rs\xdf\xec?\xc2\x96\xbc~K`\xd4\xbf\xa4A\x12\x93\\q\xb8\xbf\xd6m\xc1\x99-\x9c\xff\xbf\x1d\x9d\xff8,\x97\x06\xc0\xf9\x8293Y\x17\x11\xc0Q\xd6\x8d:\xc4\x0c\xf9\xbf\x8f\xe6[t\xd5V\xf8\xbf\xe0\x16\xe7\xf9\x16\xbf\xed?=\xbe\x0c6&\xa0\xe1\xbf\xd1\xd0\xf9i.\xf9\xf7\xbfV3\x9a^\xe3\x06\xc1?&\xfeA\xc4\x92,\xdd\xbf\xd8\xce\xb6\x00k3\x08\xc06\xd3m\x1e\xa2b\x0f\xc0\x8b\x97\x90~\x04\xc5\xfd\xbf\xa0\xcf\xb9\xa4s+\xf2?/\xd8\xbb\xb0Ff\x03@]K\xcf\xf9\xe0y\x0e@\xcf\xff\x162\x81\xc8\xee?O\xbf\x8ePp\x14\xd5?0( \x80No\x9d\xbf0\xc75\x9ev\x7f\xe5?a\xeb\xb7\x18?\xa8\xfd?\xb8\x18\x8f\xb8\xc1\xee\xa8?o.sZ\x94\xb4\x01@^>\xf2\xcd\xd20\x01\xc0Z.\xbck\x08v\x01@])\x82\xdf\x94\xe9\xca?\x19I\xc2\x82\xd0\xd3\xe6\xbf\x1a\xf6\xeb\xb9\xa7\xd8\x04@\xc5\xf4L\tW/\xf8\xbf\xe8\x0b\x98\x07?\x02\t\xc0\xf3U\xa8\xc0\x96\xd6\x00\xc0\xd8\xecX\x05+\x13\xa0\xbf\x85`A\xf2\xe7\xa3\xf7?i"/ir\x1c\xd7?\x80\xd6\x83\xed{0\xc5?\xae\xb3\xa4\xc8\x88\xbc\xed\xbfts\xd5\x95l~\xcd?j\xcb\x84k\xdcE\xed\xbf\xbc\x06\xfe\xb5\x92<\x12\xc0s\xba\x1d\xbd\x81\x13\x0f\xc0\xf6\xea\x99\xfb\xcb\x18\x15\xc0\xfdHN\x89\x96s\x00\xc0\'/\x10#\x8c\xe9\xe1\xbf\x11[\xfc *\xe2\xfe\xbf\xa8I\xc9\xd7\n\xd0\xf3\xbf1^^\xa2\x175\xea?\xa7cv\x1b\xf6y\xe0?\xe8\n!\x9c\x80\x9b\x00@\xdc\x1f\xa1~\xf4d\xd3\xbf\xfc;\xfe,-n\xd2?\x17\xed\xeb\xce/U\xe8?@8\xba\x00\x1fS\xff\xbfS\xed\x95G\x17Y\xcb?{eK{\x00J\xeb\xbf_IY\xf4\x01\x81\xe7?\xd1\x82\xc8\xb8\xc3\xa7\xd9\xbfa\xcde\xaf\xeb\xf6\xe5\xbfS1\xff\xf1\x8al\x04\xc0\xeb\x06\xb0\x11\xc1\x10\xf0\xbf\xed~=\x1b\x9e\xb3\xe8\xbf\x8a\x06c\xbc\xc4\xf4\xff\xbf\xb7\xebn\xa0\xf5\xcd\xed\xbf7\xc9\x18\xff\x91:\xe7?\xc1\xbf\xd3\xa5\x83P\xf3?|\xf6\xd6M\x18\x9d\xf1\xbfw\xe3\xf0\xf5]\xe4\xc9?\x8c8=\x9a\x15G\x06\xc0vB\x98;\xe3:\x07\xc0\x94\xbd\xbed&{\x11\xc0\xccb\x90;\xeb\x16\x14\xc0\x07\x12+j\x02~\x0f\xc0Q\x91;Xn\xc7\xf8\xbf\xe6R\xd6I\xdf6\xe9?\x89\x0f?S\x88\x84\x00@\x9e\xa4D\xec\xdc\xc4\xd7\xbf\xaa\x9a;\x8fYh\xeb\xbf?t\xbc\xa3\xfe\xb2\xda?/\xc8\xb6\xb0\x05\x82\xf2?\xc8\xfa\xc7A3c\xf4?$\x0c\xf5\x97\x1c5\x0c@\xf1\xdb\xd9W?\x06\xc7?\xf2\xe9\xd0{<2\xfb?\\\x01\xb54\xc6\xaf\xf1?\xbe-~\xfej\x18\x02\xc0{\x81\x86\x0e\xf0\xe6\xed\xbf\xcfR\xacy\xe9\x83\xf0\xbf\xec\x12\xdbN\x15\xd8\xfc\xbf^\x9cs\x86I\xc4\xd4\xbff\xa7$\xc7\x08\x14\xd6\xbf}\x0fJ\xe1)S\xe1\xbf#f\x90\x9fe\x13\xdc\xbf\xb1\xaa\x03\x10\xf8B\xf0\xbf\x03\xb9\x12QI5\xe8?M>1\x9b\x19\xd7\xe9\xbf\x13\xb7\xee\xa5\x19\xfc\x01\xc0e\xc1~%s\x12\x04\xc0\xcd\xff\xe9\xf1mK\t\xc0sP\xbf\x0e\xf5\x94\x07\xc0\x14\\\xe69\x9e\x80\xfd\xbfp\xc63\xf6\xe8t\xf6\xbfP;\xc1V\xc4a\xe5\xbf\x1e0v\xec \x81\xd1\xbf9\xbc\x89\x8dK\x8b\xe0?\x89j\x8a\xab\xe6\xc7\xf2\xbfMXE\x99\xfa\xb1\x00@\xd5\xea\xf4\xc7\x85\xbd\xf3\xbf\x84\t.\xfc\xd9\xf1\xbf9N\x04ug(\xec?hV\x089\xc4\xfe\xe9\xbfi\x1d\xb7?U\xbf\xf9?\x15\x82\x1a\x9ci\xc2\x06@L\xae\xfd;\x8f\xbe\xa3?U\xd1*V\xb5\xd1\xf2?\x96\xd8)\x9f\x9dU\xfd?r5>:`\xc7\xf2\xbf\x02\xda\x82\xb3\x98\x1e\xf1\xbf\x8d\xffY"f\xfa\xea?n\x7f\x86Z\xa2u\x05\xc0n\xd2\xf3\xea\x0ey\xf4\xbf;n\xea\xae\x02\xe8\xe3?}wP\xc1=\xae\xfb\xbfCk\x1d\x9c=\n\xda\xbf\xfc`\rC\x87*\xdc\xbfi/\xd0\x02\xde\xad\xda?e\xddA\xad\xean\x07@\xb4#\xbf\xd1\xba\t\xfe?\xe7\xdd\xa9]\xbd\x1d\xb4?\xc4\x06F\xc0t\xfa\xf5?\xf6\xeb\xdf\xf7\xbe\x10\xe1\xbf\xbe\x97\x9c\xad\xb3`\xa9?5j\xc0\x7f3\xd3\xd8\xbf\x04]p\xcd\xbe\xb6\xf0\xbfI\x00\x13\xed\xad\xd4\x99?y\x99\xda\xc1\x1c\xf5\xee\xbf\xa4\x0e\x8c\x93\xe2\xbb\xe7\xbfo\xfd\x85\x1ax\r\xe9?\x02\x9c.>\x8c\xbd\xd5?"\xd6\x1fI\x03\xb1\xda\xbf\xd0\xab\xaa\r\xef6\xe9?\t\xa0A\xcen\xee\xdd\xbf\xdb\xd0\x89\\\xf7\xcc\xbd?q\x11+\xd9\x98\xf2\xea\xbf\xa6\x9a\xb1\xbc\x17\x9c\xe2?\x98\xbf2H\xe9\x0c\xec\xbf\xae\xaa\xf46\xec>\xe9\xbf\xe0L\xa2\x7f\xc1\xac\xff\xbf0\xeb,\x05\xcf1\x00\xc0x\xa7\x0b|\xb5\x97\xff\xbf.\\\xed\x9aP\xee\xe9\xbfK\xb2\xbc}\x89\xf6\xba\xbf\xa4\xf7"\xae\x8c\x16\xf0\xbf\xbcqF!\x16m\xb5?\xa5f\x83ND\xbc\xf7?\x0c[\xab,\xfb\xd9\x01@\x8a)\xc6ahf\xfc?R,R\x87Ad\xf6?[\x86\xb3\xd7tM\xce?\x12D\x00s\xabZ\xd9\xbf\x16\'e\x1br\xfa\xf4?#\x85|\xdf\x8f{\xe8?\x81\xd2\x97gwc\xcd?\x0b\xfbuD\xaeW\xe7\xbf\xad\x98\x83wh\x8a\xfa?\x9e\xe8\x9c\xed8\xfb\xe8\xbf2Db\xe0e\x87\xd8?KrL\xdf+\xe9\xf9?\x9d?\x14\xf0\xb07\xcf\xbfG}AY\x18`\xb2?v\xa1\xedt\x84\x89\xed?N\xc7\x89\x0c@\x8f\xe5\xbf\xca\ty\x9f\xb6_\xd4?\x0c\xb6\xce\xf6\xd2\x0b\xe0?\xc1\x11\xfd\xa5\x07p\xf4\xbf\x8a\x8e\xe6\xbah1\xcb??\x8e]\xce1h\xf3?\x99\x82\xa6\x0c\x11\xab\xf6\xbf\x95s\x80L\xf47\xf5\xbfYe\x1a\xea\xc6\x1b\xdb\xbf\xb2mH\x8f(p\x05\xc0"\xe8@z\xc2\x81\x00\xc0c\x02E_0\x87\xfd?\xe6\x8aF\xc56\xc5\x01@\x9a\xf7\n$\xfd\xb1\xf1?R:\\2\x81\xfe\xd6?\xe6\x13\x95\x8f\x02e\xca?\x10\xf2\xf0}d\x8d\xc4\xbf{\xd9\x89\xb1\xc0Z\xf4?,\xca\xb2\x1b\xa9V\xc7\xbf\x8d\xdb\xd6\xe5{\xbd\xde\xbfYv\xcc0\x97\xc0\xd1?\x89\x93\'\xf4\xb6\xf2\x95?\xbf\x0bQ&\x93\xc1\xec?\xd9z\xbf\x85\rh\xd3?\xba\x19\x82\xc6\xbe\xb2\xdd?\xc0\xf4\x80\xb0\xde\xcd\xb9\xbf\x0f$\x9a\xc34\xc7\xd8?\xbe6_\xc6\xfe\x97\xf2\xbf\x9c\xef\xfe\x9e\x15\xf1p\xbfL\xecWb\xa5\n\xe6\xbfP\xcaK\\O\x96\xc5?\xdd?yW\x9f\xae\xf3?\xe1\xa86\xa7>v\xf8\xbf*V*\xea04\xe3\xbf\nE\xf33\xe6&\x04\xc0\xa2&\x80\x1c\xfav\x11\xc0\x98|\x9a\xf2\'\xde\xec\xbf\x97\xb98m\x13\xe4\xed\xbf\xbc\xd5\x15\xc8\xe6\xca\t\xc0g\x91\x0fWu\xcb\xf3?\xa2\xb3\x0c\xcfA\x11\xb8?\x83\xb4\xcaN6\x89\xa6?WzTh@\xf3\xe3\xbf\xe0-\xbdJ\x8fu\xe8?G\xe8\xae\x1f\x8e\'\xf5?\x9d\x89/-w\x19\xc3\xbf\xa1\xb2@\x18\xfd\xed\xc0\xbf\x80\x90\x1d\xe6\xb5\x96\xc9?\xb0\x05\xac\xd2\xd2\xab\xbf?\x8a\xa1s\xd9~\x17\xd7\xbf\t\xb6\xba"\x06\xe6\xf1?v\x83zE\xf5\x1d\xea\xbf\x91\xe0<\xd6\xe2\x1c\xca\xbfb[\xa0\x17\xba\x13\xd2\xbf9r\xe7\n|\xf0\xf3?\x19\x88\xe2\x89\x83\x05\xdc?\x8b?f\xa6\x04\xed\xd7?\x91\xa5V\x14k\xad\xd6\xbf\x91s(`\\\x88\xe4?h|u\x9el\xcd\xf8?\x89\xc4G\xb8\xcc\x8c\xe6\xbfwC\xbbPZ\xcf\xcf\xbf\xf2r\x99k\x04\\\xa3?\x10\x81\x7f\xdff\xf5\xf1?\x0cm\\\xe5hw\xcf\xbf]%\x85\xfcu\x8c\xe0\xbfI6\xc4\x15\x19n\xcc\xbfc\xbc8\x1b\xa2\xf4\xde?%-\x98c\x1b\xec\xd5?j\xbc?\x9d]\xc1\xe4?q\xc68\xd86\xbc\xe7\xbf1\xc5\xe0\xfa\xf4\x8d\xbf?\xf05\t\xf9Hd\xb9\xbf\xc00\xe8\x05\x86x\xde\xbf\xa9\xf4\xa3\t#J\xf3?8\x01\x1b\x05\xea\x10\xe2?\x03|o\x9a\xb9[\xe0?;\x82\xf7e\x81D\xf0\xbf\xa9P\xa8\x17\xe0T\xc5?<\xa6.\n\t\xfd\xe6?\xc0\xb7\xb7\xcb\\\xda\xe2?h\x07\x11\xf3\x18h\xbc?Z-\xb3[*\xe4\xd9\xbf\xe0\xa8\x12\x9b>(\xb0?\xd3w\xd3Xye\xf0?\xad\xb2\\J\xab!\xaa\xbf8g\xc3@j\x8e\xa6\xbf\xe3p}-yv\xf9\xbf|PT\x0c\xbc&\xba?\x8f\xe9\xc1AK\x05\xdf?\n$+\xec\xf2\x81\xd4?\xa3oU\x1d\x9d\xd8\xcd?D\x8d\xfc/\xb5\xcd\xf4\xbf[@\xe5\x0bk\x0b\xe7\xbf\xf1\x98L):\x01\xb8\xbfA\xcb\xdaU\x16T\xeb\xbf\xa9\xf8\xc3\x8b\xee\xf6\xae\xbf\xca\x91\x87\x11\xf3m\xed\xbf\xaa\xb3\xeb\x82\x8b\x15\xea?X\xbd\xce\x9dDu\xa1\xbf\x97P\x92\xc0\x90\x98\xf1?\x96v\x03\x108\xa0\xd9?:\xd4\x13\xf6[6\xc5\xbf\xa1\xcd\xee\x10\xe0k\xf7\xbf\xc0}\x83E\xf1\x9e\xdf?\xcc\x1e\x0fRl\xbe\xd1\xbfo\x7fD\x1eR\xfa\xc7\xbf\xd8l\x93\xd4\xfaX\xe0\xbf\x0eHt\x91\xb7\xe5\xdf\xbf\xe8\x7f$\xd9\xe5%\xe5\xbf\xf2\x80\x1a\xf1\xb9#\xd3?\x1c3+\x94\xf5\x96\xdb\xbf\xe3\xbb\x82\xd6\xe3\x17\xe8?X(\xb2\xea\xad\xcf\xf7?Y\xa66]\xd2\xac\xe6?\x90\xf0\x08\n`*\xb1?U\x93P\x94\x8e\xc2\x8c?\xe0\xbb_)\xef/\xf5?\x9d\xf6"\x06\x94:\xde?\x83\xd4\xf9(w\xc9\xe2?s\xa3\xd7\x1c\x1d\x9a\xed\xbf;\xb5\xffl\x81\x12\xd6?t\n\xc0!p<\xc6?\xc1\xc3\x83\x80\xf0\xb2\xe4\xbfW\xe61\x9e\x1af\xf0?\xeco\x82\xe1\xe4q\xd0?S\xac\r\xf1\xfaq\xec?\xbc4Wx\xbf\xec\xf6?=\x8cj=/Q\xe4?B\x0eL_\xde;\xf6\xbf\xba\x14\xa3\xbb.\x9f\xe9\xbftv\x98\x8eDm\xcc\xbf\xf6\xb2B\xf6\x05E\xe2?6%}t&\x82\xd1\xbfB\x8c\xda\xa9^\xf8\xcf\xbf-\xeb\x0cm\x88M\xd6\xbf\xab\xc8\x89\xdf%\xe9\xc2?{C\\u\x88\x00\xe7?\xea\xd0\xe0|\x1bf\xeb?\xc7G\xc6\xb2\x1da\xf5?\xff\xdd\xcbGo\x9c\xee?\xbf\xd0v\xdb\xbb\xd4\xe9?e\xf8\x88\xa9\xd3Y\xea?\xbb\x83V)\xa6\xdd\xec?\x98\x13\xc6\xbe\xf4y\xcf?.5\xd0\xb4\xff\xbb\xde\xbf.\x07\x81`\xbb\xef\xe0\xbfd\xdd?`rU\xd8\xbf\xd6SQ\xd59D\xe1\xbf\x86?5\xaaG\x9e\xdf?S%\x88\x9d\xe8\xe2\xd1\xbf\xf5&/\xea1\xda\xe6\xbf\xcc\xe9\xc4%^;\xe9\xbf\\\x8a\xef"\x9b(\xe0\xbf\xb6\x8f\xfc\x9f-\x8a\xe4?\x86q\xc34\xa8\x16\xa2?\xbb)a\xc1+o\xf1?\xac\xb8K\xff\xc1\x03\xf7?\x9cO.\x94N\xec\xed?G\xa6HI -\xfa\xbf|V\xdd\x14#$\xeb?\x7f\xa2\x8e\xdd\xc9\xb3\xfa?\xdc\xe4\x95\xd4\xb1?\x9e4\x8c\xb5\xfd\xca\xe0\xbf\x9d\x92t{j,\xbc\xbf\x84(\xa14/\xb0\xab?\x87\xff\x08\xe2\x9c\xce\xee?\xe2\xda\x00\x94g\xe7\xc7?3\xe7O\xebZ\xb3\xe7?\x02\xf1\x95\xb2\x1e\xe1\xc6?\xb5\xe9\xb1\xb7`"\xea?\x07\xdc\x10\x8aI\x1d\xea?\xd2\xf5\xbf\xc0\xb2\xe5\xde?k)h\x1f2w\xf5?\x93\xba\xc8x[\xc2\x10@\xa4%=\xa4\xa5<\xf6?\x1e\xef\x9cTLn\xfa?\xde\x06l\x046N\x06@\xc1 \r\x9a9\x96\xc3?\xcf\x14*\\E\xe3\xf8?X\xeb\x1f\xb0\x8c|\xf2?\xf2=\x1d\xcd\xac\x00\xfb? {,C{U\xf3?\xcd\xcbD\xe6OD\xe7?o\x0c\x11\xb8\rC\xc0?TT{\x16\xff\xe4\xb7\xbfi.\x98\xfa\xc8I\xe6?R\\\xf9+\xfb\x16\xdf?a\xeb\t0\xfb\xf7\xaa?\xfb\xaf\xee\xae\xb8U\xbf?\x94\x90\xdb\x05[\x97\xce?T\xd5\'\x1cD\x11\xb2\xbf\xdaj\xf3V\x9at\xf0?=Q\xf14\xd5\xba\xd5\xbf\xc0\xa9\xf3\x9c\x85\x1c\xc9\xbf\x02\x1b\xd4d\xae\xaf\xc5?=\xf2\xfa*\x8d\xee\xec?\x02!\t\xfa{|\xfa?\xc0\xe6"|2&\xd5\xbf\x04?z\xd85Z\xf4?+\xaf\xab\xc4\xb5\x12\xf7?\x8a\xe7B\xaf\xdd/\xe6?\x04=Q\x93\xbdY\xcb?{\xd8\xc7dv\xf9\x06@}\xbe\xdc\x05x{\xed\xbfxXY%b\xbc\xf1?\xbbb\r\xed]\xb8\xdc?n\xeb,,}\xc2\xf6?,T\xc6\xce\x11\x89\xe1?7\x05\x03Vk>\xf3?4a\x11:!\xca\xf8?\xea\xb1\xcc.\xa0W\xf5?\xe6\x02\xd5P\x85\xaf\xf8?\xa8\xcd\xacV\x056\xc1\xbfn"\x1cA\xf8\x19\xf0?\x0e\x19\xfb\xfav\xca\xe1?\xe3a\x91\x1f\x99J\xe9\xbf2\x8ea\x06\x8es\xd5\xbf(\x96\xd8\xa17\xc4\x85?\xc6M\x18\xc3\xf4\x16\xba\xbf\x0fJ/\xbbb\x03\xb1\xbf\xda\xb97\xdeov\xe9?\xc7\x9c\xb1\xff\x96\x8e\xa7\xbf\xad\xfa\xf8\xf7M\x0b\xf0?\xf3\x86\x00\xea\xcc]\xf8\xbf\xe7\x04g%J4\xec?S7\x9e~\xab=\xfa?\x81\xd6\x7f\xa4\xf3E\xdc?\xb1^\xbd\xd0{\x84\xb6?\x0e+\x19H\xf5v\xfb\xbf\xd5<\xa1*\xf8\xde\xf9\xbf\x1b~#\xba&\x06\xea\xbf\xa0\xbb\xc7\xb9\xebl\xe9?J\xef\x88\x00\xdc\xa6\xe8?Z\xb7|\x0f\x01\xf1\xe7?\'\'s\xc3\xf0Q\xff?\x04\xe2\xa6\xc5Q\xd1\xf3?\xdf\xc46\xd8\xc0$\xe9?\n\x93\x0f\xd4[\xa4\xec?\xd5\xde%\xa7\x94@\xec\xbf:\x02*\xd3Df\xc2?\xf4\x13\x16\x1eg\xa7\xf4\xbft\x8c\xb1\x99K\x8d\xd0?\x0fG\x1fL\xc6\x1a\xcb?\x86\xedK\xb9C\xf7\x9f?\x12\xe8\x1a\x9b\xb2_\xd4?\xf4\xc7vGE\xbc\xe8?\x1ck\xfd\x1a\x89\xc5\xa4?$:\x0e\x972{\xeb?\xb8\xbcrD\xbe\\\x01@M\xe3(d\x86\xb1\x02@\t\xf2\xaf\x17\rT\xc7?5*\x0b0.\xdd\xb6?\x04T\xee\xff\xbdW\xe7?\xa9\x18]Z\xe1\x1f\xdb\xbf\x04H$\x14B"\xe9\xbf\x0c\x8bp\xf6\xa0\x86\x9d?\xac#\xbf(\x83\x8d\xb5\xbf\xf4O\x8c\x17\'\x96\xc6\xbf\xdd\x89\x9c*\xf3\xcc\xda\xbf\xa6bc\x02\x7f\x82\xb2?\x8a=\xf0\xc15y\xb1?\x02\x14`\xc5\xdd\xe9\xbf\xbf\xd9^C*\x06\x19\xd7\xbf4*\xf2T\x83;\xb0??\xbf\xc4\x95\xec-\xe9\xbf\xe5\xdd\xf6\x87$3\x01@\x02\x00?*/H\xe6\xbf\xc6\xd3X)\xdd\x93\xf3\xbf\xb6d\xa4\xb4\xad.\xca?WG\xd35q[\xf8?\x1d1p\xc3\xec%\xdf?\xe2\x01z\x11\xeeI\xeb?\xde\r\xb0\xf1R\xdc\xdc?j\x10\xb6HhO\xf1\xbf<\xd5|\xa6ER\xd4?\x93\x87\xc2\xa7@\xc7\xa2?94\xdeL\x98\xa0\xf5?c\x90\xae\xc4\t\x82\xec?\xc0\x06\x98!\x7f\xdb\xe3\xbf\xfekw\xfd\xa8[\xfc?\x91\xe9\xc0\xfaSa\xd6?\xf2\xd4/\x9f\x97\xa3\xf4\xbf\x94\xa4\xba\xc3\r\xe5\xe1?,\x8cV\xc3\x19\x9c\xf3\xbf7\xf5\x18\x88.\x14\xe2\xbf\xa2\xbbO\xc1Gl\xc2?\xf8\xbc\xdb\x92\xa9\xfe\xd5\xbf^u\x86=\xa8\xb2\xf2?+\x9f\xef\xba\xcd@\xf4\xbfr!\xddK\xa5<\xf7\xbf\xf9\xb4a\x15p\xd5\xe3\xbf\x06\\;\xab\xb5[\xcc?\xffdi\x84\x04\xf6\xb9?\x0b\xa1m\xf1\xe5\xd2\xe7?\xc7\tsW\xa0~\xf1?\xe6)o\xeb=d\xf8\xbf\xff&\xcf\xb4\x9f\x85\xf9\xbf1\xf0\xca\xc2\xc7\xe6\xda\xbf\x84\x08h{YN\xb8?v\x9ac\xe8\x16h\xe9\xbf\xa1"a\x83\x83K\xd7\xbf\x0eV\xf7i\x80\x95\xf1?\xf3.\x85\xf9\x02\xe0\xf5?\xdf#!\xce\xe4\x0f\xf6?\xe7vCv\xdaf\xee\xbfR\xab\xfa]\xafk\xeb\xbfWP\xa3kT0\xbf?\xf91S\xc8\xbe\xf1\xf1\xbf\xd6\x1a\x8a\xd0yM\xc6\xbf\x083\xe4n\xeek\xd5\xbf\x11v[t\n\xac\xd1\xbf\xcb\xfe\x05\xdab<\xde?\xf4\x88k\x9c\xd1F\xd7?\x088\xae\xa5\xe5>\xe9?\x90\xb9\xdf\xe7\xfc\xa2\xf8\xbf\x02y\x03\x8d\x03\xfb\xed\xbf\xc0b\xb8\x9e\xd2)\xf1?\x98\xe2\x9d\xc2x\x88\xd0\xbf\x97m\xdb\xb1\x02S\xd4?=C\x7f\xa9\xca\xf6\xeb\xbf\x9b\xdf\xdf\xd7\xdaq\xaf\xbfbDA\xed_\xde\xe4?\xaa\xea\x15\x8bU3\xd9\xbf\x8c\xe5\x96\x87\xab;\xf6\xbf\xb7\xf5\xa1\xe0\x81\xac\xe2\xbfhq\xdc}\xac\x8d\xde\xbfI\xb04`C\xc4\xd4?\xd5(jR\xbb\x7f\xdb?\xa8Cd\x8a\x88\x95\xf4??\x7f\xac,\xc3\x9e\xe9\xbf;\xa4\x10\xb4\xa5\x96\xdf\xbf\xaa\x81\x1f \xb4+\xdd?\xa16e\xe9\xf3!\xf9?Dw\n\xc5.7\xfe\xbf\xb9\x1e\xf6\xf4W)\xc5\xbf\xadV\'x\x92\xda\xfe\xbf4\xb8\x11\xa5\xf1\xcd\xe8?R\xb7C9\x11\t\xc9\xbf\xbe\xca\xe7)V\xfb\xee\xbfF\xba\xed^\x14\xc4\xdb\xbf=\x85g\xe3\x9d\xc2\xd5\xbf\x90\x80\x1dz\x9e\t\xf5\xbfQ\xd4?\xac;=\xe9\xbf\xe1\xf8S\xdc=\xc6\xfd\xbfF\xcc\xc6)Q[\xf9\xbf\xe9\xe4[%j?\xe5\xbf\xa5N\x9c\xd4\xbf3\xd1\xa9\xa8\x86\xa3\xf0?}\x0c\xbb\xef\x9b\xe0\xd7?\xfcu\x81\xbd\xd5\xf9\xdd?x\xbej\x0c\xba\x88\xf6?\xa1\x93\x07\x9d\xc5\xbd\xd5?D\xf9}\xf5\t\x10\xf7?ht\xc0\xb42\xe0\xec?\xad\x0c\xb3\x0f\xc0U\xf1\xbf\x0c\xc4\x83N\x07o\xf4?R\xdf5\x02B&\xd2\xbfQ\x95+f\x84\x14\xde?-md,Bb\xe4\xbf\xb5\xe2\xecS9\xdf\xd0\xbf\xb3S\xea{:\xd2\xaa\xbf\x8a\xd5\xc8\x87Ln\xa2?\xf9l4\xeaF\xc1\xd8\xbf.\xca\xb9]I\x8d\xdc?\xc9\xccn\xea\xe3\x7f\xa7?/\xb2\xfdh\xf0<\xcd?\xdfQB\xb3Yd\xe1\xbfs]\xffs\xbd\x0b\xb1?G\xbb\xb0\xac\x83\xd3\xd0?\xc67\x7f\xdd~u\xfa\xbf\xa1c\x9c\xfb\x867\x00\xc0\xcd\\\x14<<\xd7\xed\xbf\x10\xc0\xddg\xcd\x84\xd3?\xa4{\xba5\x93>\xf2?\x86:\xe8Q\xab\xbc\xac?\xe1\xbblI\x016\xed\xbfn\xc8\x1ay)\xe2\xf1?\x9c\x12o\xdc\xaa\x88\xa7\xbf\xf8\xcc\xb6[~\xc0\xed?C\x0f\x1c\x90l\x1fd?\xb5My\x1d\xb4\x19\xf2?\xd9\x9e\x1af\xbe\xb4\xe1?/\xe3\xa2\xc3^\x17\x02\xc0\x03R\x134\xf1\xc7\xe6\xbf9\xf6\xdf\x9fjQ\xee\xbf,\xd7\xda\xfb7\xa7\xd1?W\x96\xeeH\'\xf9\xb1\xbfy\x06\x1dlN\x1f\xfd\xbf\xc4&\xd3:-\xe3\xd7?\xc4Wf\xb7\x1a\xd2\xf1?\x1c\xc6!V\x9dd\xe1?d\xf4\x8d\x00G\xc1\xcb\xbf=\xd4\x8b\xbf\x87E\xfc?\xc5\x08\x8d\xc6\xb8\x88\xd5?\x07\x8c\x88\xf26\x1e\xd4\xbfK7\xb6\x8d_\xdc\xf1?\x80\xb2\xed\x83\xcc\x01\xec\xbfl\x1b^F\xf9\x07\xb8?\x10\xd0h\x8b\xb5\xfb\xe6\xbfU"@\x7f9\x80\xe5?\x9dUh\xd8\xe8h\xc9?\x1b\\)W\xe5\xa5\xf2\xbfsN\xd8*\x03$\xf0?\x1d\xb0\x18#\x10\xfb\xc1\xbf 6\x0e{1\xa3\xff?W\xe2|DK\xf4\xc5\xbf/\xec\n\x953\xbb\xc7?\x86\xbd\x8d\xb1\x95\xcf\xd7\xbf\xc2\xf5$S\x08\xf0\xe8?\xd3\xa6\xcc\xde\xeef\xc1\xbf9[\xa8\x91\xeb\xa6\xee\xbf\xc2tC\x95\xa2W\x00\xc0\xf8\x05X\xa5\xfb7\xe4\xbf\xf6X\xd3@\x0c\xc7\xc1?*\x1b#j\x93\xb8\xdb?\xb5\xa1\xb2\xfbg\xa4\xe4?\xd1\xd6\x05\xe1\xa2\t\xeb?\xb8x\xf1Y\x0c\xe7\xc8\xbf\x8cvT\x97:x\xd7\xbf\x8f\xd2sB\x83\x8c\xff?\x8e\x87\x84u\x80\x1c\xec\xbf).\xa1rM\xc7\xc7\xbf\t\xcax\xd0h(\xf9\xbf\xc7\xae\x8eG\x16\x0e\xec\xbfB\x13\x1b\x9b\x18S\xd3\xbf\x85\xc2\xc3\x1bF\xda\xec\xbf\'\x1c?\x86\x8b\x92\xcb\xbfB\x04\xb5\xbe\x15\xb9\xe9?\xc3G\xe7\xba\xe5\x11\xe4\xbf\x0b\xdb\x9c\xd6\x05\x8e\xd1\xbf)\xcc\xe9\xab\xd5?\xc9?5\x85D\x8f\xae\x12\xe7?8b\xc9\x1b$\xdd\xe7\xbf2\xa2\x11^\x84\xe5\xd8\xbf\xa0^n+\xa8\r\xc0?S\x12\xe4\xd7\xd6X\xd2?\xdeE\xa5\xbd\x8b*\xee\xbfr\xe5\xf3\xe2\x16\x11\xcc?\xea\xbd\xd5\xe3g3\xf1?\x0e\x1cj\xf8F3\xbc\xbfJp\xfc\xba\xb1|\xda\xbf\x9f\xb1\x13\x0c\xd1\x8b\xeb?\xdbXb\xc1\x87\xfc\xdf\xbf\xf6\xcf\xc5\x90Z\xb8\xf0\xbf\x81\xfc%\x92\xcd(\xd8?\xc9\xd0\xbdb\x1d\xe4\xaa?\x03\x9c7\xfaE\xb6\xe4\xbf\x92<\x84M\x01\x8e\xbb\xbf\xc0\xb4\xcf\x9a\xbeH\xe5\xbf\xa4\x05\xb1\x01X\xfc\xd9\xbf\xae\xd2\xe5A\xae\xdd\xed?\xf4\x01tH\x11R\xf1?\x1a\xfe\x94=)%\xed\xbf\x95\x81\n\x83\xcb\xe1\x01@\xb2\xc2s\xd4E\x04\xf5?Zh\xe6\xdd\xb3@\xf6\xbf\x8b\xc5R}\x12\'\xf0\xbf\x86(\x02m\x91\xfd\xf5\xbfh\x1b\xf3P\x04\x8c\xfb\xbf[\x9dm\xeaT\xca\xc5?1\x00A-|\xc1\xcb?\xfaA_n\xd2D\xee?\xee7 s=r\xc4\xbf\xdfqk\xeaI1\xe2\xbf\xf3i\x93\xc6)S\xe2\xbf\xb8E\xf9\xe6Y\xf6\xe4?[f\xe3.\x1fp\xc4?+z\x9d#+\xef\xaf\xbf\xf6\r?\xc5-h\xa5?\xec\xc3i:\x02i\xea\xbf\xf0\xdc\xe3\xe4N\xdd\xe0?~I]se\xe8\xda?\x8cgV"\xf7r\xc5?T]\xd3\xb1s\xb3\xe0\xbf\xa5\xab\xda\xa0\xcd \xeb?\x9f\xd9\xac\xbb\xcfQ\xe7\xbfkM\xbe\x8bA\x06\xe7\xbf\x04\xab\x9c\x8c\x13\xb5\xec?\xee\xde\xa2M\xb0\xaa\xe0\xbfwj\x8d\xea>\x01\xd5\xbf\xfd\xe4\xe8e\x13\xcd\x97\xbf~\xafQ\\\xebi\xcb\xbf[ZD7\xcd$\xe2\xbf\x02\xfbk>/XW?/\xf3B,q\x94\xf8\xbfR\xaaC|qT\xd8\xbf3eR\x16u?\xd1\xbf^S\xd2\x94c\xa6\xd5\xbf\x89\xaa\xf4\xaf0;\xe6?(1\x8e\xeb\xc73\xec\xbf\x0f\x90\xa3f\x91\xd1\xdd?&\x1e\'\xab\x93\xe7\xf1\xbf\'$\x86j\x9eD\xfa?\x04<\x10\x8b\x1b<\xe2?\xed\x03C\xe3\xd0\x11\xf5?\\\xa0v\x85i\xba\xd8?\x0eD9\xf5\x98\x1f\xd4?E\x135l\x87\xc8\xc3?\xba\xaf\xe0\x18\xcc7\xc7?J\xdb\xa4\xac0\x1e\xe4\xbf\x83\x8a\xbd\x11g\xc7\xfb?\x13aOK x\xe9?\xc3\'\xfb\x0f\xa1\xec\xe6\xbf\x90\x8b}\xb9\x86\x9d\xb5\xbfW%\xf6\xaa\xf6\x9d\xd2\xbf\xa5S\xf8\xa3u\xdf\xdb\xbf\xb1\x83\xbb\xe9\xd49\xf8\xbf3\x17\xd5\x16\xb5B\xe1\xbfo\x9f2M\x1d\x0c\xeb\xbf\x1d\xa6\xea\xfc\xecy\xe6?/\x9f\x88\x9f\x107\xd1?\x9f\x9bp\xc0\xf8\xb7\xe5\xbf5B\xff\xe0\x0cd\x03\xc0\xfc\xf9a\xf4Ut\xd2\xbf\xe3v\xfalH\x18\xf1\xbf\xbf;3~\xf7\xb4\xb2\xbfsJ\xc5\x1fV\xda\xcb?\x8a\x9ew\xf3\xff7\x06@\xbd\xed\xa9\xce\xf3\x9c\xd6\xbf\xca:\x90B&\xbf\xfb\xbf\x88\x08AAL_\xf1\xbfJ\xf8\x14^di\xf7\xbf\xfdYz\x1e\xa6\xfd\xfb?A^\x81\xe9\x1b9\xce\xbf\x86\xcb\x0fE2L~?\x85\x84IO0&\xfa?\xf8\xdd\xb7\x9c{\x7f\xd7?\xc2\xb2D\x86\xa1\xaf\xe1?uB\x0fDA\x7f\xe7\xbf\xb1%\x18)\x91\x06\xd2?e\xf9\xbd8\xcd7\xe5?\xe6\x0c\x94\xbf\x04\xad\xf9?0\xc1\xa8\x07L\xd7\xf1\xbf\x1b\x81a\xa3\x7f*\xe6?\x8d\x90\xc2\x10\x00\xf6\xe0\xbfP\x92Q\xb4\xd9\x16\xba?\x95\xc6P\xe7\x12b\xbb?\x11O\xfbw\x86\xa7\xfb?\xfe\xd1\x1d\x9e4\xf7\xf0?f\xdc\x90_\x87t\xe6?\xfa|\xe4\x83)\xde\x98\xbfc\xce\xa4\x96\xba\x04\xf4?\xa4\xb5\x896\x97\xd3\xfa\xbfc\xe7\xe4e\xe5\xc5\x86\xbf\xee\x07(\x13\x191\xe0\xbf\xa3;@~:.\xe7?luY2b\x01\xe4?c\xc78\x9cnn\xf1\xbf\xdb\x98oA\\f\x03\xc0v\xafB\xc8\xfd\xa2\xe2\xbf\xfb\x05\xcb\xf5\x95\xeb\xe6?2V`r\xa4<\xce?t\xa6Y_yu\xe5?\xb7@\xc3u2\xab\xdf?\xb1/\x01\x16\xc5\xe6\xe5?RL\xdb\xe4\xa6\xe8\xee\xbf\x95\xaa\x86$\x16D\xd7?\xf9\xbd\xf1K\xed\x85\xac?\xa2\xdb\xcd\xc5a\xdf\xf2?\xfe\x0b\xbe\x89\xfb\xe6\xf0?p\x94\x8c\xcf@:\xf2?7R\xc84Y\xa1\xeb?,\xff\'\xb1v\xdc\xdf?\xf3\xa8\xc1\\\xcc\xdd\xe1?\xb6I\xf2V\x03\xb8\x00\xc06\x9f\xb2J\x16\xa9\xdc\xbf\xa1\xe8W$f9\xae\xbf)\x9e\x86\x8a\xbf\xd5\xeb?\xe0\x85\xef\xfd\x93T\xfc?W1\xfd\xee\xb2x\xe9?\xf0"E\xe4\xa5\xb8\x03@0\x05\xd2[\xfe\x96\xcf\xbf5\x08-\x08v\xc7\xa9?\x1e\x7fg\xed\x9d\xcd\xb8\xbf+ke\xb6\x0e\xf4\xf9\xbf\xe8\x1bs\x8d{\xca\xcc?\xe8G\x81\xfa{\xed\xd2?\x0b\xcd3\xdf\x8e\xf7\xee?\x19\x06\xe1PR\'\xd7?\x0c-\xdc\xcd(~\xf9?\xc0\x99\x07\xe1-\xca\xc5?b\xf7\x80E|N\xd4?\xdd\xc3t?<\x98\xb2?\xc1m\xb9\x0e\xce\xf4\xf6?^\x11B\xef\x10\xdd\xba\xbfL\x9f\xf9\x17#\x03\xd5\xbf\x82\xdbxnF\xf1\xdb\xbf\x02~e\xf6Q\x0c\xf1?\x7f\xca=ht\\\xf4?k$bFl\xae\xf2?d\x874\x14_\x1c\xea?9\xa4\xa7\x19`n\xd0?\xc7\x97V{^\x03\xef?\xdf\xd0\xc7\xc2\\N\xee?\x91\xe7\xd8\x1dh|\xed?`"\x86\xde\xb4\x97\xfc?:\xdd\x94hD%\x06@-\xcf\xdc\xa2<\x84\x00@\x1f89\x9c4\xa4\x05@t\xba\\&\xbf\xec\x02@{\xad\x99xq\xc9\xf0?J\xcb\xc6AF\xb3\xfa?\xa2\xcaL\xf9=\x88\xd0?\x1dK\xec-\xae\x81\xe0?\xca\xfe\xdf\x12\x8cH\xda\xbf\xb4\x1c\x90\xfeu\xfe\xe0?v\x8br\xd2\xda\xc7\xe4?~(\xd4\xe7|T\x94?P\x17XeB\xd0\x94?\xe9\xea\x90*\x01\x90\xe0\xbfn\x03g%\xffZ\xe7\xbf\x86\x01z1\xd3\xe8\xb1?Z\xc7\x15\xd1i$\xe5?y\xaf\xb5\'\x1dE\xec\xbf\xd1\xa8\xe5\x8dS`\xf4?,\xd6\xfb\x9d\xea-\xe6\xbfX\x1f\n&G\xd5\xf8?_\x9d\xc9\x1a\x9d\x83\xfd?\x0bz\x07a\xcc\xc0\xeb?\xd4i\xf5\x0cF\x10\xfd?\x131=\xdc\x0e\xcc\xdf?N\xf0=\x1a\x04\x11\xd5?\xe9\x97t\x03\xa6\x0e\xf6?\x92\xde\xf5,\xd6\xfe\x04@eW\xba\x90C\x86\xf5?\x16\x87\xd9\x87_\xfe\x03@\x99R\xe9\xfc\xc9\xad\x03@\x9f\xc0!\n\xcdt\x03@\xfd\x92\x0b\n6\xec\xf5?\xe5z"\xff\xe5\x7f\xef?M\xc3\xd3\xe6\xfb\xd6\xe9?\xcc\x96.\xcd\xbe$\xdb?\xe3z\x8dh\x04\xd1\xca\xbf\xbf\xed\x02P\t\x8b\xec\xbf\xc6\x84\xf6\xef6\x01\xd8?\x1a-\xeaG6\x18\xed\xbf(\xa5!l\x93s\xdb\xbf\x9b\x13G\x12\xe3\xdb\xf4\xbf\xcd\x03r\x0b\x03j\xf3\xbf\xe6\xb3\xdc\xc5\xc0>\xe3\xbf+\xabw\xc2z\xe3\xce\xbf\xef<\xf2j\x07>\xed\xbfB\x9b\x8a\x16\x8bX\xad?\x18z\x96\x96#P\xf2?v\xab\xba\xd94\\\xb9?\x97\x16GT\xd6X\xfd?\x95\xf9\xd6A\xeb\x9e\xff?\x15B\xb8\x02\xf9[\x05@C\x18m\x8b\x15!\xed?k&\x84MHP\x04@\xb5\t\xb3\x8cdE\xf4?\x8f4\xdb\x8c\xaf\xb1\xf1?\xd8\x82\xa9\xe73\x1f\xe6?\xb9\xc1tl\x02\x13\x9e\xbfU*F\xd2d3\xe1?\xdf\x1bYr\x86t\xdb?\xfd5$S\xf8\xfb\xf8?\xf1\x94\xc5A\x95\x98\xf9?\xfc\xbd\xc6\x07\x82\x94\xe1?)\xbd\x17\xd1;:\xda?\xca\x07R \xd7\x1a\xcb?\xe7\xdf\xde\xc7~\x94\xf1\xbfu\xc5\xbd\xb6\xd7A\xc6\xbf\x9d\xde\xde\xa1S\x1c\xee\xbf\x84\x9b\xa6\x895\xc6\xec\xbf\xecp\\\xcb\xa3\x16\xf2?VE\x0bY\xd9\xf4\xc9?\xd8f\x95\xf3^\x06\xd9\xbfj\x94\xfb\\\xee\x1f\xe8?^n&R\xb1`\xf2?\xcc\x03\xd7\xcd1E\xe0?\x07\x0b\x85\xa8 q\xd5?\rf\xad9\xd3\x9d\xf0?\xd9/\xd4\xf6?\xa9\xe8?>4\xb9\xfa\xf1,\xf1?\xc4"]\xfeT\xcc\xda?\x1a2\xdd\xe64D\xf8?qr\x86V\x8b\xb1\xf0?H\xaaVE\x1a%\xd3?&Z\xa5\xd7_&\xe0?a\x91\xb4As\xfe\xe9?\x91\xa9\xab\xf0\x9d\xf4\xf1?|\xbf\xfd\xc4R\x82\xba\xbf\t\xfc\xcb&\xaf"\xc7\xbf\xda\xaa\x17>\x84:\xf4?\x8crg\xf3 \x17\xd9?\xef\xce\x08\xa8\xdf\xf2\xf5?\xac\xde\xfd\x93hr\xfe?V\\\xea\x848\xbc\xee??\xd7\x954\xa3^\xd1\xbf\xb0\xc7\xf8\x06s\\\xd2?\xadf\xf0\x81\x81\xb2\xf0?M\xbd9\xaf|\xa9\xc1?W\xb4\x89\xe0ZK\xc5?UL\xcb\x06\xc1\xed\xea?Z\xc6\xd9\x80\xb88\xdc\xbf\r\xa1\xbd4\xe9m\xda\xbf\xab\xe2lL\xa8{\xdc\xbf\xa0v\xa3\xe6Tu\xce\xbf\xd03f\x1d\xb3\xb3\xea?\x93\xc2\xcd\xae<\x8f\xea?\x08N\x97\xa1\xb8)\xc0\xbf\x99\x9a\x9f\x97\xab\xba\xd3?&Nl#\x82\x1e\xd5?\x1c\x02\xf9XL|\xa4?S\x99b q{\xf0?\xbeK\xec\xa4\xf0q\xdb?\x0fe\xed\xc4\xc3\x17\xe7?\xfa\x97\xb8(\xcc\x81\xf0?\xe1\xf3\xb7\xf6H\xa7\xf2\xbf\x84\x18T\xa3\x86\x08\xd1\xbf\xaf4\xa6DQ\xe2\xde?\xb5\xec\x9f\xbc\xfb4\xe0?\xe2\xa2\xcdJ,\xa5\xee?b\xd2\xda\x03\x9d\x1c\xe2\xbf\xa6\x8c\x1c9\x8cC\xe2?\xe6vzZ\x1f\x83\xf1\xbf\x16\xce\xb8\x85\xf3\xde\xf0\xbf\xe7\x05tJ\xca\x04\xbc\xbf\xcc;\xdc\xec\xb2d\xaf?\x1b\x88Rc|2\xf3?\x97\xb2w\xdfl\x10\xdb?e\\\xfeN\xe0M\xde\xbf\t\xe7\x98\xf2\xd6\xe1\xde?\\\xef\xb2M\xc2/\xc8\xbf\x90\x16M\xb8\xbb\xc2\xca?@\x11l\x8a\x1f\xff\xc6\xbf$\x03\xad\x1dF\x96\xdc\xbf\x8d\x14\xc0\x89\x99b\xf2?)\xda\x9d\xb3\t\xdb\xd9?\xcd#\x1e\xd2k\xc4\xd2\xbf\x0e?h\xab\xd5\xd6\xe2\xbfj\x95"\x98\x01D\xca?\x83\x91X\xf8\x8a"\xcb\xbf\'\x95\xff\x8da5\xe5\xbf\x9f\x8a\xb0=\xce\x87\xf7\xbf\xf6Y\xa3\xe9\x9fe\xe8\xbf\xa0}\xad*\x8f{\xb8\xbf<\xec\x19\x92\xc2\xb5\xee?i\'\xb9p\xdd\xbc\xdd? T\xfdv\xd4\xff\xdd?q\x14C\xbe-\x88\xf2?\xf0T\xcc\x8c`\x95\xf5?%L\xf9xY\xfd\xd5?\xc5\x1am/\xb6R\xed\xbf\x9c>\xd2\xd1u\xf4\xd5?S&\x07\xbfK\'\xdd\xbf*w\x83\xef\x90\xd8\xcd?W\x8co_\x7f\r\xf4?\xb0v\xf8\xf9\x82h\xf1\xbf\r\x15|=\xfcL\xbb?\xe9Dd\xdd\x7f\x93\xe9?\xc0\xf7\xe80\xdf(\xe6?o\xd3\xaf\xf2\x1f\x9e\xe5?z3a\xb6\x0f\x90\xc8\xbf\x93\'\x98\xe6(\x16\xd4\xbfmD\x9dX\xf1\xf4\xd7?n\x9a\xef\xe0^\xc6\xd7\xbf\x8c\x1aE#\xdb8\xb1\xbf\xf4\'\x87\xd1\x1eM\xd9\xbfCFD\xc7\xee"\xc1?Y\x92\xe5\xc6i\x18\xf3?\xa6\xc6\x9b6\xd5\x1b\xd8\xbf\x95\xddP\xa0\xb8\xcb\xf5?-/d0N\x92\xda\xbf)SZFh\x90\xd2\xbf\x9ex\xb7\x85)\xf3\xf1?\x98\xd0\x12\xab\xb0S\xd4?\xf2lt\x15\xc7sl\xbfleX\xf3\xcb\xae\xb3\xbf\x1aO\xee\xe4\x1a4\xd7?H\xad\xd2y\xe9\x85\xea?i\xbb9\x8cq,\xf5\xbf\xba\xbc\x83[\xca\'\xf1\xbf\xc58\xaf7c\xa2\xc6\xbfr\xa58\xe0\xcb%\xf1\xbf\xbb\xe8\x07\xf83t\xdc?\xc6m\xc3#!Z\xe6\xbf\xd8\x11\n\x97:]\xd5\xbf\xb2\xc5u\x86\xeb\x8a\x02@a\xcf\x81T\xfe\xe7\xe9?1\xddZ\xda\xf5\\\xed?ff\x19\xfa\x81i\xe1\xbf\x0b\x163\xdaK\x8d\xe3\xbfr\x9f\x12\x81\x01\x84\xd8?\xe53\xa0\x97Uw\xd6\xbfn\xe7YAFO\xbe?\x13\x8cj\xc0|\xc6\xdc?y\xd4\xbc~\xed\x10\xee?8\x87Mj\xb0\xda\xe8\xbf9\xad\xe2\xb4L\x8b\xf3\xbf\x05{\xd8\x97\x16l\xbc?\xe5\xea\xba\x8ah\x89\xe3\xbf4n\xc2\x06\x94\xa0\xf4?\x0f\xa0/\xd5\xe0\xa9\xe3?\xa4\x85Os/R\xc7\xbf\x8f\x06r\xfa\xdc\xd1\xd5\xbf\x93O\x04?%.\xe6?\xa3\x91\xb9\\h\x83\xe6\xbf\x04\xe0\xf1\xd0\x98\x1b\xd8?\x89d\xe8?\xf8\xb6\x1b\xda\xba\x7f\xb5\xbf@\x82m\xbf\xe4\xc7\xea?k\xf5\xc2\x1b\x99\xcb\xd9?\r\xb3\x83\xf3\xe4T\xdf?(/.}\xad\x7f\xdc\xbf\x8a\xff-\xfc\x06\n\xf5\xbf\xea\xa7\x1f\nke\xf0\xbf\x15\x1bp\x91\xc7\x84\xc1\xbf\xa2^\x0f\x9b\xc4\x84\xf1?\xbcu\xc3T\x83~\xf5?\xc8\xed\xc3\xa2K\x81\t@\x00S\x99~O%\x15@N9_U\xb9v\x0e@\xd4iC\xf8b\xeb\x06@ur2D\x93^\x06@\x843?\xa7\x1a\x08\x07@\x16\x1a\xbcl,\xfe\xfe?\xcc\x11}\xef\xbfO\xef\xbfW\xd7k8F\xb6\x00@\x87\xbaU.\xfa\xa4\xa4?\xf6\xe2\x8e\x95?C\xf6\xbf\xbe\xeb\xf3<\x1a\x91\xb5\xbf0\x1e\xe69\x8b\x87\xcc\xbf>\x02]\xadq\xc0\xed\xbfa\xfc\xa0\xa9e`\xe4?\xae\xe5\xb4\xb9\xe8\xa5\xdf?\x8d\x91+\x876\x16\xa8\xbfw\xb88\x8c\xaet\xe8?\xac}Q\xec;\xb7\x00\xc0\xe9\xb4.\x98\x16\xa4\xee?\xeby \x00\xcd>\x9a?\x9f\xd3\xf1:\x10\\\xe7\xbf\x98u\x8dp~m\x90\xbf\xc7\x82\xef\xdc.\xb2\xe5?\x08fN?q\xb1\xf3?\xfe\xb8\x15\xd3\xd0\xb0\xda?\xdb\x8b\x91\x115}\xbe\xbf\xec.\x19\xe0\x98u\xeb?\x06\x07\xe7\xd3\x080\x03@\xf3w\xef\xc4\xa1W\xe6\xbf\xbe\xcb\x18\xc9\xbd\xef\xe5\xbf\x90\xfdf>\xad@\xf0?>6\xc2\xe5\x8d)\x00\xc0\x9cG\x98$\r\xa4\xfc\xbf\x99\x1c\xf6\xbc(\xd8\xf6\xbf\xb1~\r<\x84\xd5\xe0\xbf2\n\x8b\xce\x9e\x85\xea\xbf\xf0!\t\x80\xc7\x95\xfa\xbf\x83\xd3\xee\x8d{\xeb\xb3?lY\xa7\xfe&\xf3\xff\xbfp/\xb0m\x8a\x97\xe1\xbf\x88\x0cv\xe8\xdb\x19\xea?b6*\xd4\xb2\xd2\xe7\xbf\x01Si\xc7\x11\xd6\xd4?\x82\x98\xb2hU\x95\xfd?\xde\xce=\x0c!\xa2\xf0\xbf\xc5joN?\xb1\x01\xc0\xad;\xc13\xd0j\xd7?\xcf\x97\xac\xad\x93V\xd9?,\x13\xa1\xa3\'\xaf\xe7\xbf\xf3\x12\x8e\x15\x8d\xa8\xb8\xbf\xce\x96\xa9\xb8\xec\xfa\xe4\xbf\xce\xb1"x[\x1b\xdd\xbfxCm\xfel@\xf8\xbf\x98\x99\xf0\xb6x\x0e\xf5\xbfb\xed\xc7\x02\xcf\xb0\xfb\xbf/\x7f\'+\x93\x98\xed\xbf\x8b@\x1b\x7f\xc7\xa5\x03\x13\xb5?\xf5l\xd8\x96\xcax\xf0\xbf\xfe\n\xc0\xa6\xd9\x1f\xc8\xbfe\xfe\x97\x1d\x90\x12\xed?w\xca\xf6\xbaR\x12\xe0\xbf\x96\xfc;\xd0n\x9e\xc1?:J\x14\xb3\xbd\xa5\xcc\xbf\xc2\xa8\xf73\xdb+\xe7\xbf\x01 &+\xa4B\xfe\xbf\x1f\xda\x1c\xb3\xe9M\xfd\xbf\xb9\xc6]\x97\x00\xb4\xe6?\xf3\x03/\xdf\x87>\xfc\xbf\x84\x19=\xa8\xeb\x90\xf0\xbf1\x8a$]s\xba\xee?D\'\x1b\x92\xd9v\xc8?\xdbF).\x8b\x1b\x06\xc0\xf3QW2F\xbe\xd8\xbf\x98\x9be}\xf8\xc5\xfc\xbf\xa0\xae\xff\xd9\xce\xdc\xf3\xbf&"{\xbe`\xd4\xee\xbf\x0bx.\x1ft\xfe\xf1\xbfZ\x84\xe89\x8e6\x03\xc0\xa1O2\xa6;\x1b\x02\xc0\x86)\xbb\xeb{O\xea\xbf\xfe\x8c\x7f\x1bD\xe3\xea\xbf~\xb5\n\x9e\x14\xb4\xf8?2\x90E=\xae\xc9\xf2?\xc9\xe4\x93X\xfa\x12\x07@7v4\xba@@\xc9\xbf\xbb\xe8\xbe8$!\xb8\xbf\x8f\xb1\x17\xb9\xba\xdd\xea\xbf4\xb3\xa4\'\xf0\xe2\xc8\xbf\x01%(\x83\xde\x17\xe8\xbf\xb0\xf5\xd1\x89\xd0\x02\xd1\xbf\xda\x18U\x81\xd1\x87\xf0\xbf\xf7\x80|\xbe\xe8\x19\xfe\xbf\xab;\xb7\xdd\xbe>\xf8\xbf\x16\xca\xbe\x11\xe4\xfc\xb1?}\x11m\x08a\r\xc6\xbf\r\x84\x99\x1d\x18\xc1\x04\xc0\xe2\x17\xb5\xd1\t\xd1\xd7\xbf\x9bxXf\x9a\x93\xf2?a\xac\xb4\xfb\x19R\xd0?\xc1\xd0BO\x90b\xe0\xbf\xb3_I;\xa9\xec\x04\xc0].\xa9}\xb2o\xe2\xbf\xe565\xcc\xe4u\xd2\xbf\x88\xd3\x9br\xeb\x1f\xf0\xbf\xee\x01}\x89\x1c\x12\xf6\xbf\xef\xaf\x08L\xd9\xa4\xf5\xbf\xbd\xe1}\xf7\x0f\x95\xf2\xbf{\xacg\xcf\xd9b\xf9\xbf/\xbc2#\xd9\xda\xfe\xbf+\xa6\xe3\xc5\n\xde\xf1\xbf\x84\xb8qk\xc6\xbe\x0b\xc0s\xa3\xc2\xaf\xfaQ\xec\xbf\xf2\xb8\x93)\x878\xc4?p\xc5\x06\x0f\x9cY\xfc\xbf\x9e\xef\x86\xd1\xd63\xd9\xbfx\x93Q\xe1\xa0\x13\xb8?rX4\xa6Q\'\xbe\xbf\xf6\x81\xb1I&\'\xd8?\xcez\xc0\x89\xf3H\xf0\xbfW\xb2\xae\x06}\x84\x08\xc0\x86T\x05\xe9[J\xf8?:wv\xcf\x90\xb1\xf1?\x84\xcf\x03\x18,f\xe0?\xb0T\xcdsw\xb6\xdd?2\x84\xd4\xa7\xad\xd0\xbf\xbf\xe1,\xff\r\x8a\x8b\xf8\xbfa\xf28\x92#:\xfe?\x07\x11\x8d\xd6\xe90\xeb\xbf\xbf\x87\x88\xaeI\x80\xfb\xbfsw\xed\xc09\xea\xe0\xbf\xd3\xe2qP\x0fb\xb9?\xec<\xe62\xc4\xd6\x13\xc0\'\x93\xaf(\xc4R\xd8?\x10p^\xa1\xcd\x1e\x12\xc0`;7\xfe\xbb\x19\x13\xc0\xef\x05u\xa8\xf4y\x03\xc0m\x12\x9dc\x97\xc0\x07\xc0T\xc1\r\xea\xdc\x10\x03\xc0c\x88\x96\x9f\xd3q\x16\xc07W\x9b\x17\xd3\x16\x0f\xc0\xd1Y)tVv\xc1\xbf\xe1Z\xd3f\xb6g\xec\xbf\xe9\\Fj\xe5i\xfe\xbf\x02\r\xbf\xc4C\xf4\xe9\xbf\xc2\xc3q\xf0A\x0b\xf2\xbfr\x0cM\x83\xb6\xa5\xf3?Y\xf5\xe5\xa4\x80\xf9\xe0\xbf\x13|\xbb\x1b\x7f\xea\xe4\xbf\xbc\xc2S(oh\x01@\xfd\xb9\x83\x95\xe7\x8f\xeb\xbf\xb0V\x0f\xb7\xdf>\xc2?\x95\t\xa5}z\xf0\xf5\xbf%v\xdf N.\xe8\xbf\\\x0bOl\xee5\xcc\xbf\xfbXI1\xbd\x0f\xfb?(\x15\x0fY\x83\xa5\xf1?\x8e\x8f(=l\'\xb7\xbf3cKZ_n\x00\xc0\xbb \xa3\xfb\xe2\xc8\xfe\xbf\xc0~\x81\x10E\x15\xfa\xbf`\x10\x0co\x8d\x9c\x0b\xc0*\x8e^\xb7\xb5\xca\x0e\xc0\x07,\xf0\x7fo\t\t\xc0\t\x1dg\xb2\x9d\xc0\x06\xc0\xdf\xc8\xce\xfd\x11\n\x05\xc07\x13|$\xda\xe4\x02\xc0\xc2\x13\x9c\x9fl2\x10\xc0\xee\xbe\x1ap\x81\x80\x06\xc0\x02\xbf\x9f\x03&\xf4\xe3?\xb6f\xec\x9b\x02\x18\xb7?A1\xcd\xf92\xab\xe7?8Tv\xae\x12_\xf6\xbf\x19\x9cUS\xba"\xdc\xbf\xa9nGz\x1eK\xea?I^Q=\x1e\x06\xf2\xbf\x8ez\xde \x15k\xe4\xbfw|\x04\x00X&\xe9?\x0b\x0b\xbe\x04\xc3X\xef\xbfD@Y\xcb\xac=\xeb?\xcc`\x80\x1a\x81\x85\xc8?\xcfb\xa5mh(\xf3?v\xdf+Y\xe5\x10\xf5\xbf\xd9\xfbl\xee\xf31\xd3?H\x1d\xc1\xfe\xa1a\xee\xbf\x08\xe7P\xfa\xc6\x02\x85?\xcd\xd1OF\xa8\xdb\xee\xbf\xf1w[\xa7}\x08\xfb\xbf\xc5\xda\x17\xba\x9a\x01\xfb\xbfX\xf1\xd3\x0c\x83\xb0\x05\xc0\x9b\xc6\x19\xb5\xbaD\x04\xc0!\xdaK\x1f\xc3\xa2\x05\xc0\x14\xeb~\x12E\x0e\xef\xbfL\xcaQBc\x8c\x05\xc0\x91\x185\xfa\x88\x8a\x02\xc0\xbfx\xa9\xd6[\x9b\xf7?1\xa3x\x7f\xc9\xdc\x92\xbfzV\xcfN\x1e\xf9\xb4?y \x9eC\xd6\xeb\xbf,\x12\xe2\xc7\xe3N\xe2?X\n\xb4F\x82\x05\xe1?\xca\xe3\xa4\x8c\xc4\xd0\xc4?\xa1\xf2dX\x12F\xd7\xf4\xbf\xd2\xbf\x94\xd8\xd5\x86\xf3\xbfQ\xfb\xb6\xda\xae3\x00\xc0\'\x19f\x00\xd4\xf0\x00\xc0\xbb\x17\x84h\x0e\xc3\x04\xc0\xe21@\x0c\xf5*\x05\xc0\x8d\xd0e\x06n\xc7\xf1\xbfe\xc8\x80\xc1\xe2\xfa\t\xc0\x8f\xfa\xf0\xd4\xa6\xce\x01\xc0G7M<\x1b\xd4\xf2?\x1f\xc9jHD\x0f\xaf?(aZ\x1d\xee^\xa1?\x10\x12\xdc\xbb\x83\x03\xf5\xbf8\xfdg\xe9\xc2\xff\xba?\x1f\xef\x8d\xe7\x1c2\n\xc05\xeaK\x1d\xd5A\xd0?\xf0\xe6\xcd\xd0\xc7f\xc5?\x0f\xd4\xd4\xa7\xb6\x87\xb1\xbf\x9f\xd1\xa9\xb5\xbe\xf5\xfa\xbf9\x1a\xa9\x18\x9f\x13\xf5?\xeb\x12\xc5T\xd0o\xf0\xbf\xcf\x14\xe5md\x8b\xfb\xbf\xfd\xd2\xec\x84\xf3\xa8\x01@\rEi\xd57\xc9\xeb\xbf3\x8fU\xfe\xb9B\xe1\xbf\x8e\x8a\xea\xd8\x08\x8f\xea\xbf\xad\x9e&~\xcao\xe4?w\xd2\\[\x92\x01\x00\xc0w\xad\xd4\xf8\xcc~\x11\xc0\x9c#\x01>\xa3\t\xfc\xbfJ\xc5\x90\xec\xa3\r\xf7\xbfec\x8d\xf9\xf2V\n\xc0T!\x05Q5N\xff\xbf:G\x1e\xf2\x17B\x01\xc0]7\xf3y\xbb\xcd\xd9\xbfj\xf5}\xc9\xd7\x86\xe8\xbf\xb5\xbc\xd7{\xeb1\xeb?w\xb0\xfa\xa7iQ\xf9?\x85f\xb7$\xf3\xd8\x05\xc0:\xa04qp\x1a\xe0?i|\xbf\x02\x80?\xe3\xbf\xe1n\xc6\xbdy<\xb4\xbf\x060\x8e&\x06"\xe3?\xf3\\\xccK\xedN\x81?r"\x19\x80U$\xf5?Y\xf3\xbf\xa0\xc3\xb4\xd2?\xc5\xd5^\xb2\x03\xbd\xf5?\x9dp\xb6\x0eX3\x01@\xb5\x0c\x8e\x84d\x0f\xe6\xbf\x9b\x9b\x1f\xb5\x94\xea\xe2?+\x806#\x1b\x9f\xe5\xbf\xa11JZ`X\xe1\xbfsUB\xc5Z\\\xca?DK\x16\xb6ny\xfc?\xba\x99\xdd\xa3X\x9c\xfb?`]\xb7Y\\K\xfa\xbf\x16\xc8G\xf0W\x11\t\xc0e\xe0V\xd0\x0f\xf6\x07\xc0E\xdd"\xbc\\\x07\xeb\xbfx\x0bS\xab\xf1\x1f\xe6\xbf\x0e\nq\x04\x83+\xe0\xbfO\xd0\xf9\xdfc\xd0\xdd\xbf\xf8a\xc0\x06m\xe9\xf0?\x0c\xfe/C1g\xbf?\xfc\x0f\xcf\xd3\xd1\xcd\xe2\xbf\xa3smS\xa2\'\x02@\xd2\xf8\x08_\x16R\x9a?\xe8\xdan\xca\x1aY\xe2?\x91\xbe\xa4\x83{\x80\x01\xc0l\xa1\xdc="y\xe3\xbf\x1cj)\xba\x99z\xf4\xbf\xeefP\xfa\x88\xce\xf6\xbf_\x86\x14\x1d\xa2=\xfb?\xf8\xd2\xcf\xc0\xeaa\xde\xbf\x8f\xc7\x97\xa7UX\xcc?\xdc\xe0K\x1ek+\xf8\xbf\x83\xb0#\r\xdf&\xd3?\x03\xed`w\x83\xaf\xeb?&e\x1cA{\xdb\xd5\xbfu\xfa\xf8\xb1\xc5"\xf2\xbf\x93\xab\x8e\x07\xd2\xd1\xc9?;\x07,\xd5)\x88\xf2?\xc9tZ|\x05\xad\xd3\xbf\xc2\x928u\x16I\x0c\xc0q\xfc|\x1c\x7f\x06\x02\xc0\x83u=\xf7\x12%\xb1\xbf\x84z\\\x9a\xf2\xd1\xec?\xc0\xb2&H>\xf4\xcf?\x85P\x8a\x82\xe1\x1f\xd6?\xeaj\x8d\xaa`\xbd\xed\xbf.p\xad\xb4\xccE\xd3?\x05@\xbc3\xbf{\xfc?B|s%\xb4\xac\xfd?\xf7\xfa\xb0\xa1\xb3K\r@\x0e\xd15Ri\x8b\xf8\xbf\x94\x0ca\'j\xb6\xe8\xbftk\x82\x1d+:\xd3\xbf\xc3k\xed\x92\xc2O\xea\xbf\xc8/\x06\xd2s\x01\xc2\xbf"\xee\xf0\xb7V\x8b\xe1\xbf\xdbH\x95vpH\xc7\xbf,\xb8\x9b(?\x1b\xf4?\n\xfe\x8e\xe7\xd4\xf7\xef?\x83*\xd9\xa6\xaf\xb0\xd8\xbf\xb0.)+\x81 \xe7?\xd6\x7f\x86r"\x11\xde?\xbe\xe4c\x88\xfc\xf2\xc4?\xea\xa1;g\x9d\xa5\xb3\xbf\xf6\x1d\x1d\xf8\xa9\x1c\xfa\xbfLG}\'H+\xe6\xbfe\xbc\x15\x8e!+\xf8?50"4_]\xf8\xbf\xee&!\xdbZ\x92\xe0\xbf\xd7X\xa6\x9e\xc3\x13\xf3?\xc2~(_\xdb\xd6\x00\xc0\x0c\xd4\xcf\x98^\xc9\n\xc0V\x17\xa2\'\x07\xae\xf8?z\x87\xbc\xee\xff\xbc\xe1?\x19a\x1c\xa7\xc7@\xe0\xbf\xce\x00\xd4U\xc2\xcc\xdf\xbf\x0f26\x04\xaf\xe4\x0b@\x14\xffpO\xd4\x98\x00@\x8d\xb7q\x95\x15\xc5\x01@\xda\x19\xbbx~j\xe6?8)\x15lR\xfa\x00\xc0C\x9a.\x04\x0e;\xc3\xbf\xbb}\x12\xb9\x91x\xfc?\xbd\xa2$\x0bw\xf6\xf4?\x14o\x00\x18\xe9\xec\xf4\xbffM)U\xab\x7f\xde?}\xc6\x81\xe0\x84\xd8\xe8?\x08T&\xab\xa0\xa6\xd5\xbf)\xf3Vx\xf5\x9a\x0c@[\xb1\x06KC\xb3\xe3?\xd4\x9c\x143nX\xe9\xbf\x92Oq\xd5\x92\xd5\xc1?A\x82mK\x17\x8c\xd4?\x887\xb0\xe5i\xf0\xe1?\x80-\x7f\xfbu2\xe8?L\x91\x80\xbc\xe0\xb8\xc1?\x1e\xee/\x1d\x027\x03\xc0\x83\x07\xd6\x0b=,\xef?\xc7\xb9\xc1\x96\\\xe4\xf1?\x8f\x96N\xae\x16\xb8\xea?\xd9[\x8di\xac%\xcf?\x99!\xcb\x05\xea,\x06@Q\x96\xbd\xfa\x9a\x7f\xe5\xbf\xa9\xefD\xae\x15D\xd3\xbf\xe1J\xb19t\x08\xd5\xbfH\xba\xe9\x1d\x16\\\x00@\xb7\\\x81\x11\xf0\xc7\xf7?\x10\x9aI;\xef\xbb\xf9\xbf\xa1\x1c\t\xed>M\xd6\xbf\xed?\x86j\xcd\xef\xf4\xbf\xde\xeeh\x9a\xf8\xff\xd7?zUM\x8d\xc9W\xfb?h\x17\xaee\x90\x8e\xcb\xbfN6\xbe\xb7\xa3\x1e\xf4?\xe8d\xf5\'\xbd{\xb5\xbfeLZ3\xae\xcc?\x8bX\xbf\x96[\xd6\x01@3\xb7\xd4\xf2\x92\x07\xdb?\x0b\x81^\x1eJ\x82\xf7?\xf1\xf9\xbd\x88\xeaM\xeb\xbf\xdal\xf3\x85 {\x03@Z\xb8\xec\x0cO\x81\xf5?\x89\x1a\x0b\x80m\x98\xf3?|\xd8\xd6\xcb\x9c7\xfc?\xdc\x14\xab\xc3\xb5\xf0\x98?\x04e\xe2\xa2\xcc\xe1\x02@\xe8l+\xe4\xf9\x81\xf4?\xc0\xcb\x93\xc0+\xf6\xec?nP\xc4\x1c\xe1\xc1\xc7\xbf\x85\xcex\xfd\xc0\x9b\xea\xbf\xe0)\x99\x17\x9e\xc9\xf7?\x84\x86\xf4q\xc2\xda\xd3?\xa0;\xc9\x96d]\xfe?!\x06.j\xb2\x91\xfe?\xf7\xb8\xe4\xd3\x0b6\xdc\xbf\xf9\x9b\xad.&\x84\xfc?\x1d8e%\xa7E\xe6?\x95\x0b\x06\xf8LG\x98?\xb8\xb8d`\x0b \xe2?\xc1Y\x0f\xe7\x04\x1f\xf9\xbf\xd7p%!\xecI\xa5\xbf\x01\x1b\xf3\x17>\t\xf8?\xfc\xbdR\n7&\xf4?\xcc@(?\xcb[\xdb?\xda\x9a\xedD\xbb\xae\xfa\xbfP\xa6O(\n"\x0e@\xd9l\xb8\xd8\xe1\xb5\xe1?{f\x9f\xa52\xe3\x15@\x9a\xce\xc2\xf0eJ\x0b@\xba\xaf\x84%\x1eA\xf4?5`W\x83\xfa[\xe2\xbf\xd0\xb9\xad\xc5js\x0c@)*\x9fd\xb0\x81\xfe?#\x8e\xa2\xfc&\xc7\x01@\\}\xca\xf7\xa1\xe8\xab\xbfal{x\xd8\xe5\xfd?\x1e\x1f\xbf\xe1h\xf9\xf9?\xfe\t|\x92\xe56\xc9\xbf%\\\x9e\x98\xfe\x07\xf7\xbfxu:\x88\x9a\x97\xf2?\x07|\x18\xf4\xf9|\x00@\x0e\xeb\x00\x05j\xcf\xf6?o\xb2\x88-\x84\xad\xf6\xbf\xfa\x1c\xf5\xed\xe2Z\xe5\xbf\xb2\x80\x1ba\xdau\xd3?\xf6i;\xd0\xe6\xae\xe2\xbf\x13Fh\xe3\xbf\x1da\xbf\tv\\<\xfc\xa9\xc6\xbf\x9fe\xc9\x17O\xf9\x03@\xd7%k\x12\xf0_\x10@\xd8\xd5\x8cs\xbf\xc2\xf8?G\x197=\xe7\x85\x05@\x1e\x0c\x16U\x87\x9a\x0c@\x11u\xe6\x94~\xfb\x04@\xd4n \x95 \xb7\xe3?M}*\xbe,+\x0e@\xad\xe0\xea\x1c\xf8\xb9\xdf?\';\x1f\xb2ll\xf7?QG\xec<\x80P\xd5\xbf\x8c1#\xb9\xfd}\xd1\xbf3\xc2e\x055\xb9\xf8?w\x9a\x1f\xafv2\xd7?n/#WB$\xd6\xbfg\x1cE`\xe4}\xf6?W\xe2\xf6\xd9\xc6\xa2\x92\xbf?\xf6*\x925\x99\xe7?\x12\xac\x8d\xd4|\xf9\xfa?X\xad\x7f\xcc\xaf\x97\xfd?\xbd>\xa0\x80C\xf5\xee?\x81\xfb\xc1\x06\xfb\xe9\xf7?\xca\x81%\x80\x1av\xfe?\x92\xa8j\xcc\x1e\xd2\xe3\xbf\x11\xf5\xe8\x0bs;\xb8\xbf\x94?\x96\x10\x89\x04\xe2\xbf2\xc8\x1b\xfb\xad\x87\xf0\xbf]\xce\xf8!3\n\xef?\xf1<]W\x97B\xd0\xbfJ\xa8le\xc8\x97\xf0\xbfV\x11\x00\x82t\xe6\xce?\xcf\x00\x17e8\x07\xf3?\xd8\xfe6\xa6Cc\xf9?\xcd\xaa\xbf\xc0Y\xbd\xfe?\x9b\x95#i\xaf\x95\xfd?E\x18i\xe2?\xd5\xf1?\x08F@\\\xe3\xfa\xfc?8\xc3\xfa\xaa\xc4\xe7\x04@\xf3\x80V\x0cS\xbc\x03@\xc0\n\xf6\xf4\xc8<\xe3\xbf\x00\x1a]:\xb9\xbe\xc1\xbf\x08\xc9\xb5\xb0\xf0\x8d\x03@=F\xc6\xe9\x90\xb5\x03@\x83\xb9\x9d4eS\xf4?\xedV\xb5pwQ\xf2?\xa1\xc3\xde\xf0X7\xd0\xbf\xbd\x0e)\xe0eb\xfd?\xad[3\xce\xc6}\x04@\xd7\x95\xa2\xbc\xd2e\xe1?\xedc\xd0\xf1.\x06\xc3\xbf\xbb\x98\xf1q\x0f\xb4\xec?\xf0\x06\x99~\xf2Z\xe2\xbf\xfc\x9d^\x19e\xe4\xd7\xbf\x03\xa67\x8bsD\xf2?\xb6\x99\xb8\xbb\x06\xb0\xda?\xa0\xf8\x92\xb8\xef!\xe5\xbfEE4\xfb\x0e\xeb\x00@\xd9Y}3\x92\xa0\x11@\xb2\xe5\x1e\x16\xcb-\xe0\xbf\xafS@w\xa2@\xc6\xbf\xbb\xc0\xc0B\x96e\xf0\xbf\r\xa1^\xc1\xbcF\xf1?b\xbaP\xef\x03\xee\xf6?N;\xc4\xad\xb2\xd5\xe2?C\x12\xb5\x8a\tL\xf0?\t\x8b\x99\xe6\xffE\xd9?\xa0(P\xb4A|\xec?\x0bM\x07\x9a\x01m\xfa?\xb5UX\n3\xe5\xbc\xbf\xaeA\x18\xd2\xca\xb5\x05@\xa8T\xf2`\x92\xfb\xe4\xbf\xa3_\xa8V9\xab\xa8\xbf\x82\xf4c\x19\xc4\xd0\x0b@\x11\xc8\xfb\x1f\x15\x02\xed?\xe5\xe7\x0c\x17\x96\x06\xf3\xbfz\xe7\xbd\xa2\xd7\x15\xee?W\x0f4X\xdb^\xd7\xbf\xe0\\\x83\xae]\x83\xfd?\x18d\xe2\xa29\x02\xe0\xbf\x0e3\x07i{\xe7v\xbf\xaf\x16\x0c\x882\xc3\xb5?o7\xbb\x02\xd7\t\xe1\xbf:\x10\xbf\'\xecW\xed\xbf\xb8\xda\xec\xe4\xbc4\xd7\xbf\x0e_\xa7\xa6P\x10\x9b\xbf\xc4\x9b\xde\xc7\x96D\xf4?\xe6\xb5\x12\xd9\xb1\x95\xfd?\x9ed\xe4a\xf7~\xcf?!\xeb]\x87\x95\xc3\xe0\xbf\xf6\xddq\xe0r\xa9\xd8? \xa5\x07>S\t\xe0\xbfB$\xb1\xc1\xd9`\xf9\xbf\xf4\xb4\xa1\xb9\x80\xa5\xec\xbf\xc0S\x87\x97\x90\x87\xe8\xbf\'\xb1\xee=\x08p\xd4?r\xddsB[\xdb\xf3?\xa7yldQ\x9f\xf1\xbfc\t\x11,g\x98\r\xc0\x17\xd3\r\x81=J\xf7\xbf,\xc5\xbd+\xa2x\xc1?\xee\xd0\x10\xfd\x13\x05\xc5?\xad\xf5\n8ZK\xf9?\xd2S\xe9\xa7uQ\xd2\xbf\xf5\\\xdf\x8a\'\x1d\xd8\xbf\xebC\xb3\x06E\xd4\xd5\xbf\xf3\x9c\xe9\x87\x83\r\xe0?\xedb5a\x85\x16\xcb?2[\xf7\xb2\xb9\x14\xd0\xbf\xdc\xef\xe1\xf5\x15\xfe\xeb?\x83\xdd\x88\xc3\xed\x8c\xf1\xbf\x8d-\x1c\x00\x86\xff\xdc?\xb5\xe4\x7f\xeb\xde8\xde?\xcf\x0b\xd0\x06\x05l\xd6?\x99$\xb4\'\x11`\xee?\xd12~{r\xf8\x03@qp\xc2y\x92e\xd5?\xd4\xd2\xe2(\x9d=\xf8\xbf\x00\xf4\x98\xe0xz\xda\xbf\xad\xe4\x9d\t\xa9\xe7\xec?r\xb6\xe2Y\xf1\xd7\xfe\xbf,6i\xa8`\x80\xe5\xbf\xf7z\xd2\xea\xbb\xc3\x0c\xc0\xab\xda\xfc+\xc7O\x03\xc0\x1cp\xfb\x1d\xba\xdd\xdf\xbf\xc1PS\x8f\xc0_\xb4\xbf\x073\xa9\xceR-\x02\xc0&|hU\xb8K\xf4?\x9c@\\\x82\xe4Y\xee\xbf@\x9f8\xd4UF\xf0\xbf\xb6\xd1\xbdC\xf8\xdc\xf7?\xa5\xf9\xf8I~\xe9\xe0\xbf`R\xb5\xbe\xe6\x10\xe6?<\xdb\x87C\x99\x10\xf6?\xc9\xca~\xc5\x1e\x88\xb6\xbf\x12\x12\xcc\xfeIA\xc8?\xe9u\xfa\x9fr\xe1\xdd\xbf\x87\t[\xe4\xb8\x96\xd7?%\xff\x83\x0e}\x10\xed?a\xda;\tg;\xc3?\x0f\xa0X\x9a%\xf9\xeb?R9N\xfd\\\x11\xfb\xbf\xc1\xc5\xba{B\xcc\xf2?\x8e\xa7\xa1\x16\r\x91\xec\xbf{\xdcO\xf5)\xba\xf2\xbf\r\xff\xde\x8e\x1a\x8e\xf0\xbf\x9dib\x84m\xd8\xfb\xbf>\x0c\xd5\x0fay\xed\xbf\xaf\xb8*\xfc\xc7o\xf9\xbf\xfe\x8b\xcd\x98\xeb\xb7\xe9?T\xea{\xbd\x10q\x05\xc0\xachi\x15\x88.\xf6\xbf\xb5T\xff^\xb3\x9a\x07\xc0\xa2\x85\xbc\x13\xd7e\x03\xc0\xd7&S\x9c}\xd4\xf3\xbf\xa4\xb2\xae/^\x1a\x01\xc0\xe9\x08\x04\x9ez\xc6\x04\xc0!\xe1\xa4)\xf9\xd1\xe9\xbf;\x1f\xb2\xff\xcbO\xe3?|\x9f\x96\xc7\x0b\xcb\xa5?\x8a~\x93qjA\xdb?\xb16\xa4B=U\x03@\xb0z\xb4a>\x93\xab\xbfP\xfb\xa6y4M\xa8?\xd3\x05x\x9d\xbf\xb8\xf1?4\xca\x1f\xee\xea\n\xcd?>d\x0c\xbb#P\xb2?MEQ\'\x0ff\xe1\xbf\xf1\xf2\xabRW\x9d\x96?L\xa8\xe2\xfdT\xac\xe7\xbf\xeby%\xab\x99A\xc9?D1\xe6\xa8\xa8\x85\xd0?\xbbq\xef\xd7\xbf\x81\xce\xbf\xc2#\x83\xb9B\x00\xfc?\xc3\xd92\xd0\xf7~\xe6\xbfF\xd0\xd8~/v\xf1\xbf\x87\xbb\xc0\xce\xd1u\xc6?\x06\x80 \xb3k\xe1\xea\xbf\x93\x91\xb2\'\xe2%\xf1\xbfr\xdeA\x14\x97\xeb\xcb?\xac6\xd7\xfc|\xce\xf1?\xd5\x84\x9b{\xdc\x9c\xe4\xbfYP\x85\x86\xc8>\xd8\xbf7\x014yJ\x11\xdb\xbf\x98\x9a{\xd3\x91\xe0\xec\xbf5"r-Ik\x98\xbf\x82TC?\x7f@\xe5?\x98l\xb4\x98\x9a2\xf2\xbf\xcb\x10JoH)\xd5\xbf\xd2\x9a\xf8\x85\x11\xe5\xd1?\xde5\x1fW\xc4l\xd8\xbf\xf8\xc1\xd5\xb0\xa1o\xb2\xbf\xc4l\xc4h\xc7\xfa\xc3?\xe0\x1f>/o\xf7\xd6?Gr^\x17\x83\xd1\xd2?\xf3\xd7\xc4\xd8XL\xb3\xbf\xdc\x96\xdd[?\x03\xb4\xbf#\x11\x8d\x8a\x03\xdb\xe6?\xc9\xe2\xb6\xa7\x19\xcb\xdc\xbfE\x14lz\xcb\\\xe6?\xcarY\x9b\x91\xc8\xe4?\x03\xc5T\xd1\x82\r\xe2\xbfN\x99\xcc\t\xe0e\xf1\xbf\xe5Ar\xb0_\xcc\xe6?^\xc3\x8a\x91\xf8\xa9\xa7\xbf\x85,\x19i\x1es\xc8?i\x84\x92\xb8\n\xe7\xb0\xbf\x1aZ\xeb\xca\x08\xec\xce?qF\xd9\x15)\xc7\xac\xbf\xe6K\xb9\x13\t\xa1\xdb?%l0\x10\x1d\xdf\xcb\xbfDkyn\xe9\x92\xe1?\xa0\xc7\xb5\xd1\xd3$\xe2?\x9b\xf0\x04\x1db\xde\xd9?S \xb01u\x90\xe8?\x80\xb8\xc6\xb0\xe6O\xf2?\xcb1\x17\xa4L\x8b\xeb?2\xa2q\x15 \xad\xcc\xbf\x03p\xd6\xfa\xd3\xa0\xad\xbf\xc9\xe9\xdd\xf9$\x80\xda\xbf\xff\xebt\xde\x01\xb3X\xbf\x93%\xe9#\t\xc5\xe9\xbfv)\x95\n \x14\xe5?\xb1\x0b\xc6\xee\xb0$\xe3\xbf#``\xfe\x0cq\xb4\xbf\xa0<\xfa\xde}\xaa\xf5?o\xda\xc2\x01\r\xf9\xd6?\x0e\xab\x163\x14]\xd1\xbf\xb0q>\xff\x014\xe8\xbfX\xa1r\x98\x95s\xe0\xbf\xb8\x8a\xd6$\x051\xf5\xbf\x84p\xd7.\xb4\xb3\xf6?\x11\xa1K\x16\xa4X\xf3\xbf\x02~\xc2\x12A\x81\xbf\xbfW\xcc\xc9UQ\xdb\xe0?\xdf\xeb\xe4\xc2\xa5F\xf8\xbf\xa3$Iw\xf6\xe2\xe3?\x01\x19\x7f\xac\xd7\x97\xe2?\xec\xcfH5\xc4e\xf0?d\x84?\xb5O`\xe3\xbf;\x1d\x96xuo\xd0\xbf\x90\xab\'\x81\x1f\xc8\xef\xbf\xae~V\xf8\x08\xef\xeb?2\x04j<\xb9\x0f\xed?~c[\xb2\x11\xa6\xe0\xbf\xab\xe73\xe3\x9a\xef\xcb?\xe7\x1b\\\x06\x04\xcd\xde?N\xcf|\xd6\xafj\xd2\xbf\x14\xa7`\x94\x15n\xf1?k\x81\x01\x89\x86\x82\xf7\xbf\x9ds\xe4\xe9\x81\xa8\xfb?\x07:\x90R\x8a\x19\xa5\xbfTQ\x0fB\x8eI\x93\xbf\xb9(\x1fk\x8a1\xf2\xbfo21aZ\x8d\xf2\xbf\xb86\xaa\xe3ze\xd8?a\x14\x83\xe9s\x04\xe7?\xcd\xc9\x0cV\xe4\xde\xe4\xbf\xd3M\xde\xad\xd3\x05\xeb\xbf=\x1b\x0f\xf2\xdb\xce\xe9\xbf\xb6\x82u\xaa\xf5\xa4\xc9\xbf\xb5\x8f\x9c\x86R\x9f\xea?\xc0\xa73kh6\xd6?\xdf\x1e"\xca\xac\x8e\xc9?<\x1d\xd5\x18g\x18\xe7\xbf="\x81:N\xdd\xed\xbf\xfd)\x85\x96\xee\x05\xe8?n\x1b\x80J\x16\xd4\xdd\xbf\x97\x1a\xd4\x07\x19r\xce?3\x13\x0e\xe2h\xec\xd6\xbf\x95\xbdHVa\xc7\xd1\xbf\xe0\xe13\xd3I+\xd5\xbfa\x00\x03\xc9\xd9\xf4\xf3?A\x8a\x16\xfaS\x1f\xe3\xbf\x06\xdf\xee\xba\xc0\x0b\xc5\xbfV\xd0o|vz\xfa\xbfc\xc4\xdfw\xe1\xfd\xdb\xbf1\x01Na\xe7\xc5\xe0?+\xe2\xaf\xe8\xa0:\xbe\xbf^M\xeb\xafX\xcf\xcd?\xd4\xef\xb2<\xae\xb1\xea\xbf\x89L.\xf9a4\xf9\xbf\x0c\x9a\xd8\x94\x017\xd2?$Y\n\x95\xe62\xd2\xbf&\x1f\xf787\xff\xf9\xbf\xdby\x0e\x13\xb7)\xe0\xbfn\xa6\x12U8\xff\xb2\xbf\xb6\xf0\x0b]:\xdb\xe3\xbf\x1d\xa9,\x9dJ_\xf4\xbf\x90&w\x86\xf37\xd3?@\xca\xa5\x9b1=\xf7\xbf\\U\x8a\x0b\x8e\xe3\xd6\xbf1!^\xe3\x03\x1e\x01\xc0\x13\\gwA\x05\xf5\xbfg\xe7\xeb#\x12\xc6\xec\xbfk\x94X\xc8\xcc\x07\xfc\xbf\xac:\xe8y\x87\x1d\xe1\xbf\x93Gz\xa3W{\xe9\xbf\xc3\x05-\x88\xf6L\xf7\xbf\xa8\x1b\xa1\x1b\x04\xe6\xaa?\xa0aC\xa4\x18\xdc\xfb\xbf\xa3\x8c\xf5-t\x7f\xda?\x85\xd7\xae\xc0\x04v\xd9\xbf\xb77\xb88\xd8\x19\xf4\xbf\xf8\x9dW\xdcJ\xac\xf9\xbf\xfd\xca\xfe,S\'\xe9\xbf\xfe\x1dd\xecf?\xf2?\xab><4\xb5\xa7\xa2?\x06\xf4\xdb\xf2\xec\x8d\xe1?~9\x94\xe4\xf7\xc7\xd7?F\x18\x98\xc3|\xbf\xf3\xbfu\x88\xbc\xbf\xa1\xdc\xd4\xbf\xbboEO\xf9\xf4\xbd?R8uFs\xd6\xfd\xbf\xc1\xac\xe4\xfaY\xd4\xdd?\xb7\xd6\x85~\x8f\x0b\xd2\xbfp\xee&\xae\x8b\xa7\xef?\xbc\xf1\x97\x8e\xa5\x98\x02@\x01\xde\xd0"\x17\xf3\xec?\xa2\x08W\xb1|?\xc9\xbfDeEd$\x1e\xf4?2/\xb0\xf0\xadR\xd9\xbf&\x9b$\xf2\xb6[\xe2?\xf1\x9e\xd6\xfa\xa5\x1a\x01\xc0\xcbU\xb9[\x8c\xa4\xfa\xbfi)p\x88\x88\xe5\xd2?"8\xe5\xb4@B\xf5\xbf(\x1e\xbb\xb2Jr\xe4?b{I"xb\xf1?\x1e\x0b\xf3\x12^\xd1\xc1?\xeaR\x9f\x911\x83\xe7?:\xf7\x0c\xf5\x0b\xb8\xf3?\xf7\xd6\x99OL\x89\xc7\xbfn\xf32\xc6\xb4\x86\xd6\xbf9\xd7\xa3i\x8c\xb7\xd5\xbfX\xd2\xa7G\xe6\x8a\xc4\xbf\x85\xb3\x8f\xcf\xbd\xc4\xd7?s\x97\xb3\x06rB\xda\xbf:\x1fY\xfe\x05\xaa\xe5?8\x13\x19\xbfO\xe6\xf4\xbf\xb7\x081~7Q\x00@\xc7<\x01\xf1\x0c\x8c\xc0\xbf}\xe8=F\xc6\xa5\xdc?\x91.\xb5\x10\xb5*\xe1\xbf\x8e\xc8[\xf9\xa7\xc1\xec?\xef\xcd&)\x19g\xfa\xbf\xbb W?ed\xd6\xbf\t\xd4\xd2i/ \xc6?\xa4W\xba\xac\xd2\x81\xeb\xbf\xea\x9c\x91\xf7\xb6\xbd\xfc\xbf\xda3 \x9a\xca1\xca?FG\xa3\xe7O\t\x05@\xe6\xb77\xeb\x07P\xe1?\xd2\xeb\xfb\xddB\xd7\xf6\xbfs\xfddD\t\xa9\xee\xbfa\xc5,\xe8\xb9?\xda?\xa9wr\xcf\xaeH\xe4?h\x9dw(\x11A\xf4?\xa3\xe8(\xb9=s\xd5\xbf\'\xff\x18\x9b\x83\xf7\xbd?\xd3p\xda\xb3\x94(\xd6?\xe8\xf8\x19\xdb+\xd7\xe1\xbf\x00\xc5}\x0c\xbd\xbc\xf5?M\x91{\xb4\xe6\x96\xf4\xbf\xf7\x97\xaa\x18L2\xf6?7\x04A\x8f\xf4\xc6\xe7?G\xf1\x9b\xf9fU\xfc?\xd3\xc04F\xed\xe4\xba\xbf\x04\xe7\x84j\xcb_\x91?,\xd6\x11~\t\x81\xef?L[\xfc\xe9q&\xe4?x]\xbf5\xe2~\xf4?\x0c\x15I\xb9\x14$\xfb?\x0f\x11\xb3\x83\xf4?\xd0?3\xd5\xb7\x0c\xbf\x10\xe2?\xd7o\xf0\x89u\xd4\xf7\xbf\x90\x1b\x1c\xa2\xdc\xaf\xd2\xbf\xcd\x11\x05)mG\x00@\xdd\xc9\xa6yV_\xec\xbfY\xb9\xfde\xa9/\xea?\x03\xf5\x03l\xa6m\xcf\xbfk\xd3\\\x11\x15\xa7\x00@5XE\xbe/\x9b\xa7?g\x1148\x13\x16\x85\xbf\xda^Q\xa6\x0e\xce\x00@Q\x94\xfe\xddK%\x06@FA\x1d\xb5q\x92\xdd\xbf\xd3\x85\x8ae\xd3O\xf4?\xc2\x93\x92;\xa0\x8a\xc9?[\x14\xa5\x17\xc11\xe1?\xe1\xe5\x08\xcd\xeb\xfd\xc5?\x9e\x0f\xd0\xa9\xe2\x0e\xea?n\x99G\xcfp\xd4\xf1?\xd5)\xe9\x91u\xee\xc9?\x01f\xd8~\xc4]\xf1?\x8e\xf8\xad\xce\xab\t\xf4?^\x0b\xe2t\xd1:\xef\xbf\xbfa\xe5\xf5\xad\x10\xf4?1\xc4U+\x86F\xc4\xbf6\xe2i\xdb\xd8d\xee\xbf\xcc\xa6\x12\xad\xeeb\xf0\xbflw\x0f\x07\x07)\xf1\xbfm\xce\xef\xbe\x14w\x00@f\xa7\xafo\x8d\xe0\xfa?\xf6\x12\xa1\xf3{;\x02\xc0\xc9\x01\xe5\xc1\x95\xe2\xc4\xbf\xc8iw\x01\x91D\xe0?\x19\x10\xec06\xa7\xe4\xbf\xd6\xbd\xe4@\xf4\x86\xf6?\xff\xde\xa7(k\x85\xfe?\x0c\xf0Z\xe4\xf2\xaf\xf8?\xf4\xf5.`\xf4\x8c\xcc\xbf \x86z\x005B\xf1?&\xd3[\xab\x8be\x13@/\x158\x9eX\x91\xf9?s\xf7\x02\xd1R\xc9\xf5?#\xd9\x1fi\x8d\xd7\xcb\xbf\x1d\xc7\xa8\xdb\xba\xc5\xd2?3:\xdb\xa6\xc1\xb6\xc8\xbf\x9f\xcc\xe4\x01\x19\xb9\xea?\x99E\x881y9\xeb?\xbb\x9a\xbf\x94\x1fB\xb6\xbf\xdf\x90\x1f\xc9\x1e\x1b\xca?5\xa9+\x07\xf4\x1a\xf0?\x1c\x7f\x1d\xae\x04\r\xc2?\xf1\x8c\xa6v\xe8\xd9\xf4\xe4?\xe9\xb9\xe9\xf0\t\x98\xda?\xf2\xde\xf3U\x073\xe2?\x869\x15 \x92\xf3\x05@\xaf\x83\x96\xa4^\xe4\xc2\xbf\xd0\xd0\xe8\x07/w\xdb?\x1b\xb90\xc1\x07\x83\x04@a\x8b\xcf\xc4\x80\x98\xf9?\xac\xc5<\xd0,\x95\xf9?U\xee\x8ay=\x9e\xd7?\x9ec\xe9\xe7\xc7H\x06@\xb9\xdbC\xe9\xec\xb3\x14@\xcfg\xdb\xad\xc4\'\xfd?\xd9\xf8 \xbd\x89\xd4\xec?d\xe9L\xeb$1\xd2?\x9e\x05\x87\x03\x87\xfe\xf3\xbfP\xd6\x1f\xa7|p\xda\xbf\x99\x815m>a\xe7?\x0b\x16\xc9J\xed\xf8\x03@o\xe6\xb3\xb6L]\x02\xc0\x12\x7f\xe4\x94\xadE\xd7\xbf\xc0\x94\xfe\xb3\xdc*\xdb\xbf\x0fH\x1f\xe1\x88%\xf5?\x90G\x86\x90\xcf\x99\xfe\xbf\xa1\x04\xf8\xf3\x17\x18\xf2?sY\xdaC\xbf\x96\xd7\xbf|\xb3W!-,\xd5?\xca\xec/\xa5\xa26\xfe?e\xa3G\x1d\x92\xfd\xee?\xa7\xad\x0e\xb2JN\xfa\xbf;\x9d\xd4\xf1\xfe#\xe4?\x90\xaf?\x96\xdb\xde\xf5\xbf^=\x1bb\xb7]\xe8\xbf\xdbiX\xb9 )\xfd\xbf0\xd62e\xe4=\xf2\xbf\xc1\x86\xaa\x93\xd6_\xd6?p\x9c\xcc\x15\x9d\x0f\xf6?\xb5-\xacN\xd3\x98\xb6?\xad\xc8Do\xbf\xfb\x11@\x8c\x98\x8e:!W\x19@\xc6jt4\x03v\t@\xb3\x08\x063\xf8\xa1\xe0?\xbb\xdc\xd6?P\xb0\xe5?r\xf1\xfa\xbaC\x82\xce?\xce\x8fn&!\x01\xfc?\xb3\xdb`\xd4\x80G\xdb?\x17\xab5\xde\xf6\x88\xe8?\xcf\xb2\xe2;\x16\'\x10\xc0:\xd2-\x97\x8b\xa9\xe5?i\xdfa\xb7\xa2L\xfb\xbfo\x1e\xc6\xf7\xc37\xa1?\xba\xc5kED\xc5\x80?S\x0e\x08\xacc\xc3\xef\xbf\x80C\x7f\x0f\x0e\n\xfc?\x8d\xf1*\x87\x8f\xfd\x83?\xc4]Wd\xa77\xc9?\xec\x060iu\x06\x00\xc0m\x9b\xae\x17]M\x00\xc0\xa3>a\x13\\\x19\xfe\xbf$\xdc-5\xf8p\xf1\xbf\xaf\xeb\xb3\x03\xc1i\xf0?/\x03,\xb5\xe6 \xff\xbf\x0f}\xda\xe1\x9f\xf0\r\xc0\x19\xec\xcc\x11\xb6\x88\r\xc0\x18j%\xecA|\x01\xc0\x8a\xd8\xe7B\x827\xce\xbf\x9e\xfa\x18]\xae\xcd\xee?\x05\xf1\xd2\xcb\x9e\xe0\xf6?\xf4e9\x07\xf0-\xf9?\xa2\xff\x8a\xc8\x84|\xea?\xa94>u\xc2Tp?\x84\xbd=BDG\xf0?9a\x84;4\xb3\xe9?\x86\x7f\x81\xa9\x94C\xf4?Ur\x1a\xd8\xfa\xaa\xea?\xe5\x7f\x82\xb7\x95\xe4\x05\xc0\xb5\x11:/|\x8c\x02@\x16lCft\xf6\xfd\xbfm\x82|\xb2f\t\xd3?\xda\xdb\x7f\x01\xb8}\xed\xbf\xfe\xe5\xa7f\x171\x01@\x13o/\xb9cq\xf2?\x80\xdf\x958d\xeb\xfb\xbfx\x80\x88\xce3\xeb\xec\xbf>j.\xddR\xcb\x02\xc0L\xb6m\\\x83h\xf5\xbf\xab\x10\xef\x13\xc7\xc8\x01\xc0\xb7\xfc`~\xdd!\x01\xc0\xb9m\x98rts\xf7\xbf\xdf\x1e\xe6\x8a\xf0\xc9\x07\xc0\xd6L4?\xa9\xd7\xf2\xbfV\x9d:\xf7q\xc7\x11\xc0\x134%\x81\xc7(\x03\xc0\n\xb7G[PF\t\xc08}\x93\xf8D\xd4\xf0\xbfY*\xef\x8c\x1d\x10\xf0\xbf\xe2\x9d\x0b\xed\xc0\x9d\xd3\xbf\xf4\xa9\x88\xf8\xe5\xb0\xb1?\xbe\xc9\x94\xa0\x87Q\xf1?\xf1\x10#\xb6Y\xfe\xf6?\xe9R\xd9W\xd3I\xa7?_\xf9\xde\x18(n\xf7?\xc377gRU\xe5\xbf\xba8H\xacM\xe8\xd5?\xeb\x82l:\x8c\xba\xc5?\x02\xe6\xf4\x06\xec\xc8\xda\xbf\x0e\xd4\xb8\xd52\x18\xd9\xbfs\xf8\x91\xe2\xc2\xb1\xfd?\x81\xbf\xc0\x84\xbfB\xc9?\x8bQ\xe8n\xcc\xb5\xdd\xbfZ\xd6\x95\xa7\x8e\xd4\x01\xc0\x0c\x19Y]o\xd3\xe0\xbf\xf1\xa6]m\x8c\xf0\xf4\xbf\x91\xf8\xe1q\xd1\x1a\x14\xc0\xda\xe9K\x1a_Y\x04\xc0\x7f\xcdB\xc5f\x87\x01\xc0\n(\x9a\xb7\xea\xcd\xe4\xbf\x1b\xbf\x03\xf6\xa8d\x01\xc0\x05\xf7\xa5\xb7\xd5\x8f\t\xc0\xb5\xb5>\x15S|\xf5\xbf\x06\xd6\x90,\xe96\xf6\xbf\xd3\xd6\xef\xb8\x93\xe0\xf2\xbfv\x11\xe4[1|\xfc\xbfT\xb1\x165J\x10\xea?\x95\t`\xe0DJ\xe2\xbfH\xde;\xba\xf0B\x96\xbf\xb5\xe1\xc7\xc7\x8d\xc2\xde?\xee2o\x95\xf0\\\xeb\xbfm\xa4\xce~\xe5\xa0\xf0\xbfI\xb1\xcd!\x8d\xf5\xdd\xbfJ-\xb2\xdf>\x0e\xd4\xbf\xe8\xc9\'\xee$\xa9\xe7?\xf1YW\x92\x15\x0f\xfa?\xe8Aj\xab\x87g\x00@\x94ig1{D\x12@V\x8a\x9b\xb5\x9e\x03\xff?\xe4\xb4\x0cN\x81\x99\x00@Gu3\xd1\x98\xa3\x03\xc0X\xf8+0\xa4}\xf0\xbfq\xefOR\xe0\xff\x01\xc0\x0c\xfd\xf2\x93\xbc\x8e\t\xc0{Ua~x\x7f\xf7\xbf\xfa\t\xa9\xb6\xcd\xdc\n\xc0 \x90.\xb5\x19Z\xf5\xbf\x9dt\xd6#\x02\x1e\xdf?\xff\xcf\xb7\x8fV\xa0\x0b\xc0\x03\xa6Y\xa1\xaf$\xfa?\xeb\x95\xaa\xf2\x9fx\xf6?\x92bL\x88p\xc0\n@N\xc03\xf2\x9cb\xfd?+\xc5\x07\xbd\xc6R\xea?mJN\x97\xfa\xe3\x01\xc0.$\xba\xe8A\x9a\x8f\xbf\xe9!\xdc\xfe\x81G\xe6?\xcd\xf3"H~\xa0\xd0?\xf3\xee|\xe6jd\xeb\xbf\x10\xf4\tt\x98\xae\xf2\xbf\xd2\xf7\xd3\xff\xd0\x93\xee\xbf\xd02\xf7\xd8\x91\x1b\x04@\xdbO\xef\xe6\x1a\xa9\x0b@\xc6\xf0N~#\x16\x04@,Jum\rP\xfc\xbf\xd2\xd5n\x93\xca\x9e\xfa?\xe7h\xdd\x8b\xfb\xa9\xeb\xbf\xa0\x94\xcb\xf1\x8d\xc2\xe4?2\x018@\xd8\xd7\x0b\xc0\xd9\x14:^;`\xf7\xbfi\x94\xe5c\x0f[\xee\xbf\xf7j\x98\xe1O\xa4\x08\xc0R\xf4\x19\xba\xfd\x06\x0e\xc0\'\t\xd5\x9d\xed.\x04\xc0\xca\x95\xcf\x9a\xad\xaf\x0b\xc0>\x1fR\x15\x1c.\x07\xc0\xa8\x9e\xf2\xb3Di\x0b@\xd1\x92\xfa\xc8\xd0\\\x13@\x9e\x02\x1e\x01*\xcb\xca\xbf\x81\xa8|f\tI\xc8?\x10\x80\x94\xa9"g\x08@\xd8(}u\x14\x13\x02@%\x0f\x90\xc7\x85U\x04\xc0\xa7\xe6^<\xb7i\xec\xbff\xe9\xd6\xee\x95\xa3\xec\xbf\x13\xf7Z\xadx\xe2\xe5\xbf\x16]}\x07\x84\x1b\xf7?\xdb\xa24A\\\x15\xe4?#/(\x850\xed\xe5\xbf5w\xaf\xa0\x80r\x02@\x83AD\xcd/_\x04@\x08Q\x92\x14i\x06\xe9?\xe4\x0cn\x98\xe9j\x06\xc0\x08\x98}r\xdc\xdc\x05\xc00\x14S\xf4\xdc4\x0f\xc0\x99\x19\xe3~\xfaA\x03\xc0\xf2LD\xf5\x93\xfd\xf9\xbf4\xa2r\x17\x80\xb1\xfb\xbfM\xea\xe6\x1f\x89\xc0\x00\xc0\x9b\x89\x82\x8e9}\x13\xc0]\xd2\x97\xd4\x1bG\x06\xc0\xcd\x1e6\x90\xbc\x81\x04\xc0\xe5\xf41w\xe5"\xe5?\xff\xfb\xac\x86\x8a\xa6\x03@\xfb\x95\xdfmPl\x03@O\x94\xf3\xd2\xce\xfa\xf4?\x91\xbe\xbb\x18@A\x03@BS\x91J\xe6\x93\x0c@\x02\x84\xd8\xdf\xd8J\xc3\xbf\x8a}@\xeaR\x9c\x01@\xd3>\x19\xe3\xf0\x0f\x07\xc0\x9d\x8a#D\xac?\xe0\xbf\x9e\xa2\x1dTc:\xac?\xdarL\x0fo#\xde?)#\xbeR\xa8\x8e\xe4\xbf\x08\xb5f\xfd\x08\x99\xb7?\xb7c\x86\xc9g\xe1\xd6?\xee\xa2\x81\x8e\x14<\x02@v\xaeh\xedjG\x12@\xf2\x8dx\x0c3d\xd6?\xeaaO\x86\x03\xc9\x04\xc0\x1c\x9c3\xadi\t\x13\xc0\x8e\x19\x96\\b\x13\xfe\xbf\xd8\xb2\x92\xf4K\x01\x15\xc0-\x1e\',_:\x10\xc0\xf3T;\xdf-\xf2\x04\xc0\x14,=\x89d\xb8\x1f\xc0\x06wZ\xcd\xb7\xcd\x1c\xc0\xe9\x96@ \xb8!\x0e\xc0\x15\x91\xf9\xd3<\xa2\xc4?\x9b\x95\xdd\x84E5\x06@\x96\tE\xc0\xf2\xf8\x10@%\xe8~\x86\x88\xd7\xfa?@\xf7\r0H~\xf8?\xeb\x88\x1e)\xb53\xd6\xbf\x10\xfd$SH\x99\x01@=;\x8a\xb9\xa7\xd6\xcf?\t\x02\x98*\xa8\xbf\xe8\xbf<"T\x8a\xe00\xb2\xbf\xcb{\xe6\x15?\x9d\xd3\xf4?\xb8dE7\x14\xcb\xde?\xf45\x89gZl\x03@\xab#\x0559\xa0\xad\xbfj\'\xfd\xd5\x94^\x07@\xf26\xc0\xa2\xd6[\x00@\xa6\x9c\xeaT$\xc3\xf1?\xbd5\xee\xa7\xcb@\xea?\x18\xaa\x908B\xdd\xeb?\xfe\xc2r\xa2R\xaf\x9a\xbf\x081\xd1\x928\xfc\x04@\xcb\xaaD\xcd\xe9\xeb\xf9?(\x16;5_u\x03@m\xc9~\x8b\xe0\xc5\xf9\xbf\x90\x85\x1d\x9a\xdal\xce\xbf\xa1\xe8\xac\x07\xb0\x9e\xea?\xea*C\x97o8\xd1?\xb5l&\xe1\x99\xc8\x01@H\x84\xd5\x086J\xd7?=\x9e\xed\x08+\x95\xe1\xbf\xdao@\x94\x18U\xeb?\xcd\xd7\xc1\xd8(\x0e\xdb?P\x15|}f\xa2\xcf?\xce\xde(*B\xe6\xe9\xbf\xc6\x81\x86\x98\x86\x07\xeb\xbfU\x1b\xb3=\xdcn\xe6\xbf\xa9\xfc\xb2\xc0\x11L\xde?\xfb\xefFV\t\'\xf9?^!\xfe#\xc2\xdb\xe3\xbfL\x91\x05g\xb2y\x03@Ea\xba\xe4.\x10\xe7?"Ue\xd40c\xf4?\xa8\x80X\xe7r\xc9\xeb\xbfb-M\xec\xc0\t\xf2\xbf\xa1\xf3"\xa0\xee \xf3?\x07\x91O\x86\x9c\xa5\xd9?\xa0\x06\x92\xd7\x0fX\xfd?\x82\x16\x81R-J\x07@\xbb\xf3$B\xcc\x02\x02@\xe6:\xc5\x9a\xac\xfc\xeb\xbf.b\xab\xdd\x1b\xad\xe4\xbf\xfa\x98\xbc\xa0,|\xe6\xbf?\xd4?\xac&p\xe3?9\xe3:\xde;\xe9\xe3\xbf\x9b[\xc7\xf2\x9f\xa5\xb2\xbf\x02\xb5\x89\x11\xfe\xc2\xce?[\x1b\x9blo\x8a\xa1\xbf5\xa2\x89\xa9a"\xbc\xbfIDn\xd6\x1a\n\xd0\xbfLy\xa9z\xd1\xe9\xf4?\xa7{\xb5\x0b:}\xda?\xb1\x0e\xdf\x95{\x03\xfe?5\x8a\x0c\xa1\x0f\x9f\xfb?\x87\xc8\xb9\xa1p\x0b\xaa\xbf\xd3\xdb\x0b~\xbd\xbe\xe2?\x9d\xc8X\x07Y\xd6\xf0?v\x84\x9f\x1b\x05\xe8\xf9?\xc9.Px\xc9Z\x01@\xc3\x1c;\xe9\xce\xcf\xd5?\xd3\xe5L\xcc\x91\x13\xd6\xbf\x0e\xa5\xc63T2\xf6?K\x11\xe6\xba\xe6\x89\xf0?>\xc8|\xa6JG\xed\xbf|^\xc3\xeb\xe8\xe7\xbf\xbf\xb6\x9dO\x88\xfeu\x03\xc0V\xaf\xcb\xc3\xc5\xf3\x01\xc0\x99!J\xd6L\x1b\xab\xbf\xcc\xda\xbc\xa5=/\xfc\xbf5\x93f\xf1\r*\xdd\xbf\x8cK\xe7\xefm\xed\xac\xbf\x07\xe3Z\xc0\xad\xb5\xe2\xbf:\xae\xc9\xa9o\x0e\xe2\xbf4\xa9\xc2\x0eQ \\\xbf\xfe\xba\xca\xd6\x10"\xe1?\x0c\x03\x97X8`\xf3\xbf\xbd\x8ePaj\x9c\xf0?\x04hl.\x95\x00\xb4\xbfl\xc8zp\xe9\xb5\xcb?\xc4\xdb6\xb0\x13\xc3\xf9?q\xd8[{\xb3\xeb\xf3?\x1fu\xb6[\xd8\t\xf7?h\xac\x1b\x01\xf2\xaf\xeb\xbf\xf1\xf8;\xdch?\xe8?5\xbd\xa2\xcb\x14\xc2\x12@"\xd0\xe3\xd4\xbb\xe3\xf3?Xv\xd6\x19-P\xc0?sY%xml\xd3?*\xc6\xac\x19\x91\xe6\xe8\xbf\x1b\x7f\xf0G\x8e\xb9\xfd?\x81\xedK\xe7\x04a\xe1?\xd1\xd3\x05\x9e\xc94\xd4?\xe9\xd3v\xf9c\x8b\xec?\xd4,\xcfX\xf9\xb8\xe4?\x0f \x1a\x92\xd0\xbd\x05\xc0B\xf6\x82\xc7\xae\xe8\xe0?J)\n\xadG\x9e\xce\xbfFA\xb5_!\xfc\xca\xbfm$\xbd2\x85\xbe\xd6\xbf\xb0\x16\x10\t\x01N\xea?\xd9K\x98\xf7\xc5z\xf2?F\xfa\xa3\x1c\xafJ\xe3\xbf\x9c6m#%\xb7\xd9\xbfj,\xe1\x11\r\xa1\xeb?C\xa4\x0eJ\xc7v\xeb?\xdc9[\xfc\xcfP\xdb\xbf]`7F%\xc7\xf2?\xe6\x96z]\xd3\xfa\xe8?\xca\xe4\xe2\'\x0b\x93\xe3?\xf1\xd8\x9c\xed\x0f\xe8\x07@\xd161\xc7\xd8\xc8\xe5?_\xab~\x0e\xd8_\xef?=\x0e|\x83\x84\xfe\x00@F\xc1\xc1\x1e\x1f\x08\xed?\x83\xb2\xb1\xa5$\\\x00@\xe8f\x8d/\'\x15\xd0\xfc?\x9e}\x8c\x8b\xb9\x9a\xaa?\xd20\xc5\xc6\x99\xcd\xec\xbf\xffc\xd4[\xc0\xc4\xaf?C\\r\xa5\xcbZ\xc9\xbf\xdb\x01<\xcc\xe0P\xfd?\xba\xb1\x85\xe4\xdb$\x01@5u\x9e\xcc;\xb5\xe7?\x15R\x06>S\xbd\xf6?\x1a\xb3y\x86\r\xc7\xfd?\x13\xb6\xf4\xc0\x12\xee\t@\x07\x1a\xd3\xc0\xf6\xe8\x92\xbf\x1b\x90\xb9\x94\xfeB\xe5?\x7f\x08b\x97\xd8M\x02@\xb8\xef\xb2\xdc\'\x03\xe0?w\x84\x83->D\xd4?d\x96\xf3\xd7\xb5\t\xc2\xbf\xc10\x01w\xe4\x91\xef\xbf\x96\x88\x04j$l\xe5\xbf]\xc26\x03dG\xeb\xbf\x9a\xe1^\xa1\xff\x01\xf2\xbf\xa5\x0b6\x9c9\xb5\xc0?\xa4\xca\xc5\xa5\x14m\xe1?\xa1wf_U\xd5\xb6?_\xa3\x05\x86x\x9c\xd9?5\x8d\xc1]%v\xf4\xbfv\xf8_\n\xd2\x07\xde\xbf\xd8\xbf$L\x7f\xd9\xc1\xa0\x00\xc0\x96\xf0m\x8d0\xb6\x00@_7\xe3\x82\x87\x8f\t\xc0\xc23\xb9M+{\x04\xc0\xee\xb7\xdc1\xac\xb5\xff?\xa8\xeff\xa8\xa1X\xd1\xbfLC(8\xee\x97\xbd?\xc7m\xcb\xef\xbc\xf4\x1c@U\xfa_p\x8bV\x00@`\xa3\xb5\xa5u\xc9\x11@\xf42\xe2#\xc0t\x17\xc0\xaeM\x18WT\xea\xf8\xbf5\x98\xcb\x01\r* @\xb9\xe5\x85\xc7L*\x00@\xdc!\xa5a\xd4\xf9\r@d\x01*6\xa4\x8d\r\xc0\xac\x007\xfc\xa1\xfe\x0b\xc0zj\xc0l\xa55\xdb?\xb5\xd4\x9d\xde\x84\xd0b?s\xff:9\xf3j\x15\xc0\x96\x1c\x0b\xd2\'\x1c\xf2?F\x06w\xc6\x02\x98\x1a@F\x04u%8\x95\xfa?\xa1\xbd\xa3<\xea\xc2\x01\xc0K\x9a\x8d\xe2\x8c\x0f\t\xc0]G\x16\x9d\xb5\x14\x1b\xc0\xad@\xc1v\xa3\xec\xee?\xe1\xcb\x82[\x8f\xb0\xf8?h\x7f\xb0H\x12\xca\x0f@\xab\x08\x0b][\xbe\n@i\xaa\xd8\xce\xb6r\x16@"\t\x8a\xdfA\x91\xf9\xbf\xdd\x1f\xa8\xba\x9dM\x1b\xc0\xb1\x97\xb2W\xd1\xd3\x12@\\\xaf\xa6m\x99\x87\xfc\xbfO\x8c\xd2\xe3\xae#\xbf?\x81n\xeb\x04\xf7\xba\xe1?\xc6\xee\xd9\xb8\xc01\xf9\xbf\xd5\x1f\xe7\xa8\xfdY\t\xc0\x8f\x87\x04\x1bZ\x9b\xfb?\xe7\xf6\xf7\xa1]\xc7\xf8\xbf\x00\xffCh\xb0\x9f\xe7?\xf1\x87Q\xc9m\\\x17@\xe4C\x82\xe1\x80\t\x05\xc0\x7f\xde\x92z{{\x0b@W\xe6\xc2\xdby^\x03\xc0\xcc\xf0\n}\xdbx\x05\xc0=\xa6\xf3\xa9\xfdE\xfd\xbf4q\x85=.\xbe\x05\xc0\xc2\xa0\x19\x10\xdcl\x08@\x14\xaa4\xce\x14\x86\xfa\xbf\xaf\xcc5G\xf0\xd5\x1e\xc0P.$^\x94\x9d\x11\xc0\xc8\xaa\xca(\x8f{\x0f\xc0:q\xad\x1b\xf9Q\x01@}\xde\xf6\xa3\x1a\x1b\xea?\xeb\x19\xc0J\x11\xb2\xb8\xbf\x92\x8f8\xfb\xdf\xe6\x1b\xc0q*\x02e*\xa1\x06@\xd4\xa7\xc5F\\\x18\x02\xc0\xe96\x10\xe4\xb4D\x0f\xc0N\xfc\xc8\xfd:\xf6\xdb\xbf' +tbg1 +(g2 +(I0 +tS'b' +tRp7 +(I1 +(I10 +I1 +tg5 +I00 +S'\xad\xe6(\x12\xef\xd0\xaa\xbf\x7f\xbdB\xa0\x82\x8c\x1f@\xe6\xd7\xef\x00q\xbc\xf1?\x1d\xab\xfa\x9a;\xe9\xb0?E\x0b24\x10)\xf9?\xf9P\x86\xf7\x00\xd0\x10@\xde\x89\xf0\xf1\x8c\xa5\x0b@\x18\xeb\xf4N\xf1\xaa\xf3?\xd64\xd7\xc7\xf2F\x00\xc0N\n\xdf\x08\x14x)@' +tbg1 +(g2 +(I0 +tS'b' +tRp8 +(I1 +(I10 +I1 +tg5 +I00 +S'\xcd(\xef\xf6\xae`\x0c\xc0\xd83\x80\x90`\x9e0\xc0\xb9\xdc1\x80X^\x1a\xc0\xcc).\x98Y\xe0\x11\xc0myx\x94\xf6\xba&\xc0\xde3M%\xd2\x8f$\xc0\xacQx\x89\x06\xc1%\xc0\xfb\xaa \xec\x9en\xf3\xbf\x1b\x8b\xf0H/\xf0 \xc0\x90\xf7\x0c$\xc3\xa9\x94?' +tbt. \ No newline at end of file diff --git a/samples/Pickle/random.p b/samples/Pickle/random.p new file mode 100644 index 00000000..ff3ab064 --- /dev/null +++ b/samples/Pickle/random.p @@ -0,0 +1,36 @@ +cnumpy.core.multiarray +_reconstruct +p0 +(cnumpy +ndarray +p1 +(I0 +tp2 +S'b' +p3 +tp4 +Rp5 +(I1 +(I100 +tp6 +cnumpy +dtype +p7 +(S'f8' +p8 +I0 +I1 +tp9 +Rp10 +(I3 +S'<' +p11 +NNNI-1 +I-1 +I0 +tp12 +bI00 +S'\x1cc~\xc3\xa7r\xed?\xe5${\xec\xd6\xcd\xed?\x809-\x02%\xa9\xa2?F\x0f\x1d\xe8\xef\xa3\xdb?\xfe\xd1\x0c\xb7\x83\x13\xef?\xe0\xfcO\xe5?Y\x97\xcb"\xa7%\xe7?\x9b\x8d\x16\xda\x97\xe1\xeb?T\x14\xbd\xfe|\xf4\xd0?\x18\xdfH\xc56A\xba?\x90\xc5\xfb\xc63:\xe5?\xbf%\xad\xe5.\x86\xe9?\xc6\x0c\xa9\x8c\xd7\xd5\xe9?\xf8\xafc:\x84g\xd7?\xf8\x98\x879\x9a\x16\xee?\xba\xdf\x88\x8az\x06\xe2?~g-\xeb\xc8\xed\xee?\x08A\xcc\x8c\xe7>\xef?\xceD\xc4ar\n\xdc?\x92w\xbb\xa34\xb1\xd9?\x88\xb9\xc0{u\xa3\xdc?d\x1a\xad\xe8\xf3\x14\xdd?\x9c\x95\x13\x96o?\xe5?\x9cT[\xb8r\xa9\xe5?0\xf1\x01+(\x0f\xdf?W\xbdjqD&\xed?c\xcf1-W\xe6\xe1?\xce\xbc\xe1{zW\xd9?"d\xcf\xd7\x13\x93\xde?\xf2P\xf6\xc3\xd6\x87\xd5?\xc2\x0e\x92q\x89\xda\xd5?\xc0:B\x1bb\x00\x9e?Y\xafHmr\x80\xe3?\x1co\xa7\xba\xa5/\xe4?\xa2\xbc \x9c\xddB\xd0?\xd2L\x935\x17\'\xee?|\x8cM\xeb\x97=\xe8?\x0f0xN*V\xea?\x81p\xe3,!\xf2\xee?\xf5w\xed\x10\x9eu\xe0?\xc5\x16\\LR\xb5\xe1?\xbeh\x04\xa4g\xe5\xd6?\xea\xc0\xb9\xf0\xb2\xd8\xd9?\xac\x9c\xeep\x1a\xa9\xd8?@W9hp\x16\xb1?\xc4\xedS\xd6V\xa1\xed?\x93,!\xdc\xa1\x8b\xe9?\x80)\xb1\xa6[T\xc9?\xac\xbc\x8a\xd21\xdd\xc5?\x80\x9c.g\xf1\xf2\xc6?\tLu\xc3\xf7U\xe9?n\'\x9f?\xbe\xf9\xe9?\xa3\xe7K\x1c\xb3\xa9\xea?X\x98\x1a\xcb\xa0\xcd\xd3? \xb6O\x9c\x1bQ\xc2?"\x89[\xad1\x8e\xea?\xdd\x8f\xa0P\xc7\x0e\xe2?c\xa4j\xa3\r\xac\xef?\xba\xb6\x0f\x8emo\xef?\xe0\xed\xa0\xc5R9\xab?U\xf1\xcd\xcf\xbf\xcb\xea?\x89*#\x06\xb0|\xe8?d\xa3\xad\xcd\xe0]\xcc?\xb5\xe78\xa7w\x13\xe3?\xce\x99\x98\xefS%\xd7?\xb1\xf8\xd8\x8eI\x13\xef?\x91`]\x93\xd4 \xec?\xc0\rPz\xee\xbd\xe7?7\x92\xd4\x0fP\x8f\xe1?L\x0f\xaf\xa9\xc3\x19\xdd?\\}\x15X\x870\xc7? ~ t\xcat\xb1?@?\xec\x97u\x05\xe9?F\x8d:\xac4D\xdb?qY\xe1Qk|\xe2? \xaf\xeaj\xa5\x04\xab?J[\x1al;\x00\xd5?\x00^{n\xc2\xf1S?\xb0\x82dN\xda\xb5\xc7?\xe0 \x07\xe1?R\x92?\xc4\r\x08+\x99J\xe1?I|&U\x19\xc4\xe1?|*\xf9\xebq\x7f\xed?\xbc*\x93\x89k\xab\xe9?oiL\x90;\xe0\xef?\x96\xcd\x9b\xff\x18g\xdc?pt\xb4\xa5\x9c\xa2\xbc?Nu]w*\xb7\xd2?\x88k\xac\xd0\xfd\xbf\xd5?Q\x02$b\xfeH\xea?5\xf6\t\xb6K\x1a\xee?' +p13 +tp14 +b. \ No newline at end of file diff --git a/samples/Pickle/save.p b/samples/Pickle/save.p new file mode 100644 index 00000000..13889c0c --- /dev/null +++ b/samples/Pickle/save.p @@ -0,0 +1,10 @@ +(dp0 +S'lion' +p1 +S'yellow' +p2 +sS'kitty' +p3 +S'red' +p4 +s. \ No newline at end of file From c462c2bd3181c78289bfb95e89659255b888f127 Mon Sep 17 00:00:00 2001 From: E Date: Thu, 1 Oct 2015 13:59:52 -0700 Subject: [PATCH 034/205] add FreeMarker to languages.yml --- lib/linguist/languages.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 0de559ee..945479fb 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1036,6 +1036,18 @@ Frege: - .fr tm_scope: source.haskell ace_mode: haskell + +FreeMarker: + type: programming + color: "#0050b2" + group: Java + search_term: ftl + aliases: + - ftl + extensions: + - .ftl + tm_scope: text.html.ftl + ace_mode: ftl G-code: type: data From 88cc73fa49520e188e3074ddb0b27205dc8477db Mon Sep 17 00:00:00 2001 From: Julian Squires Date: Sat, 3 Oct 2015 07:44:31 -0400 Subject: [PATCH 035/205] Add language definition for Ur/Web I have omitted the related .urp extension because these are small files (projects) in a different syntax. --- .gitmodules | 3 +++ grammars.yml | 2 ++ lib/linguist/languages.yml | 11 +++++++++++ vendor/grammars/UrWeb-Language-Definition | 1 + 4 files changed, 17 insertions(+) create mode 160000 vendor/grammars/UrWeb-Language-Definition diff --git a/.gitmodules b/.gitmodules index 87654b7e..cc8ff5c8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -680,3 +680,6 @@ [submodule "vendor/grammars/language-babel"] path = vendor/grammars/language-babel url = https://github.com/gandm/language-babel +[submodule "vendor/grammars/UrWeb-Language-Definition"] + path = vendor/grammars/UrWeb-Language-Definition + url = https://github.com/gwalborn/UrWeb-Language-Definition.git diff --git a/grammars.yml b/grammars.yml index 2a7a89e2..dc09cd3a 100644 --- a/grammars.yml +++ b/grammars.yml @@ -140,6 +140,8 @@ vendor/grammars/TXL/: - source.txl vendor/grammars/Textmate-Gosu-Bundle: - source.gosu.2 +vendor/grammars/UrWeb-Language-Definition: +- source.ur vendor/grammars/VBDotNetSyntax: - source.vbnet vendor/grammars/Vala-TMBundle: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 0de559ee..daec47d4 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3475,6 +3475,17 @@ UnrealScript: tm_scope: source.java ace_mode: java +UrWeb: + type: programming + aliases: + - Ur/Web + - Ur + extensions: + - .ur + - .urs + tm_scope: source.ur + ace_mode: text + VCL: group: Perl type: programming diff --git a/vendor/grammars/UrWeb-Language-Definition b/vendor/grammars/UrWeb-Language-Definition new file mode 160000 index 00000000..cd47cc78 --- /dev/null +++ b/vendor/grammars/UrWeb-Language-Definition @@ -0,0 +1 @@ +Subproject commit cd47cc78918244b9cc36f57f5397a97a5affce4e From 538f479b60eeef2a6a8fe6bb85785ab86a03da39 Mon Sep 17 00:00:00 2001 From: Julian Squires Date: Sat, 3 Oct 2015 07:51:37 -0400 Subject: [PATCH 036/205] Add sample Ur/Web files Taken from tokenrove/parsur so I don't have to worry about license hassles. (You may relicense these samples as necessary.) It would be nice to have an example of the embedded SQL syntax in a sample. --- samples/UrWeb/iso8601.ur | 79 +++++++++++++++++++++++++++++++++++++ samples/UrWeb/parse.urs | 85 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 samples/UrWeb/iso8601.ur create mode 100644 samples/UrWeb/parse.urs diff --git a/samples/UrWeb/iso8601.ur b/samples/UrWeb/iso8601.ur new file mode 100644 index 00000000..7a6a3809 --- /dev/null +++ b/samples/UrWeb/iso8601.ur @@ -0,0 +1,79 @@ +open Parse.String + +val digit = satisfy isdigit + +val decimal_of_len n = + ds <- count n digit; + return (List.foldl (fn d acc => 10*acc + ((ord d)-(ord #"0"))) 0 ds) + +val date = + y <- decimal_of_len 4; + char' #"-"; + m <- decimal_of_len 2; + char' #"-"; + d <- decimal_of_len 2; + if m > 0 && m <= 12 then + return {Year=y, Month=(Datetime.intToMonth (m-1)), Day=d} + else + fail + +(* We parse fractions of a second, but ignore them since Datetime + doesn't permit representing them. *) +val time = + h <- decimal_of_len 2; + char' #":"; + m <- decimal_of_len 2; + s <- maybe (char' #":"; + s <- decimal_of_len 2; + maybe' (char' #"."; skipWhile isdigit); + return s); + return {Hour=h, Minute=m, Second=Option.get 0 s} + +val timezone_offset = + let val zulu = char' #"Z"; return 0 + val digits = decimal_of_len 2 + val sign = or (char' #"+"; return 1) + (char' #"-"; return (-1)) + in + zulu `or` (s <- sign; + h <- digits; + m <- (maybe' (char' #":"); or digits (return 0)); + return (s*(h*60+m))) + end + +val datetime_with_tz = + d <- date; char' #"T"; t <- time; + tz <- timezone_offset; + return (d ++ t ++ {TZOffsetMinutes=tz}) + +val datetime = + d <- datetime_with_tz; + return (d -- #TZOffsetMinutes) + +fun process v = + case parse (d <- datetime_with_tz; eof; return d) v of + Some r => + let + val {Year=year,Month=month,Day=day, + Hour=hour,Minute=minute,Second=second} = + Datetime.addMinutes (r.TZOffsetMinutes) (r -- #TZOffsetMinutes) + fun pad x = + if x < 10 then "0" `strcat` show x else show x + in + {[pad hour]}:{[pad minute]}:{[pad second]} {[month]} {[day]}, {[year]} + end + | None => none + +fun main () : transaction page = + input <- source "2012-01-01T01:10:42Z"; + return + + +
+ +
diff --git a/samples/UrWeb/parse.urs b/samples/UrWeb/parse.urs new file mode 100644 index 00000000..3b2c1ed5 --- /dev/null +++ b/samples/UrWeb/parse.urs @@ -0,0 +1,85 @@ +functor Make(Stream : sig type t end) : sig + con t :: Type -> Type + + val mreturn : a ::: Type -> a -> t a + val mbind : a ::: Type -> b ::: Type -> + (t a) -> (a -> t b) -> (t b) + val monad_parse : monad t + + val parse : a ::: Type -> t a -> Stream.t -> option a + + (** Combinators *) + val fail : a ::: Type -> t a + val or : a ::: Type -> t a -> t a -> t a + val maybe : a ::: Type -> t a -> t (option a) + val maybe' : a ::: Type -> t a -> t unit + val many : a ::: Type -> t a -> t (list a) + val count : a ::: Type -> int -> t a -> t (list a) + val skipMany : a ::: Type -> t a -> t unit + val sepBy : a ::: Type -> s ::: Type -> t a -> t s -> t (list a) +end + +structure String : sig + con t :: Type -> Type + val monad_parse : monad t + + val parse : a ::: Type -> t a -> string -> option a + + (** Combinators *) + val fail : a ::: Type -> t a + val or : a ::: Type -> t a -> t a -> t a + val maybe : a ::: Type -> t a -> t (option a) + val maybe' : a ::: Type -> t a -> t unit + val many : a ::: Type -> t a -> t (list a) + val count : a ::: Type -> int -> t a -> t (list a) + val skipMany : a ::: Type -> t a -> t unit + val sepBy : a ::: Type -> s ::: Type -> t a -> t s -> t (list a) + + val eof : t unit + (* We provide alternative versions of some of these predicates + * that return t unit as a monadic syntactical convenience. *) + val string : string -> t string + val string' : string -> t unit + val stringCI : string -> t string + val stringCI' : string -> t unit + val char : char -> t char + val char' : char -> t unit + val take : int -> t (string*int) + val drop : int -> t unit + val satisfy : (char -> bool) -> t char + val skip : (char -> bool) -> t unit + val skipWhile : (char -> bool) -> t unit + val takeWhile : (char -> bool) -> t (string*int) + val takeWhile' : (char -> bool) -> t string (* conses *) + (* Well, "till" is the correct form; but "til" is in common enough + * usage that I'll prefer it for terseness. *) + val takeTil : (char -> bool) -> t (string*int) + val takeTil' : (char -> bool) -> t string (* conses *) + val takeRest : t string + + (** Convenience functions *) + val skipSpace : t unit + val endOfLine : t unit + val unsigned_int_of_radix : int -> t int + (* + * val signed_int_of_radix : int -> t int + * val double : t float + *) +end + +structure Blob : sig + con t :: Type -> Type + val monad_parse : monad t + + val parse : a ::: Type -> t a -> blob -> option a + + (** Combinators *) + val fail : a ::: Type -> t a + val or : a ::: Type -> t a -> t a -> t a + val maybe : a ::: Type -> t a -> t (option a) + val maybe' : a ::: Type -> t a -> t unit + val many : a ::: Type -> t a -> t (list a) + val count : a ::: Type -> int -> t a -> t (list a) + val skipMany : a ::: Type -> t a -> t unit + val sepBy : a ::: Type -> s ::: Type -> t a -> t s -> t (list a) +end From b34acac7220722f128c96b3b75a73c57e9724d59 Mon Sep 17 00:00:00 2001 From: Jeff Kreeftmeijer Date: Sat, 10 Oct 2015 00:10:37 +0200 Subject: [PATCH 037/205] Add EEx (Embedded Elixir) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EEx is embedded Elixir: http://elixir-lang.org/docs/v1.0/eex/. Here's some in-the-wild usage on Github: https://github.com/search?p=100&q=extension%3Aeex+NOT+nothack&ref=searchresults&type=Code&utf8=✓ This uses the "html_elixir" Ace mode, which was added in this pull request on the Ace project: https://github.com/ajaxorg/ace/pull/2696 --- grammars.yml | 1 + lib/linguist/languages.yml | 10 ++++++++++ samples/HTML+EEX/index.html.erb | 26 ++++++++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 samples/HTML+EEX/index.html.erb diff --git a/grammars.yml b/grammars.yml index 4bd66f12..a56548e3 100644 --- a/grammars.yml +++ b/grammars.yml @@ -248,6 +248,7 @@ vendor/grammars/elixir-tmbundle: - source.elixir - text.elixir - text.html.elixir +- text.html.eex vendor/grammars/erlang.tmbundle: - source.erlang - text.html.erlang.yaws diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index d7a3a18b..9c25bd82 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1323,6 +1323,16 @@ HTML+Django: - htmldjango ace_mode: django +HTML+EEX: + type: markup + tm_scope: text.html.eex + group: HTML + aliases: + - eex + extensions: + - .eex + ace_mode: html_eex + HTML+ERB: type: markup tm_scope: text.html.erb diff --git a/samples/HTML+EEX/index.html.erb b/samples/HTML+EEX/index.html.erb new file mode 100644 index 00000000..5960a441 --- /dev/null +++ b/samples/HTML+EEX/index.html.erb @@ -0,0 +1,26 @@ +

Listing Books

+ + + + + + + + + + +<%= for book <- @books do %> + + <%# comment %> + + + + + + +<% end %> +
TitleSummary
<%= book.title %><%= book.content %><%= link "Show", to: book_path(@conn, :show, book) %><%= link "Edit", to: book_path(@conn, :edit, book) %><%= link "Delete", to: book_path(@conn, :delete, book), method: :delete, data: [confirm: "Are you sure?"] %>
+ +
+ +<%= link "New book", to: book_path(@conn, :new) %> From 5ff580df0af2ebf38b5485a24eef69dae0b5aa87 Mon Sep 17 00:00:00 2001 From: Jared Kuolt Date: Fri, 9 Oct 2015 16:20:59 -0700 Subject: [PATCH 038/205] Support for files generated by Racc. This changeset includes a sample racc file from [this auto-generated file](https://github.com/tenderlove/rjson/blob/44e9bf0440508b78b2bc3376da22df11abbb5483/lib/rjson/parser.rb) (MIT-licensed). [Racc](https://github.com/tenderlove/racc) Racc is an LALR(1) parser generator. It is written in Ruby itself, and generates ruby programs. --- lib/linguist/generated.rb | 16 ++- samples/Ruby/racc.rb | 267 ++++++++++++++++++++++++++++++++++++++ test/test_blob.rb | 3 + 3 files changed, 285 insertions(+), 1 deletion(-) create mode 100644 samples/Ruby/racc.rb diff --git a/lib/linguist/generated.rb b/lib/linguist/generated.rb index d107e737..35766e4d 100644 --- a/lib/linguist/generated.rb +++ b/lib/linguist/generated.rb @@ -71,7 +71,8 @@ module Linguist generated_jni_header? || vcr_cassette? || generated_module? || - generated_unity3d_meta? + generated_unity3d_meta? || + generated_racc? end # Internal: Is the blob an Xcode file? @@ -359,5 +360,18 @@ module Linguist return false unless lines.count > 1 return lines[0].include?("fileFormatVersion: ") end + + # Internal: Is this a Racc-generated file? + # + # A Racc-generated file contains: + # # This file is automatically generated by Racc x.y.z + # on the third line. + # + # Return true or false + def generated_racc? + return false unless extname == '.rb' + return false unless lines.count > 2 + return lines[2].start_with?("# This file is automatically generated by Racc") + end end end diff --git a/samples/Ruby/racc.rb b/samples/Ruby/racc.rb new file mode 100644 index 00000000..a3e7f51c --- /dev/null +++ b/samples/Ruby/racc.rb @@ -0,0 +1,267 @@ +# +# DO NOT MODIFY!!!! +# This file is automatically generated by Racc 1.4.7 +# from Racc grammer file "". +# + +require 'racc/parser.rb' +module RJSON + class Parser < Racc::Parser + + + require 'rjson/handler' + + attr_reader :handler + + def initialize tokenizer, handler = Handler.new + @tokenizer = tokenizer + @handler = handler + super() + end + + def next_token + @tokenizer.next_token + end + + def parse + do_parse + handler + end +##### State transition tables begin ### + +racc_action_table = [ + 9, 33, 9, 11, 13, 16, 19, 22, 9, 7, + 23, 1, 9, 11, 13, 16, 19, 29, 30, 7, + 21, 1, 9, 11, 13, 16, 19, 31, nil, 7, + 21, 1, 23, 7, nil, 1 ] + +racc_action_check = [ + 6, 27, 33, 33, 33, 33, 33, 3, 31, 33, + 6, 33, 29, 29, 29, 29, 29, 12, 22, 29, + 12, 29, 2, 2, 2, 2, 2, 25, nil, 2, + 2, 2, 25, 0, nil, 0 ] + +racc_action_pointer = [ + 24, nil, 20, 7, nil, nil, -2, nil, nil, nil, + nil, nil, 10, nil, nil, nil, nil, nil, nil, nil, + nil, nil, 18, nil, nil, 20, nil, -7, nil, 10, + nil, 6, nil, 0, nil, nil, nil ] + +racc_action_default = [ + -27, -12, -21, -27, -1, -2, -27, -10, -15, -26, + -8, -22, -27, -23, -17, -16, -24, -20, -18, -25, + -19, -11, -27, -13, -3, -27, -6, -27, -9, -21, + 37, -27, -4, -21, -14, -5, -7 ] + +racc_goto_table = [ + 8, 26, 24, 27, 10, 3, 25, 5, 4, 12, + nil, nil, nil, nil, 28, nil, nil, nil, nil, nil, + nil, 32, nil, nil, nil, nil, 35, 34, 27, nil, + nil, 36 ] + +racc_goto_check = [ + 9, 7, 5, 8, 11, 1, 6, 3, 2, 12, + nil, nil, nil, nil, 11, nil, nil, nil, nil, nil, + nil, 5, nil, nil, nil, nil, 7, 9, 8, nil, + nil, 9 ] + +racc_goto_pointer = [ + nil, 5, 8, 7, nil, -4, 0, -5, -3, -2, + nil, 2, 7, nil, nil ] + +racc_goto_default = [ + nil, nil, 14, 18, 6, nil, nil, nil, 20, nil, + 2, nil, nil, 15, 17 ] + +racc_reduce_table = [ + 0, 0, :racc_error, + 1, 14, :_reduce_none, + 1, 14, :_reduce_none, + 2, 15, :_reduce_none, + 3, 15, :_reduce_none, + 3, 19, :_reduce_none, + 1, 19, :_reduce_none, + 3, 20, :_reduce_none, + 2, 16, :_reduce_none, + 3, 16, :_reduce_none, + 1, 23, :_reduce_10, + 1, 24, :_reduce_11, + 1, 17, :_reduce_12, + 1, 18, :_reduce_13, + 3, 25, :_reduce_none, + 1, 25, :_reduce_none, + 1, 22, :_reduce_none, + 1, 22, :_reduce_none, + 1, 22, :_reduce_none, + 1, 26, :_reduce_none, + 1, 26, :_reduce_20, + 0, 27, :_reduce_none, + 1, 27, :_reduce_22, + 1, 27, :_reduce_23, + 1, 27, :_reduce_24, + 1, 27, :_reduce_25, + 1, 21, :_reduce_26 ] + +racc_reduce_n = 27 + +racc_shift_n = 37 + +racc_token_table = { + false => 0, + :error => 1, + :STRING => 2, + :NUMBER => 3, + :TRUE => 4, + :FALSE => 5, + :NULL => 6, + "," => 7, + ":" => 8, + "[" => 9, + "]" => 10, + "{" => 11, + "}" => 12 } + +racc_nt_base = 13 + +racc_use_result_var = true + +Racc_arg = [ + racc_action_table, + racc_action_check, + racc_action_default, + racc_action_pointer, + racc_goto_table, + racc_goto_check, + racc_goto_default, + racc_goto_pointer, + racc_nt_base, + racc_reduce_table, + racc_token_table, + racc_shift_n, + racc_reduce_n, + racc_use_result_var ] + +Racc_token_to_s_table = [ + "$end", + "error", + "STRING", + "NUMBER", + "TRUE", + "FALSE", + "NULL", + "\",\"", + "\":\"", + "\"[\"", + "\"]\"", + "\"{\"", + "\"}\"", + "$start", + "document", + "object", + "array", + "start_object", + "end_object", + "pairs", + "pair", + "string", + "value", + "start_array", + "end_array", + "values", + "scalar", + "literal" ] + +Racc_debug_parser = false + +##### State transition tables end ##### + +# reduce 0 omitted + +# reduce 1 omitted + +# reduce 2 omitted + +# reduce 3 omitted + +# reduce 4 omitted + +# reduce 5 omitted + +# reduce 6 omitted + +# reduce 7 omitted + +# reduce 8 omitted + +# reduce 9 omitted + +def _reduce_10(val, _values, result) + @handler.start_array + result +end + +def _reduce_11(val, _values, result) + @handler.end_array + result +end + +def _reduce_12(val, _values, result) + @handler.start_object + result +end + +def _reduce_13(val, _values, result) + @handler.end_object + result +end + +# reduce 14 omitted + +# reduce 15 omitted + +# reduce 16 omitted + +# reduce 17 omitted + +# reduce 18 omitted + +# reduce 19 omitted + +def _reduce_20(val, _values, result) + @handler.scalar val[0] + result +end + +# reduce 21 omitted + +def _reduce_22(val, _values, result) + n = val[0]; result = n.count('.') > 0 ? n.to_f : n.to_i + result +end + +def _reduce_23(val, _values, result) + result = true + result +end + +def _reduce_24(val, _values, result) + result = false + result +end + +def _reduce_25(val, _values, result) + result = nil + result +end + +def _reduce_26(val, _values, result) + @handler.scalar val[0].gsub(/^"|"$/, '') + result +end + +def _reduce_none(val, _values, result) + val[0] +end + + end # class Parser + end # module RJSON diff --git a/test/test_blob.rb b/test/test_blob.rb index 1ba647b0..42ece685 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -255,6 +255,9 @@ class TestBlob < Minitest::Test # Unity3D-generated metadata assert sample_blob("Unity3D Asset/Tiles.meta").generated? + + # Racc-generated Ruby + assert sample_blob("Ruby/racc.rb").generated? end def test_vendored From e6de75d48a3e053b1108fc7377dc798247b2b3a7 Mon Sep 17 00:00:00 2001 From: Mike Walters Date: Sun, 11 Oct 2015 23:50:29 +0100 Subject: [PATCH 039/205] Add .brd extension for KiCad --- lib/linguist/languages.yml | 1 + samples/KiCad/tc14badge.brd | 14069 ++++++++++++++++++++++++++++++++++ 2 files changed, 14070 insertions(+) create mode 100644 samples/KiCad/tc14badge.brd diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 420965c4..0d5541f3 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1681,6 +1681,7 @@ KiCad: type: programming extensions: - .sch + - .brd - .kicad_pcb tm_scope: none ace_mode: text diff --git a/samples/KiCad/tc14badge.brd b/samples/KiCad/tc14badge.brd new file mode 100644 index 00000000..fea8071b --- /dev/null +++ b/samples/KiCad/tc14badge.brd @@ -0,0 +1,14069 @@ +PCBNEW-BOARD Version 1 date Fri Oct 19 11:53:05 2012 + +# Created by Pcbnew(2012-05-21 BZR 3261)-stable + +$GENERAL +encoding utf-8 +LayerCount 2 +Ly 1FFF8001 +EnabledLayers 1FFF8001 +Links 135 +NoConn 11 +Di 41844 16849 73060 58324 +Ndraw 54 +Ntrack 512 +Nzone 0 +BoardThickness 630 +Nmodule 51 +Nnets 44 +$EndGENERAL + +$SHEETDESCR +Sheet A4 11700 8267 +Title "" +Date "19 oct 2012" +Rev "" +Comp "" +Comment1 "" +Comment2 "" +Comment3 "" +Comment4 "" +$EndSHEETDESCR + +$SETUP +InternalUnit 0.000100 INCH +Layers 2 +Layer[0] Back signal +Layer[15] Front signal +TrackWidth 80 +TrackWidthList 200 +TrackWidthList 500 +TrackWidthList 1000 +TrackClearence 80 +ZoneClearence 200 +TrackMinWidth 80 +DrawSegmWidth 80 +EdgeSegmWidth 150 +ViaSize 270 +ViaDrill 130 +ViaMinSize 270 +ViaMinDrill 130 +ViaSizeList 310 160 +ViaSizeList 370 200 +ViaSizeList 420 250 +MicroViaSize 200 +MicroViaDrill 50 +MicroViasAllowed 0 +MicroViaMinSize 200 +MicroViaMinDrill 50 +TextPcbWidth 75 +TextPcbSize 300 400 +EdgeModWidth 80 +TextModSize 600 600 +TextModWidth 120 +PadSize 551 551 +PadDrill 150 +Pad2MaskClearance 80 +Pad2PasteClearanceRatio -0.12 +AuxiliaryAxisOrg 0 0 +PcbPlotParams (pcbplotparams (layerselection 284721153) (usegerberextensions true) (excludeedgelayer false) (linewidth 60) (plotframeref false) (viasonmask false) (mode 1) (useauxorigin false) (hpglpennumber 1) (hpglpenspeed 20) (hpglpendiameter 15) (hpglpenoverlay 0) (pscolor true) (psnegative false) (psa4output false) (plotreference false) (plotvalue false) (plotothertext true) (plotinvisibletext false) (padsonsilk false) (subtractmaskfromsilk false) (outputformat 1) (mirror false) (drillshape 1) (scaleselection 1) (outputdirectory "")) +$EndSETUP + +$EQUIPOT +Na 0 "" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 1 "/DC" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 2 "/DD" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 3 "/P0_0" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 4 "/P0_1" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 5 "/P0_2" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 6 "/P0_3" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 7 "/P0_4" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 8 "/P0_5" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 9 "/P1_2" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 10 "/P1_3" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 11 "/P1_4" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 12 "/P1_5" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 13 "/P1_6" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 14 "/P1_7" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 15 "/P2_0" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 16 "/P2_3" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 17 "/P2_4" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 18 "/RESET_N" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 19 "/VBUS" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 20 "3V3" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 21 "GND" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 22 "N-000023" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 23 "N-000024" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 24 "N-000026" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 25 "N-000027" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 26 "N-000028" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 27 "N-000029" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 28 "N-000030" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 29 "N-000031" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 30 "N-000032" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 31 "N-000033" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 32 "N-000034" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 33 "N-000035" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 34 "N-000037" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 35 "N-000039" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 36 "N-000041" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 37 "N-000042" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 38 "N-000043" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 39 "N-000044" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 40 "N-000045" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 41 "N-000046" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 42 "N-000047" +St ~ +$EndEQUIPOT +$EQUIPOT +Na 43 "N-000051" +St ~ +$EndEQUIPOT +$NCLASS +Name "Default" +Desc "This is the default net class." +Clearance 80 +TrackWidth 80 +ViaDia 270 +ViaDrill 130 +uViaDia 200 +uViaDrill 50 +AddNet "" +AddNet "/DC" +AddNet "/DD" +AddNet "/P0_0" +AddNet "/P0_1" +AddNet "/P0_2" +AddNet "/P0_3" +AddNet "/P0_4" +AddNet "/P0_5" +AddNet "/P1_2" +AddNet "/P1_3" +AddNet "/P1_4" +AddNet "/P1_5" +AddNet "/P1_6" +AddNet "/P1_7" +AddNet "/P2_0" +AddNet "/P2_3" +AddNet "/P2_4" +AddNet "/RESET_N" +AddNet "/VBUS" +AddNet "3V3" +AddNet "GND" +AddNet "N-000023" +AddNet "N-000024" +AddNet "N-000026" +AddNet "N-000027" +AddNet "N-000028" +AddNet "N-000029" +AddNet "N-000030" +AddNet "N-000031" +AddNet "N-000032" +AddNet "N-000033" +AddNet "N-000034" +AddNet "N-000035" +AddNet "N-000037" +AddNet "N-000039" +AddNet "N-000041" +AddNet "N-000042" +AddNet "N-000043" +AddNet "N-000044" +AddNet "N-000045" +AddNet "N-000046" +AddNet "N-000047" +AddNet "N-000051" +$EndNCLASS +$MODULE GSG-XTAL-TXC-7A +Po 61500 45500 1800 15 504D2D98 504D3AA5 ~P +Li GSG-XTAL-TXC-7A +Sc 504D3AA5 +AR /504D0F4F +Op 0 0 0 +T0 0 0 600 600 1800 120 N V 21 N "X1" +T1 0 0 600 600 1800 120 N I 21 N "CRYSTAL" +DS 984 -630 984 -551 150 21 +DS -984 -630 -984 -551 150 21 +DS -1024 630 -1024 551 150 21 +DS 984 630 984 551 150 21 +DS -1024 630 984 630 150 21 +DS -984 -630 984 -630 150 21 +$PAD +Sh "1" R 669 945 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 41 "N-000046" +Po 728 0 +$EndPAD +$PAD +Sh "2" R 669 945 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 39 "N-000044" +Po -728 0 +$EndPAD +$EndMODULE GSG-XTAL-TXC-7A +$MODULE GSG-USB-MICROB-FCI-10103594 +Po 46000 40000 0 15 4E482E27 504D3AA6 ~P +Li GSG-USB-MICROB-FCI-10103594 +Sc 504D3AA6 +AR /504CAE21 +Op 0 0 0 +T0 984 0 600 600 0 120 N V 21 N "J2" +T1 984 0 600 600 0 120 N I 21 N "GSG-USB-MICRO-B" +$PAD +Sh "1" R 689 157 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 19 "/VBUS" +Po 1781 -512 +Le 45683504 +.SolderMask 40 +.LocalClearance 80 +$EndPAD +$PAD +Sh "2" R 689 157 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 36 "N-000041" +Po 1781 -256 +Le 113 +.SolderMask 40 +.LocalClearance 80 +$EndPAD +$PAD +Sh "3" R 689 157 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 38 "N-000043" +Po 1781 0 +Le 30424768 +.SolderMask 40 +.LocalClearance 80 +$EndPAD +$PAD +Sh "4" R 689 157 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 0 "" +Po 1781 256 +Le 32 +.SolderMask 40 +.LocalClearance 80 +$EndPAD +$PAD +Sh "5" R 689 157 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 1781 512 +Le 16 +.SolderMask 40 +.LocalClearance 80 +$EndPAD +$PAD +Sh "" R 814 561 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 0 "" +Po 656 -379 +Le 45683504 +$EndPAD +$PAD +Sh "" R 814 561 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 0 "" +Po 656 379 +Le 305 +$EndPAD +$PAD +Sh "" R 571 843 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 0 "" +Po 1840 -1114 +Le 45683504 +$EndPAD +$PAD +Sh "" R 571 843 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 0 "" +Po 1840 1114 +Le 45447072 +$EndPAD +$PAD +Sh "" R 250 719 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 0 "" +Po 1327 -1176 +Le 1341 +$EndPAD +$PAD +Sh "" R 250 719 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 0 "" +Po 1327 1176 +Le 45683504 +$EndPAD +$PAD +Sh "" R 1116 630 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 0 "" +Po 894 -1083 +Le 40068352 +$EndPAD +$PAD +Sh "" R 1116 630 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 0 "" +Po 894 1083 +Le 43410648 +$EndPAD +$PAD +Sh "" C 630 630 0 0 0 +Dr 472 0 0 +At STD N 00C8FFFF +Ne 0 "" +Po 669 -1083 +Le 45683504 +$EndPAD +$PAD +Sh "" C 630 630 0 0 0 +Dr 472 0 0 +At STD N 00C8FFFF +Ne 0 "" +Po 669 1083 +Le 43410648 +$EndPAD +$PAD +Sh "" C 571 571 0 0 0 +Dr 413 0 0 +At STD N 00C8FFFF +Ne 0 "" +Po 1839 -979 +Le 46673664 +$EndPAD +$PAD +Sh "" C 571 571 0 0 0 +Dr 413 0 0 +At STD N 00C8FFFF +Ne 0 "" +Po 1839 979 +Le 113 +$EndPAD +$EndMODULE GSG-USB-MICROB-FCI-10103594 +$MODULE GSG-TESTPOINT-100MIL +Po 55154 31500 0 15 4FA2EFE0 504E11D5 ~P +Li GSG-TESTPOINT-100MIL +Kw CONN +Sc 504E11D5 +AR /504D0B60 +Op 0 0 0 +T0 0 0 400 400 0 80 N V 21 N "P4" +T1 0 0 400 400 0 80 N I 21 N "DD" +$PAD +Sh "1" C 1000 1000 0 0 0 +Dr 0 0 0 +At SMD N 00808000 +Ne 2 "/DD" +Po 0 0 +Le 33 +$EndPAD +$EndMODULE GSG-TESTPOINT-100MIL +$MODULE GSG-TESTPOINT-100MIL +Po 65193 31500 0 15 4FA2EFE0 504E11D2 ~P +Li GSG-TESTPOINT-100MIL +Kw CONN +Sc 504E11D2 +AR /504D0B65 +Op 0 0 0 +T0 0 0 400 400 0 80 N V 21 N "P7" +T1 0 0 400 400 0 80 N I 21 N "GND" +$PAD +Sh "1" C 1000 1000 0 0 0 +Dr 0 0 0 +At SMD N 00808000 +Ne 21 "GND" +Po 0 0 +Le 33 +$EndPAD +$EndMODULE GSG-TESTPOINT-100MIL +$MODULE GSG-TESTPOINT-100MIL +Po 61846 31500 0 15 4FA2EFE0 504E11CF ~P +Li GSG-TESTPOINT-100MIL +Kw CONN +Sc 504E11CF +AR /504D0B63 +Op 0 0 0 +T0 0 0 400 400 0 80 N V 21 N "P6" +T1 0 0 400 400 0 80 N I 21 N "3V3" +$PAD +Sh "1" C 1000 1000 0 0 0 +Dr 0 0 0 +At SMD N 00808000 +Ne 22 "N-000023" +Po 0 0 +Le 33 +$EndPAD +$EndMODULE GSG-TESTPOINT-100MIL +$MODULE GSG-TESTPOINT-100MIL +Po 58500 31500 0 15 4FA2EFE0 504D3AAD ~P +Li GSG-TESTPOINT-100MIL +Kw CONN +Sc 504D3AAD +AR /504D0B62 +Op 0 0 0 +T0 0 0 400 400 0 80 N V 21 N "P5" +T1 0 0 400 400 0 80 N I 21 N "DC" +$PAD +Sh "1" C 1000 1000 0 0 0 +Dr 0 0 0 +At SMD N 00808000 +Ne 1 "/DC" +Po 0 0 +Le 33 +$EndPAD +$EndMODULE GSG-TESTPOINT-100MIL +$MODULE GSG-TESTPOINT-100MIL +Po 51807 31500 0 15 4FA2EFE0 504E11D8 ~P +Li GSG-TESTPOINT-100MIL +Kw CONN +Sc 504E11D8 +AR /504D0B57 +Op 0 0 0 +T0 0 0 400 400 0 80 N V 21 N "P3" +T1 0 0 400 400 0 80 N I 21 N "RESET_N" +$PAD +Sh "1" C 1000 1000 0 0 0 +Dr 0 0 0 +At SMD N 00808000 +Ne 18 "/RESET_N" +Po 0 0 +Le 33 +$EndPAD +$EndMODULE GSG-TESTPOINT-100MIL +$MODULE GSG-SPST-FSM4JSMATR +Po 67500 36500 2700 15 4E488E6F 504D3AB0 ~P +Li GSG-SPST-FSM4JSMATR +Sc 504D3AB0 +AR /504CFDB1 +Op 0 0 0 +T0 0 0 394 394 2700 80 N V 21 N "SW1" +T1 0 0 394 394 2700 80 N I 21 N "SW_PUSH" +DC 0 0 689 0 80 21 +DS -1181 -1181 1181 -1181 80 21 +DS 1181 -1181 1181 1181 80 21 +DS 1181 1181 -1181 1181 80 21 +DS -1181 1181 -1181 -1181 80 21 +$PAD +Sh "1" R 551 827 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 9 "/P1_2" +Po 886 -1791 +$EndPAD +$PAD +Sh "1" R 551 827 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 9 "/P1_2" +Po 886 1791 +$EndPAD +$PAD +Sh "2" R 551 827 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -886 -1791 +Le 83 +$EndPAD +$PAD +Sh "2" R 551 827 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -886 1791 +Le -1429971160 +$EndPAD +$EndMODULE GSG-SPST-FSM4JSMATR +$MODULE GSG-SOT23-3 +Po 54000 38000 900 15 50516083 504D3AB1 ~P +Li GSG-SOT23-3 +Kw CMS SOT +Sc 504D3AB1 +AR /504CAD4C +Op 0 0 0 +At SMD +T0 0 -410 300 300 900 75 N V 21 N "U2" +T1 0 0 300 300 900 75 N I 21 N "AP7313" +DS -600 -150 600 -150 50 21 +DS 600 -150 600 150 50 21 +DS 600 150 -600 150 50 21 +DS -600 150 -600 -150 50 21 +$PAD +Sh "2" R 360 360 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po -350 -400 +Le 3 +$EndPAD +$PAD +Sh "1" R 360 360 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 19 "/VBUS" +Po 350 -400 +$EndPAD +$PAD +Sh "3" R 360 360 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 0 400 +Le 111 +$EndPAD +$SHAPE3D +Na "smd/cms_sot23.wrl" +Sc 0.130000 0.150000 0.150000 +Of 0.000000 0.000000 0.000000 +Ro 0.000000 0.000000 0.000000 +$EndSHAPE3D +$EndMODULE GSG-SOT23-3 +$MODULE GSG-SMA-VERTICAL +Po 67250 46200 0 15 5047A6AD 504D3AB2 ~P +Li GSG-SMA-VERTICAL +Sc 504D3AB2 +AR /504CFCB0 +Op 0 0 0 +T0 0 0 600 600 0 120 N V 21 N "P2" +T1 0 0 600 600 0 120 N I 21 N "ANTENNA" +DS -1600 -1600 -1600 1600 150 21 +DS -1600 1600 1600 1600 150 21 +DS 1600 1600 1600 -1600 150 21 +DS 1600 -1600 -1600 -1600 150 21 +$PAD +Sh "1" C 1000 1000 0 0 0 +Dr 600 0 0 +At STD N 00E0FFFF +Ne 23 "N-000024" +Po 0 0 +$EndPAD +$PAD +Sh "2" C 1000 1000 0 0 0 +Dr 670 0 0 +At STD N 00E0FFFF +Ne 21 "GND" +Po -1000 -1000 +$EndPAD +$PAD +Sh "3" C 1000 1000 0 0 0 +Dr 670 0 0 +At STD N 00E0FFFF +Ne 21 "GND" +Po -1000 1000 +$EndPAD +$PAD +Sh "4" C 1000 1000 0 0 0 +Dr 670 0 0 +At STD N 00E0FFFF +Ne 21 "GND" +Po 1000 1000 +$EndPAD +$PAD +Sh "5" C 1000 1000 0 0 0 +Dr 670 0 0 +At STD N 00E0FFFF +Ne 21 "GND" +Po 1000 -1000 +$EndPAD +$EndMODULE GSG-SMA-VERTICAL +$MODULE GSG-HEADER-2x8 +Po 59500 34500 1800 15 4F8A6071 504D3AB4 ~P +Li GSG-HEADER-2x8 +Kw CONN +Sc 504D3AB4 +AR /504CF706 +Op 0 0 0 +T0 0 0 400 400 1800 80 N V 21 N "P1" +T1 0 0 400 400 1800 80 N I 21 N "EXPANSION" +DS -4000 -1000 4000 -1000 150 21 +DS 4000 -1000 4000 1000 150 21 +DS 4000 1000 -4000 1000 150 21 +DS -3000 0 -4250 0 150 21 +DS -4250 0 -4250 1250 150 21 +DS -4250 1250 -3000 1250 150 21 +DS -3000 1250 -3000 0 150 21 +DS -4000 1000 -4000 -1000 150 21 +$PAD +Sh "1" R 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 21 "GND" +Po -3500 500 +Le 33 +$EndPAD +$PAD +Sh "2" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 3 "/P0_0" +Po -3500 -500 +Le 34735648 +$EndPAD +$PAD +Sh "3" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 4 "/P0_1" +Po -2500 500 +Le 24 +$EndPAD +$PAD +Sh "4" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 5 "/P0_2" +Po -2500 -500 +Le -1563238664 +$EndPAD +$PAD +Sh "5" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 6 "/P0_3" +Po -1500 500 +Le 48 +$EndPAD +$PAD +Sh "6" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 7 "/P0_4" +Po -1500 -500 +Le 48 +$EndPAD +$PAD +Sh "7" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 8 "/P0_5" +Po -500 500 +Le 48 +$EndPAD +$PAD +Sh "8" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 9 "/P1_2" +Po -500 -500 +Le 33 +$EndPAD +$PAD +Sh "9" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 10 "/P1_3" +Po 500 500 +Le 30841616 +$EndPAD +$PAD +Sh "10" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 11 "/P1_4" +Po 500 -500 +Le 97 +$EndPAD +$PAD +Sh "11" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 12 "/P1_5" +Po 1500 500 +Le 34831136 +$EndPAD +$PAD +Sh "12" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 13 "/P1_6" +Po 1500 -500 +Le 35604240 +$EndPAD +$PAD +Sh "13" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 14 "/P1_7" +Po 2500 500 +Le 42 +$EndPAD +$PAD +Sh "14" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 15 "/P2_0" +Po 2500 -500 +Le 17 +$EndPAD +$PAD +Sh "15" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 16 "/P2_3" +Po 3500 500 +Le 9 +$EndPAD +$PAD +Sh "16" C 600 600 0 0 1800 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 17 "/P2_4" +Po 3500 -500 +Le 99 +$EndPAD +$EndMODULE GSG-HEADER-2x8 +$MODULE GSG-HEADER-2x7 +Po 52000 43500 0 15 4F8A6053 504D3AB5 ~P +Li GSG-HEADER-2x7 +Kw CONN +Sc 504D3AB5 +AR /504CF491 +Op 0 0 0 +T0 0 0 400 400 0 80 N V 21 N "P8" +T1 0 0 400 400 0 80 N I 21 N "GOODFET" +DS -2500 0 -3750 0 150 21 +DS -3750 0 -3750 1250 150 21 +DS -3750 1250 -2500 1250 150 21 +DS -2500 1250 -2500 0 150 21 +DS -3500 1000 3500 1000 150 21 +DS 3500 1000 3500 -1000 150 21 +DS 3500 -1000 -3500 -1000 150 21 +DS -3500 1000 -3500 -1000 150 21 +$PAD +Sh "1" R 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 2 "/DD" +Po -3000 500 +Le 33 +$EndPAD +$PAD +Sh "2" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 35 "N-000039" +Po -3000 -500 +Le 34735648 +$EndPAD +$PAD +Sh "3" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 0 "" +Po -2000 500 +Le 24 +$EndPAD +$PAD +Sh "4" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 0 "" +Po -2000 -500 +Le -1563238664 +$EndPAD +$PAD +Sh "5" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 18 "/RESET_N" +Po -1000 500 +Le 48 +$EndPAD +$PAD +Sh "6" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 0 "" +Po -1000 -500 +Le 48 +$EndPAD +$PAD +Sh "7" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 1 "/DC" +Po 0 500 +Le 48 +$EndPAD +$PAD +Sh "8" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 0 "" +Po 0 -500 +Le 33 +$EndPAD +$PAD +Sh "9" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 21 "GND" +Po 1000 500 +Le 30841616 +$EndPAD +$PAD +Sh "10" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 0 "" +Po 1000 -500 +Le 97 +$EndPAD +$PAD +Sh "11" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 0 "" +Po 2000 500 +Le 34831136 +$EndPAD +$PAD +Sh "12" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 0 "" +Po 2000 -500 +Le 35604240 +$EndPAD +$PAD +Sh "13" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 0 "" +Po 3000 500 +Le 42 +$EndPAD +$PAD +Sh "14" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 0 "" +Po 3000 -500 +Le 17 +$EndPAD +$EndMODULE GSG-HEADER-2x7 +$MODULE GSG-HEADER-2x3 +Po 50000 34500 0 15 4F8A5FD1 504D3AB6 ~P +Li GSG-HEADER-2x3 +Kw CONN +Sc 504D3AB6 +AR /504D258A +Op 0 0 0 +T0 0 0 400 400 0 80 N V 21 N "P9" +T1 0 0 400 400 0 80 N I 21 N "PWR" +DS -500 0 -1750 0 150 21 +DS -1750 0 -1750 1250 150 21 +DS -1750 1250 -500 1250 150 21 +DS -500 1250 -500 0 150 21 +DS -1500 -1000 1500 -1000 150 21 +DS 1500 -1000 1500 1000 150 21 +DS 1500 1000 -1500 1000 150 21 +DS -1500 1000 -1500 -1000 150 21 +$PAD +Sh "1" R 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 21 "GND" +Po -1000 500 +Le 33 +$EndPAD +$PAD +Sh "2" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 20 "3V3" +Po -1000 -500 +Le 34735648 +$EndPAD +$PAD +Sh "3" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 21 "GND" +Po 0 500 +Le 24 +$EndPAD +$PAD +Sh "4" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 20 "3V3" +Po 0 -500 +Le -1563238664 +$EndPAD +$PAD +Sh "5" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 21 "GND" +Po 1000 500 +Le 48 +$EndPAD +$PAD +Sh "6" C 600 600 0 0 0 +Dr 400 0 0 +At STD N 00E0FFFF +Ne 20 "3V3" +Po 1000 -500 +Le 48 +$EndPAD +$EndMODULE GSG-HEADER-2x3 +$MODULE GSG-B0310J50100AHF +Po 63800 46000 2700 15 50516047 504D6841 ~P +Li GSG-B0310J50100AHF +Sc 504D6841 +AR /504C9FEC +Op 0 0 0 +T0 0 0 250 250 2700 63 N V 21 N "T1" +T1 0 0 250 250 2700 63 N I 21 N "BALUN" +DS -413 256 413 256 80 21 +DS 413 -256 -413 -256 80 21 +DC 256 0 276 20 80 21 +DS -413 -256 -413 256 80 21 +DS 413 -256 413 256 80 21 +$PAD +Sh "1" R 161 130 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 30 "N-000032" +Po 260 -195 +Le 33054512 +$EndPAD +$PAD +Sh "2" R 161 130 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 28 "N-000030" +Po 0 -195 +Le 755437432 +$EndPAD +$PAD +Sh "3" R 161 130 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 27 "N-000029" +Po -260 -195 +Le 32750520 +$EndPAD +$PAD +Sh "4" R 161 130 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 26 "N-000028" +Po -260 195 +Le 6 +$EndPAD +$PAD +Sh "5" R 161 130 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 0 "" +Po 0 195 +$EndPAD +$PAD +Sh "6" R 161 130 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 0 "" +Po 260 195 +Le 32 +$EndPAD +$EndMODULE GSG-B0310J50100AHF +$MODULE GSG-900MHZ-INVERTED-F +Po 64000 48000 1800 15 50516053 504D3AB8 ~P +Li GSG-900MHZ-INVERTED-F +Sc 504D3AB8 +AR /504C9FF3 +Op 0 0 0 +T0 7087 -2165 600 600 1800 120 N I 21 N "J1" +T1 7087 -984 600 600 1800 120 N I 21 N "GSG-900MHZ-F-ANTENNA" +$PAD +Sh "1" R 787 7874 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 29 "N-000031" +Po 0 -3937 +$EndPAD +$PAD +Sh "2" R 394 7874 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 21 "GND" +Po -2559 -3937 +Le 72 +$EndPAD +$PAD +Sh "" R 5118 394 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 0 -7677 +Le 32929184 +$EndPAD +$PAD +Sh "" R 394 4724 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 2362 -5512 +Le 33355568 +$EndPAD +$PAD +Sh "" R 2362 394 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 3346 -3346 +Le 31206400 +$EndPAD +$PAD +Sh "" R 2362 394 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 5315 -7677 +$EndPAD +$PAD +Sh "" R 2362 394 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 7283 -3346 +$EndPAD +$PAD +Sh "" R 2362 394 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 9252 -7677 +Le -1642768744 +$EndPAD +$PAD +Sh "" R 2362 394 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 11220 -3346 +$EndPAD +$PAD +Sh "" R 2362 394 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 13189 -7677 +$EndPAD +$PAD +Sh "" R 394 4724 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 4331 -5512 +Le 33355568 +$EndPAD +$PAD +Sh "" R 394 4724 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 6299 -5512 +Le 33355568 +$EndPAD +$PAD +Sh "" R 394 4724 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 8268 -5512 +Le 33355568 +$EndPAD +$PAD +Sh "" R 394 4724 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 10236 -5512 +$EndPAD +$PAD +Sh "" R 394 4724 0 0 1800 +Dr 0 0 0 +At SMD N 00008000 +Ne 0 "" +Po 12205 -5512 +Le 32929184 +$EndPAD +$EndMODULE GSG-900MHZ-INVERTED-F +$MODULE GSG-0603D +Po 65000 39000 2700 15 50516070 504D3AB9 ~P +Li GSG-0603D +Sc 504D3AB9 +AR /504CF0C2 +Op 0 0 0 +.SolderMask 40 +T0 830 0 240 240 2700 60 N V 21 N "D2" +T1 0 0 240 240 2700 60 N I 21 N "LED1" +DS -20 30 -20 -30 80 21 +DS 80 0 -80 -130 80 21 +DS -80 -130 -80 130 80 21 +DS -80 130 80 0 80 21 +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 300 0 +Le 18 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 34 "N-000037" +Po -300 0 +Le 33 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603D +$MODULE GSG-0603D +Po 56500 45000 1800 15 50516069 504D3ABB ~P +Li GSG-0603D +Sc 504D3ABB +AR /504CFE38 +Op 0 0 0 +.SolderMask 40 +T0 830 0 240 240 1800 60 N V 21 N "D3" +T1 0 0 240 240 1800 60 N I 21 N "LED2" +DS -20 30 -20 -30 80 21 +DS 80 0 -80 -130 80 21 +DS -80 -130 -80 130 80 21 +DS -80 130 80 0 80 21 +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 300 0 +Le 18 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 24 "N-000026" +Po -300 0 +Le 33 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603D +$MODULE GSG-0603D +Po 56500 46000 1800 15 50516063 504D3ABD ~P +Li GSG-0603D +Sc 504D3ABD +AR /504CFE70 +Op 0 0 0 +.SolderMask 40 +T0 850 10 240 240 1800 60 N V 21 N "D4" +T1 0 0 240 240 1800 60 N I 21 N "LED3" +DS -20 30 -20 -30 80 21 +DS 80 0 -80 -130 80 21 +DS -80 -130 -80 130 80 21 +DS -80 130 80 0 80 21 +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 300 0 +Le 18 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 25 "N-000027" +Po -300 0 +Le 33 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603D +$MODULE GSG-0603-SHORT-10MIL +Po 65000 34000 1800 15 504D2AC6 504D3ABF ~P +Li GSG-0603-SHORT-10MIL +Sc 504D3ABF +AR /504D0B94 +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 1800 60 N V 21 N "R13" +T1 0 0 240 240 1800 60 N I 21 N "0" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00808000 +Ne 22 "N-000023" +Po 300 0 +Le 33 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00808000 +Ne 20 "3V3" +Po -300 0 +Le 1380141389 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "" R 280 100 0 0 1800 +Dr 0 0 0 +At SMD N 00808000 +Ne 0 "" +Po 0 0 +Le 33 +$EndPAD +$EndMODULE GSG-0603-SHORT-10MIL +$MODULE GSG-0603-SHORT-10MIL +Po 60850 39800 0 15 504D2AC6 504D3AC1 ~P +Li GSG-0603-SHORT-10MIL +Sc 504D3AC1 +AR /504CB0EB +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 0 60 N V 21 N "R7" +T1 0 0 240 240 0 60 N I 21 N "0" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00808000 +Ne 32 "N-000034" +Po 300 0 +Le 33 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00808000 +Ne 33 "N-000035" +Po -300 0 +Le 1380141389 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "" R 280 100 0 0 0 +Dr 0 0 0 +At SMD N 00808000 +Ne 0 "" +Po 0 0 +Le 33 +$EndPAD +$EndMODULE GSG-0603-SHORT-10MIL +$MODULE GSG-0603-SHORT-10MIL +Po 50500 41500 0 15 504D2AC6 504D3AC5 ~P +Li GSG-0603-SHORT-10MIL +Sc 504D3AC5 +AR /504CF505 +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 0 60 N V 21 N "R15" +T1 0 0 240 240 0 60 N I 21 N "0" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00808000 +Ne 20 "3V3" +Po 300 0 +Le 33 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00808000 +Ne 35 "N-000039" +Po -300 0 +Le 1380141389 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "" R 280 100 0 0 0 +Dr 0 0 0 +At SMD N 00808000 +Ne 0 "" +Po 0 0 +Le 33 +$EndPAD +$EndMODULE GSG-0603-SHORT-10MIL +$MODULE GSG-0603 +Po 58000 46000 0 15 4CFF2E39 504D3AC6 ~P +Li GSG-0603 +Sc 504D3AC6 +AR /504CFE6F +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 0 60 N V 21 N "R12" +T1 0 0 240 240 0 60 N I 21 N "330" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 17 "/P2_4" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 25 "N-000027" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 58000 45000 0 15 4CFF2E39 504D3AC8 ~P +Li GSG-0603 +Sc 504D3AC8 +AR /504CFE39 +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 0 60 N V 21 N "R11" +T1 0 0 240 240 0 60 N I 21 N "330" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 16 "/P2_3" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 24 "N-000026" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 52000 45500 900 15 4CFF2E39 504D3ACA ~P +Li GSG-0603 +Sc 504D3ACA +AR /504CF38E +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 900 60 N V 21 N "R14" +T1 0 0 240 240 900 60 N I 21 N "10k" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 1 "/DC" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 57950 42300 0 15 4CFF2E39 504D3ACC ~P +Li GSG-0603 +Sc 504D3ACC +AR /504CAEA4 +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 0 60 N V 21 N "R10" +T1 0 0 240 240 0 60 N I 21 N "33" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 43 "N-000051" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 36 "N-000041" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 57650 41700 0 15 4CFF2E39 504D3ACE ~P +Li GSG-0603 +Sc 504D3ACE +AR /504CAE9B +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 0 60 N V 21 N "R9" +T1 0 0 240 240 0 60 N I 21 N "33" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 37 "N-000042" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 38 "N-000043" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 57650 41100 0 15 4CFF2E39 504D3AD0 ~P +Li GSG-0603 +Sc 504D3AD0 +AR /504CAF08 +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 0 60 N V 21 N "R8" +T1 0 0 240 240 0 60 N I 21 N "1k5" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 33 "N-000035" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 38 "N-000043" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 64000 39000 2700 15 4CFF2E39 504D3AD4 ~P +Li GSG-0603 +Sc 504D3AD4 +AR /504CF0D3 +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 2700 60 N V 21 N "R5" +T1 0 0 240 240 2700 60 N I 21 N "330" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 42 "N-000047" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 34 "N-000037" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 52750 37100 1800 15 4CFF2E39 504D3AE6 ~P +Li GSG-0603 +Sc 504D3AE6 +AR /504CAD71 +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 1800 60 N V 21 N "C15" +T1 0 0 240 240 1800 60 N I 21 N "1uF" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 19 "/VBUS" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 52750 38900 1800 15 4CFF2E39 504D3AE8 ~P +Li GSG-0603 +Sc 504D3AE8 +AR /504CAD75 +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 1800 60 N V 21 N "C16" +T1 0 0 240 240 1800 60 N I 21 N "4u7" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 64000 47100 2700 15 505160A6 504D64FA ~P +Li GSG-0603 +Sc 504D64FA +AR /504CA04A +Op 0 0 0 +.SolderMask 40 +T0 230 -20 240 240 2700 60 N V 21 N "C6" +T1 0 0 240 240 2700 60 N I 21 N "10nF" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 29 "N-000031" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 30 "N-000032" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 66250 43750 1800 15 4CFF2E39 504D3AEE ~P +Li GSG-0603 +Sc 504D3AEE +AR /504CA3D1 +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 1800 60 N V 21 N "C1" +T1 0 0 240 240 1800 60 N I 21 N "1uF" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 31 "N-000033" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 51000 45500 2700 15 4CFF2E39 504D3AF6 ~P +Li GSG-0603 +Sc 504D3AF6 +AR /504CEFF7 +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 2700 60 N V 21 N "R2" +T1 0 0 240 240 2700 60 N I 21 N "10k" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 18 "/RESET_N" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0402 +Po 65100 47100 900 15 4FB6CFE4 504D3AF7 ~P +Li GSG-0402 +Sc 504D3AF7 +AR /504CFCBE +Op 0 0 0 +.SolderMask 40 +T0 0 20 160 160 900 40 N V 21 N "D1" +T1 0 20 160 160 900 40 N I 21 N "TVS_DIODE" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 23 "N-000024" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0402 +Po 66050 44250 0 15 4FB6CFE4 504D3AD2 ~~ +Li GSG-0402 +Sc 504D3AD2 +AR /504CA8D9 +Op 0 0 0 +.SolderMask 40 +T0 0 20 160 160 0 40 N V 21 N "C2" +T1 0 20 160 160 0 40 N I 21 N "100nF" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0402 +Po 64800 45400 900 15 4FB6CFE4 504D65ED ~~ +Li GSG-0402 +Sc 504D65ED +AR /504CAA44 +Op 0 0 0 +.SolderMask 40 +T0 0 20 160 160 900 40 N V 21 N "C3" +T1 0 20 160 160 900 40 N I 21 N "220pF" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0402 +Po 64350 40850 2700 15 50515FE5 504D3AF2 ~~ +Li GSG-0402 +Sc 504D3AF2 +AR /504CA908 +Op 0 0 0 +.SolderMask 40 +T0 0 -20 160 160 2700 40 N V 21 N "C4" +T1 0 20 160 160 2700 40 N I 21 N "100nF" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0402 +Po 64400 45400 900 15 4FB6CFE4 504D683B ~~ +Li GSG-0402 +Sc 504D683B +AR /504CAA22 +Op 0 0 0 +.SolderMask 40 +T0 0 20 160 160 900 40 N V 21 N "C5" +T1 0 20 160 160 900 40 N I 21 N "10nF" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0402 +Po 64700 46300 0 15 4FB6CFE4 504D683E ~~ +Li GSG-0402 +Sc 504D683E +AR /504CA01F +Op 0 0 0 +.SolderMask 40 +T0 0 20 160 160 0 40 N V 21 N "C7" +T1 0 20 160 160 0 40 N I 21 N "10nF" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 28 "N-000030" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0402 +Po 61550 44350 0 15 4FB6CFE4 504D3AF4 ~~ +Li GSG-0402 +Sc 504D3AF4 +AR /504CA977 +Op 0 0 0 +.SolderMask 40 +T0 0 20 160 160 0 40 N V 21 N "C8" +T1 0 20 160 160 0 40 N I 21 N "10nF" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0402 +Po 63250 45450 900 15 4FB6CFE4 504D3ADA ~~ +Li GSG-0402 +Sc 504D3ADA +AR /504CA9AD +Op 0 0 0 +.SolderMask 40 +T0 0 20 160 160 900 40 N V 21 N "C9" +T1 0 20 160 160 900 40 N I 21 N "2p2" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0402 +Po 60150 45500 900 15 4FB6CFE4 504D3ADC ~~ +Li GSG-0402 +Sc 504D3ADC +AR /504CA2F0 +Op 0 0 0 +.SolderMask 40 +T0 0 20 160 160 900 40 N V 21 N "C10" +T1 0 20 160 160 900 40 N I 21 N "22pF" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 41 "N-000046" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0402 +Po 62850 45450 2700 15 50515FB0 504D3ADE ~~ +Li GSG-0402 +Sc 504D3ADE +AR /504CA2F3 +Op 0 0 0 +.SolderMask 40 +T0 0 -20 160 160 2700 40 N V 21 N "C11" +T1 0 20 160 160 2700 40 N I 21 N "22pF" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 39 "N-000044" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0402 +Po 61350 42700 0 15 4FB6CFE4 504D3AE4 ~~ +Li GSG-0402 +Sc 504D3AE4 +AR /504CA934 +Op 0 0 0 +.SolderMask 40 +T0 0 20 160 160 0 40 N V 21 N "C14" +T1 0 20 160 160 0 40 N I 21 N "100nF" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0603 +Po 64300 46800 1800 15 50515FC0 504D4803 ~~ +Li GSG-0603 +Sc 504D4803 +AR /504D4718 +Op 0 0 0 +.SolderMask 40 +T0 -140 0 240 240 1800 60 N V 21 N "C17" +T1 0 0 240 240 1800 60 N I 21 N "10nF" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 30 "N-000032" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 1800 +Dr 0 0 0 +At SMD N 00888000 +Ne 23 "N-000024" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0402 +Po 65200 45400 2700 15 50515FB8 504D3AD8 ~~ +Li GSG-0402 +Sc 504D3AD8 +AR /504CA84D +Op 0 0 0 +.SolderMask 40 +T0 0 -20 160 160 2700 40 N V 21 N "R4" +T1 0 20 160 160 2700 40 N I 21 N "56k" +DS 350 -150 350 150 80 21 +DS 350 150 -350 150 80 21 +DS -350 150 -350 -150 80 21 +DS -350 -150 350 -150 80 21 +$PAD +Sh "2" R 200 220 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 210 0 +.SolderMask 40 +$EndPAD +$PAD +Sh "1" R 200 220 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 40 "N-000045" +Po -210 0 +Le 24791752 +.SolderMask 40 +$EndPAD +$EndMODULE GSG-0402 +$MODULE GSG-0603 +Po 59200 41400 2700 15 4CFF2E39 504D3AE0 ~~ +Li GSG-0603 +Sc 504D3AE0 +AR /504CAEAF +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 2700 60 N V 21 N "C12" +T1 0 0 240 240 2700 60 N I 21 N "47pF" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 37 "N-000042" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 59200 42600 900 15 4CFF2E39 504D3AE2 ~~ +Li GSG-0603 +Sc 504D3AE2 +AR /504CAECB +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 900 60 N V 21 N "C13" +T1 0 0 240 240 900 60 N I 21 N "47pF" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 43 "N-000051" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-0603 +Po 59800 39450 900 15 4CFF2E39 504D3AC3 ~~ +Li GSG-0603 +Sc 504D3AC3 +AR /504CAF13 +Op 0 0 0 +.SolderMask 40 +T0 0 0 240 240 900 60 N V 21 N "R6" +T1 0 0 240 240 900 60 N I 21 N "0" +DS 540 -240 -540 -240 80 21 +DS -540 -240 -540 240 80 21 +DS -540 240 540 240 80 21 +DS 540 240 540 -240 80 21 +$PAD +Sh "2" R 340 340 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 300 0 +Le 226 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$PAD +Sh "1" R 340 340 0 0 900 +Dr 0 0 0 +At SMD N 00888000 +Ne 33 "N-000035" +Po -300 0 +Le 46661520 +.SolderMask 40 +.LocalClearance 70 +$EndPAD +$EndMODULE GSG-0603 +$MODULE GSG-HOLE260MIL +Po 58500 19000 0 15 5051616D 504D7CF3 ~~ +Li GSG-HOLE260MIL +Sc 504D7CF3 +AR GSG-HOLE260MIL +Op 0 0 0 +T0 0 0 394 394 0 80 N I 21 N "HOLE260MIL" +T1 0 0 394 394 0 80 N I 21 N "VAL**" +$PAD +Sh "" C 2600 2600 0 0 0 +Dr 2600 0 0 +At STD N 00C0FFFF +Ne 0 "" +Po 0 0 +Le 235021312 +$EndPAD +$EndMODULE GSG-HOLE260MIL +$MODULE GSG-QFN36 +Po 63700 43100 2700 15 504E2458 504D65EA ~~ +Li GSG-QFN36 +Sc 504D65EA +AR /504D0F40 +Op 0 0 0 +T0 0 0 600 600 2700 120 N V 21 N "U1" +T1 0 0 600 600 2700 120 N I 21 N "CC1111" +DS 1181 -906 1181 -1181 80 21 +DS 1181 -1181 906 -1181 80 21 +DS 906 1181 1181 1181 80 21 +DS 1181 1181 1181 906 80 21 +DS -1181 906 -1181 1181 80 21 +DS -1181 1181 -906 1181 80 21 +DS -1181 -906 -1181 -984 80 21 +DS -1181 -984 -984 -1181 80 21 +DS -984 -1181 -906 -1181 80 21 +$PAD +Sh "1" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 9 "/P1_2" +Po -1142 -787 +$EndPAD +$PAD +Sh "2" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po -1142 -591 +$EndPAD +$PAD +Sh "3" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 42 "N-000047" +Po -1142 -394 +$EndPAD +$PAD +Sh "4" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 32 "N-000034" +Po -1142 -197 +$EndPAD +$PAD +Sh "5" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 3 "/P0_0" +Po -1142 0 +$EndPAD +$PAD +Sh "6" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 4 "/P0_1" +Po -1142 197 +$EndPAD +$PAD +Sh "7" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 5 "/P0_2" +Po -1142 394 +$EndPAD +$PAD +Sh "8" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 6 "/P0_3" +Po -1142 591 +$EndPAD +$PAD +Sh "9" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 7 "/P0_4" +Po -1142 787 +$EndPAD +$PAD +Sh "10" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 37 "N-000042" +Po -787 1142 +$EndPAD +$PAD +Sh "11" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 43 "N-000051" +Po -591 1142 +$EndPAD +$PAD +Sh "12" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po -394 1142 +$EndPAD +$PAD +Sh "13" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 8 "/P0_5" +Po -197 1142 +$EndPAD +$PAD +Sh "14" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 15 "/P2_0" +Po 0 1142 +$EndPAD +$PAD +Sh "15" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 2 "/DD" +Po 197 1142 +$EndPAD +$PAD +Sh "16" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 1 "/DC" +Po 394 1142 +$EndPAD +$PAD +Sh "17" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 16 "/P2_3" +Po 591 1142 +$EndPAD +$PAD +Sh "18" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 17 "/P2_4" +Po 787 1142 +$EndPAD +$PAD +Sh "19" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 1142 787 +$EndPAD +$PAD +Sh "20" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 41 "N-000046" +Po 1142 591 +$EndPAD +$PAD +Sh "21" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 39 "N-000044" +Po 1142 394 +$EndPAD +$PAD +Sh "22" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 1142 197 +$EndPAD +$PAD +Sh "23" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 26 "N-000028" +Po 1142 0 +$EndPAD +$PAD +Sh "24" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 27 "N-000029" +Po 1142 -197 +$EndPAD +$PAD +Sh "25" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 1142 -394 +$EndPAD +$PAD +Sh "26" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 1142 -591 +$EndPAD +$PAD +Sh "27" O 394 110 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 40 "N-000045" +Po 1142 -787 +$EndPAD +$PAD +Sh "28" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 787 -1142 +$EndPAD +$PAD +Sh "29" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 20 "3V3" +Po 591 -1142 +$EndPAD +$PAD +Sh "30" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 31 "N-000033" +Po 394 -1142 +$EndPAD +$PAD +Sh "31" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 18 "/RESET_N" +Po 197 -1142 +$EndPAD +$PAD +Sh "32" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 14 "/P1_7" +Po 0 -1142 +$EndPAD +$PAD +Sh "33" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 13 "/P1_6" +Po -197 -1142 +$EndPAD +$PAD +Sh "34" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 12 "/P1_5" +Po -394 -1142 +$EndPAD +$PAD +Sh "35" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 11 "/P1_4" +Po -591 -1142 +$EndPAD +$PAD +Sh "36" O 394 110 0 0 0 +Dr 0 0 0 +At SMD N 00888000 +Ne 10 "/P1_3" +Po -787 -1142 +$EndPAD +$PAD +Sh "0" R 579 579 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 0 0 +$EndPAD +$PAD +Sh "0" R 579 579 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 575 0 +$EndPAD +$PAD +Sh "0" R 579 579 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -575 0 +$EndPAD +$PAD +Sh "0" R 579 579 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 0 -575 +$EndPAD +$PAD +Sh "0" R 579 579 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 0 575 +$EndPAD +$PAD +Sh "0" R 579 579 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 575 -575 +$EndPAD +$PAD +Sh "0" R 579 579 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -575 -575 +$EndPAD +$PAD +Sh "0" R 579 579 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po -575 575 +$EndPAD +$PAD +Sh "0" R 579 579 0 0 2700 +Dr 0 0 0 +At SMD N 00888000 +Ne 21 "GND" +Po 575 575 +$EndPAD +$PAD +Sh "0" C 551 551 0 0 2700 +Dr 150 0 0 +At STD N 00C0FFFF +Ne 21 "GND" +Po 575 -575 +$EndPAD +$PAD +Sh "0" C 551 551 0 0 2700 +Dr 150 0 0 +At STD N 00C0FFFF +Ne 21 "GND" +Po 0 -575 +$EndPAD +$PAD +Sh "0" C 551 551 0 0 2700 +Dr 150 0 0 +At STD N 00C0FFFF +Ne 21 "GND" +Po -575 -575 +$EndPAD +$PAD +Sh "0" C 551 551 0 0 2700 +Dr 150 0 0 +At STD N 00C0FFFF +Ne 21 "GND" +Po -575 0 +$EndPAD +$PAD +Sh "0" C 551 551 0 0 2700 +Dr 150 0 0 +At STD N 00C0FFFF +Ne 21 "GND" +Po 0 0 +$EndPAD +$PAD +Sh "0" C 551 551 0 0 2700 +Dr 150 0 0 +At STD N 00C0FFFF +Ne 21 "GND" +Po 575 0 +$EndPAD +$PAD +Sh "0" C 551 551 0 0 2700 +Dr 150 0 0 +At STD N 00C0FFFF +Ne 21 "GND" +Po -575 575 +$EndPAD +$PAD +Sh "0" C 551 551 0 0 2700 +Dr 150 0 0 +At STD N 00C0FFFF +Ne 21 "GND" +Po 0 575 +$EndPAD +$PAD +Sh "0" C 551 551 0 0 2700 +Dr 150 0 0 +At STD N 00C0FFFF +Ne 21 "GND" +Po 575 575 +$EndPAD +$EndMODULE GSG-QFN36 +$TEXTPCB +Te "P2_2" +Po 58500 33000 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "P2_1" +Po 55150 33000 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "1" +Po 50800 31500 400 500 100 0 +De 21 1 0 Normal C +$EndTEXTPCB +$DRAWSEGMENT +Po 0 56350 45500 56100 45500 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 56600 45500 56850 45500 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 65550 39150 65550 39400 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 65550 38900 65550 38650 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 63400 46450 64200 46450 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 64200 46500 64200 46200 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 63400 46500 64200 46500 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 63400 46200 63400 46500 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 3 65050 41750 65150 41850 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$TEXTPCB +Te "14" +Po 58500 49500 3500 5000 875 0 +De 20 0 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "D1" +Po 65100 47850 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "C6/C17" +Po 61500 47050 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "R6" +Po 59150 39500 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "R7" +Po 60850 39250 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "R13" +Po 65000 33450 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "R15" +Po 50500 42100 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "GND" +Po 65200 32450 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "3V3" +Po 61850 32450 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "DC" +Po 58500 32450 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "DD" +Po 55150 32450 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "RESET_N" +Po 51800 32450 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "GND" +Po 52200 35000 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "3V3" +Po 52200 34000 300 400 75 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "SW1" +Po 67500 34500 600 800 120 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "P1 EXPANSION" +Po 59500 36500 600 800 120 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "P9" +Po 50000 36500 600 800 120 0 +De 21 1 0 Normal C +$EndTEXTPCB +$DRAWSEGMENT +Po 0 65400 39150 65700 39150 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 65700 38900 65550 39100 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 65400 38900 65700 38900 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 65550 39100 65400 38900 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 56600 45650 56400 45500 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 56600 45350 56600 45650 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 56400 45500 56600 45350 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 56350 45650 56350 45350 80 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$TEXTPCB +Te "LED1" +Po 64500 38000 400 500 100 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "LED3" +Po 56500 46750 400 500 100 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "LED2" +Po 56500 44250 400 500 100 0 +De 21 1 0 Normal C +$EndTEXTPCB +$DRAWSEGMENT +Po 0 63500 47000 62500 47000 150 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 63500 47000 63250 47250 150 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 63500 47000 63250 46750 150 +De 21 0 900 0 0 +$EndDRAWSEGMENT +$TEXTPCB +Te "P2 ANTENNA" +Po 70000 45000 600 800 120 900 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "P8 GoodFET" +Po 52000 47000 600 800 120 0 +De 21 1 0 Normal C +$EndTEXTPCB +$TEXTPCB +Te "http://greatscottgadgets.com/tc14badge/" +Po 58500 54000 700 1000 150 0 +De 20 0 0 Normal C +$EndTEXTPCB +$DRAWSEGMENT +Po 0 67000 17000 50000 17000 150 +De 28 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 46000 21000 46000 53000 150 +De 28 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 71000 53000 71000 21000 150 +De 28 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 0 50000 57000 67000 57000 150 +De 28 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 2 67000 21000 67000 17000 150 +De 28 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 2 50000 21000 46000 21000 150 +De 28 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 2 50000 53000 50000 57000 150 +De 28 0 900 0 0 +$EndDRAWSEGMENT +$DRAWSEGMENT +Po 2 67000 53000 71000 53000 150 +De 28 0 900 0 0 +$EndDRAWSEGMENT +$TRACK +Po 0 62219 43494 62150 43563 80 -1 +De 15 0 1 0 0 +Po 0 52000 44000 52000 45200 80 -1 +De 15 0 1 0 C00000 +Po 0 56218 43782 60448 43782 80 -1 +De 15 0 1 0 0 +Po 0 56990 31500 56128 30638 80 -1 +De 15 0 1 0 0 +Po 0 54800 45200 52000 45200 80 -1 +De 15 0 1 0 800000 +Po 0 60667 43563 60448 43782 80 -1 +De 15 0 1 0 0 +Po 0 48800 44700 51300 44700 80 -1 +De 0 0 1 0 0 +Po 0 48500 42500 48500 44400 80 -1 +De 0 0 1 0 0 +Po 0 62558 43494 62219 43494 80 -1 +De 15 0 1 0 400000 +Po 0 48500 44400 48800 44700 80 -1 +De 0 0 1 0 0 +Po 0 52000 44000 51300 44700 80 -1 +De 0 0 1 0 400000 +Po 0 49338 38838 49338 41662 80 -1 +De 0 0 1 0 0 +Po 0 48080 37580 49338 38838 80 -1 +De 0 0 1 0 0 +Po 3 48080 37580 48080 37580 310 160 +De 15 1 1 0 0 +Po 0 48232 30638 47538 31332 80 -1 +De 15 0 1 0 0 +Po 0 47538 31332 47538 37038 80 -1 +De 15 0 1 0 0 +Po 0 56128 30638 48232 30638 80 -1 +De 15 0 1 0 0 +Po 0 54800 45200 56218 43782 80 -1 +De 15 0 1 0 0 +Po 0 56990 31500 58500 31500 80 -1 +De 15 0 1 0 800000 +Po 0 49338 41662 48500 42500 80 -1 +De 0 0 1 0 0 +Po 0 62150 43563 60667 43563 80 -1 +De 15 0 1 0 0 +Po 0 47538 37038 48080 37580 80 -1 +De 15 0 1 0 0 +Po 0 49000 44000 49500 43500 80 -1 +De 15 0 2 0 400000 +Po 0 49500 38770 49500 43500 80 -1 +De 0 0 2 0 0 +Po 0 62184 43297 62080 43401 80 -1 +De 15 0 2 0 0 +Po 0 56200 43500 56320 43620 80 -1 +De 15 0 2 0 0 +Po 0 49000 44000 49500 43500 80 -1 +De 0 0 2 0 400000 +Po 0 56320 43620 60380 43620 80 -1 +De 15 0 2 0 0 +Po 0 62184 43297 62558 43297 80 -1 +De 15 0 2 0 800000 +Po 0 54454 30800 55154 31500 80 -1 +De 15 0 2 0 800000 +Po 0 49500 43500 56200 43500 80 -1 +De 15 0 2 0 0 +Po 0 62080 43401 60599 43401 80 -1 +De 15 0 2 0 0 +Po 0 48380 37650 49500 38770 80 -1 +De 0 0 2 0 0 +Po 0 48300 30800 54454 30800 80 -1 +De 15 0 2 0 0 +Po 0 47700 31400 48300 30800 80 -1 +De 15 0 2 0 0 +Po 0 47700 36800 48080 37180 80 -1 +De 15 0 2 0 0 +Po 0 60380 43620 60599 43401 80 -1 +De 15 0 2 0 0 +Po 3 48080 37180 48080 37180 310 160 +De 15 1 2 0 0 +Po 0 47700 31400 47700 36800 80 -1 +De 15 0 2 0 0 +Po 0 48380 37480 48380 37650 80 -1 +De 0 0 2 0 0 +Po 0 48080 37180 48380 37480 80 -1 +De 0 0 2 0 0 +Po 0 63700 41958 63700 41690 80 -1 +De 15 0 3 0 400000 +Po 0 63676 41056 63000 40380 80 -1 +De 15 0 3 0 0 +Po 0 63700 41690 63676 41666 80 -1 +De 15 0 3 0 0 +Po 0 63000 40380 63000 35000 80 -1 +De 15 0 3 0 800000 +Po 0 63676 41666 63676 41056 80 -1 +De 15 0 3 0 0 +Po 0 62838 40448 62838 35818 80 -1 +De 15 0 4 0 0 +Po 0 63503 41113 62838 40448 80 -1 +De 15 0 4 0 0 +Po 0 62838 35818 62510 35490 80 -1 +De 15 0 4 0 0 +Po 0 62510 35490 62510 34510 80 -1 +De 15 0 4 0 0 +Po 0 63503 41958 63503 41113 80 -1 +De 15 0 4 0 400000 +Po 0 62510 34510 62000 34000 80 -1 +De 15 0 4 0 800000 +Po 0 62000 35210 62000 35000 80 -1 +De 15 0 5 0 800000 +Po 0 62676 35886 62000 35210 80 -1 +De 15 0 5 0 0 +Po 0 63306 41146 62676 40516 80 -1 +De 15 0 5 0 0 +Po 0 63306 41958 63306 41146 80 -1 +De 15 0 5 0 400000 +Po 0 62676 40516 62676 35886 80 -1 +De 15 0 5 0 0 +Po 0 63109 41958 63109 41179 80 -1 +De 15 0 6 0 400000 +Po 0 61500 34500 61000 34000 80 -1 +De 15 0 6 0 800000 +Po 0 61500 35500 61500 34500 80 -1 +De 15 0 6 0 0 +Po 0 63109 41179 62514 40584 80 -1 +De 15 0 6 0 0 +Po 0 62514 40584 62514 36514 80 -1 +De 15 0 6 0 0 +Po 0 62514 36514 61500 35500 80 -1 +De 15 0 6 0 0 +Po 0 62352 40652 62352 36582 80 -1 +De 15 0 7 0 0 +Po 0 62913 41958 62913 41213 80 -1 +De 15 0 7 0 400000 +Po 0 61000 35230 61000 35000 80 -1 +De 15 0 7 0 800000 +Po 0 62352 36582 61000 35230 80 -1 +De 15 0 7 0 0 +Po 0 62913 41213 62352 40652 80 -1 +De 15 0 7 0 0 +Po 0 56000 40920 56172 40748 80 -1 +De 0 0 8 0 0 +Po 0 61943 43077 60461 43077 80 -1 +De 15 0 8 0 0 +Po 3 56000 40920 56000 40920 310 160 +De 15 1 8 0 0 +Po 0 62117 42903 61943 43077 80 -1 +De 15 0 8 0 0 +Po 0 62558 42903 62117 42903 80 -1 +De 15 0 8 0 400000 +Po 0 59500 34500 60000 34000 80 -1 +De 15 0 8 0 800000 +Po 0 55841 42299 55832 42290 80 -1 +De 15 0 8 0 0 +Po 0 55841 42299 55841 41079 80 -1 +De 15 0 8 0 0 +Po 0 56350 38600 56680 38600 80 -1 +De 0 0 8 0 0 +Po 0 56172 40748 56172 38778 80 -1 +De 0 0 8 0 0 +Po 0 60242 43296 56838 43296 80 -1 +De 15 0 8 0 0 +Po 0 60461 43077 60242 43296 80 -1 +De 15 0 8 0 0 +Po 0 56838 43296 55841 42299 80 -1 +De 15 0 8 0 0 +Po 0 56172 38778 56350 38600 80 -1 +De 0 0 8 0 0 +Po 0 55841 41079 56000 40920 80 -1 +De 15 0 8 0 0 +Po 3 56680 38600 56680 38600 310 160 +De 15 1 8 0 0 +Po 0 56680 38600 59500 35780 80 -1 +De 15 0 8 0 0 +Po 0 59500 35780 59500 34500 80 -1 +De 15 0 8 0 0 +Po 0 64487 41958 64487 41683 80 -1 +De 15 0 9 0 400000 +Po 0 60850 33500 60500 33850 80 -1 +De 15 0 9 0 0 +Po 0 60500 34500 60000 35000 80 -1 +De 15 0 9 0 800000 +Po 0 63650 33500 60850 33500 80 -1 +De 15 0 9 0 0 +Po 0 64487 41683 65709 40461 80 -1 +De 15 0 9 0 0 +Po 0 64100 33950 63650 33500 80 -1 +De 15 0 9 0 0 +Po 0 64646 37386 64100 36840 80 -1 +De 15 0 9 0 0 +Po 0 65709 37386 64646 37386 80 -1 +De 15 0 9 0 400000 +Po 0 60500 33850 60500 34500 80 -1 +De 15 0 9 0 0 +Po 0 65709 40461 65709 37386 80 -1 +De 15 0 9 0 800000 +Po 0 64100 36840 64100 33950 80 -1 +De 15 0 9 0 0 +Po 0 65709 37386 69291 37386 80 -1 +De 15 0 9 0 C00000 +Po 0 67150 41200 67150 38280 80 -1 +De 15 0 10 0 0 +Po 0 64370 34270 63600 33500 80 -1 +De 0 0 10 0 0 +Po 0 63600 33500 59500 33500 80 -1 +De 0 0 10 0 0 +Po 0 67150 38280 64370 35500 80 -1 +De 0 0 10 0 0 +Po 0 66037 42313 67150 41200 80 -1 +De 15 0 10 0 0 +Po 3 67150 38280 67150 38280 310 160 +De 15 1 10 0 0 +Po 0 64842 42313 66037 42313 80 -1 +De 15 0 10 0 400000 +Po 0 64370 35500 64370 34270 80 -1 +De 0 0 10 0 0 +Po 0 59500 33500 59000 34000 80 -1 +De 0 0 10 0 800000 +Po 0 67312 38688 67440 38560 80 -1 +De 15 0 11 0 0 +Po 0 67440 38560 67440 38080 80 -1 +De 0 0 11 0 0 +Po 0 65146 42509 65180 42475 80 -1 +De 15 0 11 0 0 +Po 0 63668 33338 58902 33338 80 -1 +De 0 0 11 0 0 +Po 0 67360 38000 67100 38000 80 -1 +De 0 0 11 0 0 +Po 0 64842 42509 65146 42509 80 -1 +De 15 0 11 0 400000 +Po 0 67440 38080 67360 38000 80 -1 +De 0 0 11 0 0 +Po 0 58500 33740 58500 34500 80 -1 +De 0 0 11 0 0 +Po 0 65180 42475 66105 42475 80 -1 +De 15 0 11 0 0 +Po 0 67312 41268 67312 38688 80 -1 +De 15 0 11 0 0 +Po 0 66105 42475 67312 41268 80 -1 +De 15 0 11 0 0 +Po 0 67100 38000 64532 35432 80 -1 +De 0 0 11 0 0 +Po 0 64532 34202 63668 33338 80 -1 +De 0 0 11 0 0 +Po 0 58500 34500 59000 35000 80 -1 +De 0 0 11 0 800000 +Po 0 58902 33338 58500 33740 80 -1 +De 0 0 11 0 0 +Po 3 67440 38560 67440 38560 310 160 +De 15 1 11 0 0 +Po 0 64532 35432 64532 34202 80 -1 +De 0 0 11 0 0 +Po 0 58824 33176 58000 34000 80 -1 +De 0 0 12 0 800000 +Po 0 64694 34134 63736 33176 80 -1 +De 0 0 12 0 0 +Po 0 63736 33176 58824 33176 80 -1 +De 0 0 12 0 0 +Po 0 67740 38150 67428 37838 80 -1 +De 0 0 12 0 0 +Po 0 65174 42706 65243 42637 80 -1 +De 15 0 12 0 0 +Po 3 67600 38920 67600 38920 310 160 +De 15 1 12 0 0 +Po 0 67474 39046 67600 38920 80 -1 +De 15 0 12 0 0 +Po 0 67740 38780 67740 38150 80 -1 +De 0 0 12 0 0 +Po 0 64694 35364 64694 34134 80 -1 +De 0 0 12 0 0 +Po 0 65243 42637 66173 42637 80 -1 +De 15 0 12 0 0 +Po 0 67474 41336 67474 39046 80 -1 +De 15 0 12 0 0 +Po 0 67600 38920 67740 38780 80 -1 +De 0 0 12 0 0 +Po 0 66173 42637 67474 41336 80 -1 +De 15 0 12 0 0 +Po 0 64842 42706 65174 42706 80 -1 +De 15 0 12 0 400000 +Po 0 67168 37838 64694 35364 80 -1 +De 0 0 12 0 0 +Po 0 67428 37838 67168 37838 80 -1 +De 0 0 12 0 0 +Po 0 57500 34500 58000 35000 80 -1 +De 0 0 13 0 800000 +Po 3 67760 39280 67760 39280 310 160 +De 15 1 13 0 0 +Po 0 67236 37676 64856 35296 80 -1 +De 0 0 13 0 0 +Po 0 67902 39138 67902 38082 80 -1 +De 0 0 13 0 0 +Po 0 67636 39404 67760 39280 80 -1 +De 15 0 13 0 0 +Po 0 64856 35296 64856 34066 80 -1 +De 0 0 13 0 0 +Po 0 66241 42799 67636 41404 80 -1 +De 15 0 13 0 0 +Po 0 63804 33014 58156 33014 80 -1 +De 0 0 13 0 0 +Po 0 65207 42903 65311 42799 80 -1 +De 15 0 13 0 0 +Po 0 67636 41404 67636 39404 80 -1 +De 15 0 13 0 0 +Po 0 64842 42903 65207 42903 80 -1 +De 15 0 13 0 400000 +Po 0 67902 38082 67496 37676 80 -1 +De 0 0 13 0 0 +Po 0 58156 33014 57500 33670 80 -1 +De 0 0 13 0 0 +Po 0 67496 37676 67236 37676 80 -1 +De 0 0 13 0 0 +Po 0 67760 39280 67902 39138 80 -1 +De 0 0 13 0 0 +Po 0 65311 42799 66241 42799 80 -1 +De 15 0 13 0 0 +Po 0 57500 33670 57500 34500 80 -1 +De 0 0 13 0 0 +Po 0 64856 34066 63804 33014 80 -1 +De 0 0 13 0 0 +Po 0 66309 42961 67798 41472 80 -1 +De 15 0 14 0 0 +Po 0 65240 43100 65379 42961 80 -1 +De 15 0 14 0 0 +Po 0 65018 35228 65018 33998 80 -1 +De 0 0 14 0 0 +Po 0 67798 39762 67920 39640 80 -1 +De 15 0 14 0 0 +Po 0 68064 39496 68064 38014 80 -1 +De 0 0 14 0 0 +Po 0 57000 33940 57000 34000 80 -1 +De 0 0 14 0 800000 +Po 0 67564 37514 67304 37514 80 -1 +De 0 0 14 0 0 +Po 0 65379 42961 66309 42961 80 -1 +De 15 0 14 0 0 +Po 0 65018 33998 63872 32852 80 -1 +De 0 0 14 0 0 +Po 3 67920 39640 67920 39640 310 160 +De 15 1 14 0 0 +Po 0 63872 32852 58088 32852 80 -1 +De 0 0 14 0 0 +Po 0 67920 39640 68064 39496 80 -1 +De 0 0 14 0 0 +Po 0 68064 38014 67564 37514 80 -1 +De 0 0 14 0 0 +Po 0 58088 32852 57000 33940 80 -1 +De 0 0 14 0 0 +Po 0 67304 37514 65018 35228 80 -1 +De 0 0 14 0 0 +Po 0 64842 43100 65240 43100 80 -1 +De 15 0 14 0 400000 +Po 0 67798 41472 67798 39762 80 -1 +De 15 0 14 0 0 +Po 0 55670 40650 55700 40620 80 -1 +De 15 0 15 0 0 +Po 0 60310 43458 60529 43239 80 -1 +De 15 0 15 0 0 +Po 0 57000 37720 57000 35000 80 -1 +De 15 0 15 0 800000 +Po 0 55670 42358 55670 40650 80 -1 +De 15 0 15 0 0 +Po 3 56440 38280 56440 38280 310 160 +De 15 1 15 0 0 +Po 0 62010 43239 60529 43239 80 -1 +De 15 0 15 0 0 +Po 0 56010 38710 56440 38280 80 -1 +De 0 0 15 0 0 +Po 0 55700 40620 56010 40310 80 -1 +De 0 0 15 0 0 +Po 0 56440 38280 57000 37720 80 -1 +De 15 0 15 0 0 +Po 3 55700 40620 55700 40620 310 160 +De 15 1 15 0 0 +Po 0 62558 43100 62149 43100 80 -1 +De 15 0 15 0 400000 +Po 0 62149 43100 62010 43239 80 -1 +De 15 0 15 0 0 +Po 0 56770 43458 60310 43458 80 -1 +De 15 0 15 0 0 +Po 0 56010 40310 56010 38710 80 -1 +De 0 0 15 0 0 +Po 0 55670 42358 56770 43458 80 -1 +De 15 0 15 0 0 +Po 0 60735 43725 62225 43725 80 -1 +De 15 0 16 0 0 +Po 0 58926 43944 58300 44570 80 -1 +De 15 0 16 0 0 +Po 0 55410 40740 55410 40500 80 -1 +De 0 0 16 0 0 +Po 0 55808 38382 55808 35488 80 -1 +De 15 0 16 0 0 +Po 0 55848 38598 55720 38470 80 -1 +De 0 0 16 0 0 +Po 0 58300 44570 58300 45000 80 -1 +De 15 0 16 0 800000 +Po 0 58926 43944 60516 43944 80 -1 +De 15 0 16 0 0 +Po 0 55720 38470 55808 38382 80 -1 +De 15 0 16 0 0 +Po 0 55500 35180 55500 34500 80 -1 +De 15 0 16 0 0 +Po 0 56000 34000 55500 34500 80 -1 +De 15 0 16 0 400000 +Po 0 58140 44410 58140 43470 80 -1 +De 0 0 16 0 0 +Po 0 62259 43691 62558 43691 80 -1 +De 15 0 16 0 800000 +Po 0 55410 40500 55848 40062 80 -1 +De 0 0 16 0 0 +Po 0 62225 43725 62259 43691 80 -1 +De 15 0 16 0 0 +Po 0 58140 43470 55410 40740 80 -1 +De 0 0 16 0 0 +Po 0 55808 35488 55500 35180 80 -1 +De 15 0 16 0 0 +Po 0 60516 43944 60735 43725 80 -1 +De 15 0 16 0 0 +Po 0 58140 44410 58300 44570 80 -1 +De 0 0 16 0 0 +Po 0 55848 40062 55848 38598 80 -1 +De 0 0 16 0 0 +Po 3 55720 38470 55720 38470 310 160 +De 15 1 16 0 0 +Po 3 58300 44570 58300 44570 310 160 +De 15 1 16 0 0 +Po 0 56334 41434 56334 39066 80 -1 +De 0 0 17 0 0 +Po 0 56460 38940 56000 38480 80 -1 +De 15 0 17 0 0 +Po 0 58810 44720 58810 45490 80 -1 +De 15 0 17 0 0 +Po 0 58302 44152 58302 43402 80 -1 +De 0 0 17 0 0 +Po 0 60803 43887 60584 44106 80 -1 +De 15 0 17 0 0 +Po 0 58810 44660 58302 44152 80 -1 +De 0 0 17 0 0 +Po 0 59424 44106 59215 44315 80 -1 +De 15 0 17 0 0 +Po 0 60584 44106 59424 44106 80 -1 +De 15 0 17 0 0 +Po 0 58810 45490 58300 46000 80 -1 +De 15 0 17 0 800000 +Po 0 56000 38480 56000 35000 80 -1 +De 15 0 17 0 800000 +Po 0 58810 44720 58810 44660 80 -1 +De 0 0 17 0 0 +Po 3 58810 44720 58810 44720 310 160 +De 15 1 17 0 0 +Po 0 59215 44315 58810 44720 80 -1 +De 15 0 17 0 0 +Po 3 56460 38940 56460 38940 310 160 +De 15 1 17 0 0 +Po 0 62558 43887 60803 43887 80 -1 +De 15 0 17 0 400000 +Po 0 56334 39066 56460 38940 80 -1 +De 0 0 17 0 0 +Po 0 58302 43402 56334 41434 80 -1 +De 0 0 17 0 0 +Po 0 50500 42800 49662 41962 80 -1 +De 0 0 18 0 0 +Po 3 57640 32880 57640 32880 310 160 +De 15 1 18 0 0 +Po 0 51000 44000 50500 43500 80 -1 +De 0 0 18 0 400000 +Po 0 48542 37582 49662 38702 80 -1 +De 0 0 18 0 0 +Po 0 50500 43500 50500 42800 80 -1 +De 0 0 18 0 0 +Po 0 51807 31499 51270 30962 80 -1 +De 15 0 18 0 0 +Po 0 51807 31499 51807 31500 80 -1 +De 15 0 18 0 800000 +Po 0 67632 37352 67372 37352 80 -1 +De 0 0 18 0 0 +Po 0 49662 38702 49662 41962 80 -1 +De 0 0 18 0 0 +Po 0 65105 43297 64842 43297 80 -1 +De 15 0 18 0 800000 +Po 0 51000 44000 51000 45200 80 -1 +De 15 0 18 0 C00000 +Po 0 67960 40120 68080 40000 80 -1 +De 15 0 18 0 0 +Po 0 66377 43123 67960 41540 80 -1 +De 15 0 18 0 0 +Po 0 63940 32690 57830 32690 80 -1 +De 0 0 18 0 0 +Po 0 65308 43262 65447 43123 80 -1 +De 15 0 18 0 0 +Po 0 65140 43262 65308 43262 80 -1 +De 15 0 18 0 0 +Po 0 65105 43297 65140 43262 80 -1 +De 15 0 18 0 0 +Po 0 67960 41540 67960 40120 80 -1 +De 15 0 18 0 0 +Po 0 57830 32690 57640 32880 80 -1 +De 0 0 18 0 0 +Po 0 47900 31430 47900 36560 80 -1 +De 15 0 18 0 0 +Po 0 51270 30962 48368 30962 80 -1 +De 15 0 18 0 0 +Po 0 48480 37140 48542 37202 80 -1 +De 0 0 18 0 0 +Po 0 68226 39854 68226 37946 80 -1 +De 0 0 18 0 0 +Po 3 48480 37140 48480 37140 310 160 +De 15 1 18 0 0 +Po 0 47900 36560 48480 37140 80 -1 +De 15 0 18 0 0 +Po 0 67372 37352 65180 35160 80 -1 +De 0 0 18 0 0 +Po 3 68080 40000 68080 40000 310 160 +De 15 1 18 0 0 +Po 0 68226 37946 67632 37352 80 -1 +De 0 0 18 0 0 +Po 0 48368 30962 47900 31430 80 -1 +De 15 0 18 0 0 +Po 0 48542 37202 48542 37582 80 -1 +De 0 0 18 0 0 +Po 0 68080 40000 68226 39854 80 -1 +De 0 0 18 0 0 +Po 0 65180 33930 63940 32690 80 -1 +De 0 0 18 0 0 +Po 0 65447 43123 66377 43123 80 -1 +De 15 0 18 0 0 +Po 0 51807 31500 53367 33060 80 -1 +De 15 0 18 0 400000 +Po 0 65180 35160 65180 33930 80 -1 +De 0 0 18 0 0 +Po 0 57460 33060 53367 33060 80 -1 +De 15 0 18 0 0 +Po 0 57640 32880 57460 33060 80 -1 +De 15 0 18 0 0 +Po 0 53050 37210 52610 37650 200 -1 +De 15 0 19 0 0 +Po 0 53050 37100 53600 37650 200 -1 +De 15 0 19 0 C00000 +Po 0 53050 37210 53050 37100 200 -1 +De 15 0 19 0 800000 +Po 0 50210 37650 48500 39360 500 -1 +De 15 0 19 0 0 +Po 0 48372 39488 48500 39360 80 -1 +De 15 0 19 0 0 +Po 0 48500 39360 48490 39360 200 -1 +De 15 0 19 0 0 +Po 0 47781 39488 48372 39488 80 -1 +De 15 0 19 0 400000 +Po 0 52610 37650 50210 37650 500 -1 +De 15 0 19 0 0 +Po 0 60200 40550 60200 40300 200 -1 +De 15 0 20 0 0 +Po 3 64340 41430 64340 41430 310 160 +De 15 1 20 0 0 +Po 3 53050 38350 53050 38350 420 250 +De 15 1 20 0 0 +Po 0 61690 44350 61260 44780 200 -1 +De 0 0 20 0 0 +Po 0 65300 34000 65750 34000 200 -1 +De 15 0 20 0 400000 +Po 0 65500 44250 65330 44080 200 -1 +De 15 0 20 0 0 +Po 0 62690 44350 62850 44350 80 -1 +De 15 0 20 0 0 +Po 0 61926 42706 61920 42700 80 -1 +De 15 0 20 0 0 +Po 0 64291 44242 64291 44451 80 -1 +De 15 0 20 0 400000 +Po 0 66000 43000 67500 43000 200 -1 +De 0 0 20 0 0 +Po 0 53050 38900 53050 38350 200 -1 +De 15 0 20 0 400000 +Po 0 62558 42706 61926 42706 80 -1 +De 15 0 20 0 400000 +Po 0 60200 40300 59800 39900 200 -1 +De 0 0 20 0 0 +Po 3 65500 41600 65500 41600 420 250 +De 15 1 20 0 0 +Po 0 64291 44451 64460 44620 80 -1 +De 15 0 20 0 0 +Po 0 61450 42230 61920 42700 200 -1 +De 0 0 20 0 0 +Po 0 64460 44620 64660 44620 80 -1 +De 15 0 20 0 0 +Po 0 64800 44760 64660 44620 200 -1 +De 15 0 20 0 0 +Po 0 60350 44590 59730 44590 200 -1 +De 0 0 20 0 0 +Po 0 65840 44250 65500 44250 200 -1 +De 15 0 20 0 400000 +Po 0 64660 44620 64790 44620 200 -1 +De 0 0 20 0 0 +Po 0 53100 38400 53100 40500 200 -1 +De 0 0 20 0 0 +Po 0 62280 44350 62690 44350 200 -1 +De 15 0 20 0 0 +Po 0 65170 43920 65170 43800 200 -1 +De 15 0 20 0 0 +Po 3 59800 38550 59800 38550 420 250 +De 15 1 20 0 0 +Po 3 64660 44620 64660 44620 310 160 +De 15 1 20 0 0 +Po 3 59730 44590 59730 44590 420 250 +De 15 1 20 0 0 +Po 0 64291 41479 64340 41430 80 -1 +De 15 0 20 0 0 +Po 0 64340 41430 65330 41430 200 -1 +De 0 0 20 0 0 +Po 0 62913 44242 62913 44287 80 -1 +De 15 0 20 0 400000 +Po 0 64400 44880 64660 44620 200 -1 +De 0 0 20 0 0 +Po 0 63250 44940 62870 44940 200 -1 +De 0 0 20 0 0 +Po 0 61920 42700 61560 42700 200 -1 +De 15 0 20 0 800000 +Po 3 61450 41800 61450 41800 420 250 +De 15 1 20 0 0 +Po 0 63250 44940 63250 44854 200 -1 +De 15 0 20 0 0 +Po 0 63503 44601 63347 44757 80 -1 +De 15 0 20 0 0 +Po 0 65330 41430 65500 41600 200 -1 +De 0 0 20 0 0 +Po 0 62850 44350 62913 44287 80 -1 +De 15 0 20 0 0 +Po 0 59800 38550 59800 39900 200 -1 +De 0 0 20 0 0 +Po 0 65083 43887 65170 43800 80 -1 +De 15 0 20 0 0 +Po 0 61450 41800 61450 42230 200 -1 +De 0 0 20 0 0 +Po 3 65750 34000 65750 34000 420 250 +De 15 1 20 0 0 +Po 0 63250 44854 63347 44757 200 -1 +De 15 0 20 0 0 +Po 0 65170 43920 65330 44080 200 -1 +De 15 0 20 0 0 +Po 0 62280 44350 61760 44350 200 -1 +De 15 0 20 0 800000 +Po 3 63250 44940 63250 44940 310 160 +De 15 1 20 0 0 +Po 0 53050 38900 53600 38350 200 -1 +De 15 0 20 0 C00000 +Po 3 65330 44080 65330 44080 310 160 +De 15 1 20 0 0 +Po 0 50800 41500 51250 41500 200 -1 +De 15 0 20 0 400000 +Po 0 63250 44940 63250 45240 200 -1 +De 15 0 20 0 800000 +Po 3 60200 40300 60200 40300 420 250 +De 15 1 20 0 0 +Po 0 64400 44900 64400 44880 200 -1 +De 0 0 20 0 0 +Po 0 64842 43691 65061 43691 80 -1 +De 15 0 20 0 400000 +Po 3 53100 40500 53100 40500 420 250 +De 15 1 20 0 0 +Po 3 64400 44900 64400 44900 310 160 +De 15 1 20 0 0 +Po 3 51250 41500 51250 41500 420 250 +De 15 1 20 0 0 +Po 0 61260 44780 60540 44780 200 -1 +De 0 0 20 0 0 +Po 0 65330 44080 65330 43670 200 -1 +De 0 0 20 0 0 +Po 0 64350 41420 64340 41430 200 -1 +De 15 0 20 0 0 +Po 0 65330 43670 66000 43000 200 -1 +De 0 0 20 0 0 +Po 0 64842 43887 65083 43887 80 -1 +De 15 0 20 0 400000 +Po 0 65061 43691 65170 43800 80 -1 +De 15 0 20 0 0 +Po 0 63503 44242 63503 44601 80 -1 +De 15 0 20 0 400000 +Po 0 62280 44350 61690 44350 200 -1 +De 0 0 20 0 0 +Po 0 62870 44940 62280 44350 200 -1 +De 0 0 20 0 0 +Po 0 60540 44780 60350 44590 200 -1 +De 0 0 20 0 0 +Po 0 64094 44614 64160 44680 80 -1 +De 15 0 20 0 0 +Po 3 67500 43000 67500 43000 420 250 +De 15 1 20 0 0 +Po 0 64400 44900 64380 44900 200 -1 +De 15 0 20 0 0 +Po 0 64291 41479 64291 41958 80 -1 +De 15 0 20 0 800000 +Po 0 64380 44900 64160 44680 200 -1 +De 15 0 20 0 0 +Po 0 64400 44900 64400 45190 200 -1 +De 15 0 20 0 800000 +Po 0 53050 38350 53100 38400 200 -1 +De 0 0 20 0 0 +Po 0 61450 41800 60200 40550 200 -1 +De 15 0 20 0 0 +Po 0 64790 44620 65330 44080 200 -1 +De 0 0 20 0 0 +Po 0 64094 44242 64094 44614 80 -1 +De 15 0 20 0 400000 +Po 3 62280 44350 62280 44350 310 160 +De 15 1 20 0 0 +Po 0 64800 44760 64800 45190 200 -1 +De 15 0 20 0 800000 +Po 3 61920 42700 61920 42700 310 160 +De 15 1 20 0 0 +Po 0 64350 41060 64350 41420 200 -1 +De 15 0 20 0 400000 +Po 0 63125 42525 64275 42525 1000 -1 +De 0 0 21 0 C00000 +Po 0 64400 45610 64400 45780 200 -1 +De 15 0 21 0 400000 +Po 3 65280 45860 65280 45860 310 160 +De 15 1 21 0 0 +Po 0 55760 45000 55750 44990 200 -1 +De 15 0 21 0 0 +Po 0 65200 45780 65280 45860 200 -1 +De 15 0 21 0 0 +Po 0 65200 45610 65200 45780 200 -1 +De 15 0 21 0 400000 +Po 3 64480 45860 64480 45860 310 160 +De 15 1 21 0 0 +Po 0 64800 45780 64880 45860 200 -1 +De 15 0 21 0 0 +Po 0 59200 42900 59650 42900 200 -1 +De 15 0 21 0 400000 +Po 0 64800 45610 64800 45780 200 -1 +De 15 0 21 0 400000 +Po 3 64880 45860 64880 45860 310 160 +De 15 1 21 0 0 +Po 0 65709 35614 65709 35041 200 -1 +De 15 0 21 0 400000 +Po 0 63125 42525 64275 43675 500 -1 +De 0 0 21 0 C00000 +Po 0 64275 42525 64275 43675 1000 -1 +De 0 0 21 0 C00000 +Po 3 64350 40190 64350 40190 420 250 +De 15 1 21 0 0 +Po 0 65100 47310 64900 47310 200 -1 +De 15 0 21 0 400000 +Po 0 56200 46000 55750 46000 200 -1 +De 15 0 21 0 400000 +Po 0 54400 38000 54850 38000 200 -1 +De 15 0 21 0 400000 +Po 3 66560 44250 66560 44250 310 160 +De 15 1 21 0 0 +Po 3 65000 39750 65000 39750 420 250 +De 15 1 21 0 0 +Po 3 60150 44990 60150 44990 310 160 +De 15 1 21 0 0 +Po 0 48420 40510 50290 40510 500 -1 +De 15 0 21 0 0 +Po 0 61340 44350 60940 44350 200 -1 +De 15 0 21 0 400000 +Po 0 69291 35614 69291 35049 200 -1 +De 15 0 21 0 400000 +Po 0 66559 51937 66559 47509 200 -1 +De 15 0 21 0 400000 +Po 3 59650 41100 59650 41100 420 250 +De 15 1 21 0 0 +Po 0 56200 45000 55760 45000 200 -1 +De 15 0 21 0 400000 +Po 0 48418 40512 48420 40510 80 -1 +De 15 0 21 0 0 +Po 3 65210 46300 65210 46300 310 160 +De 15 1 21 0 0 +Po 0 64910 46300 65210 46300 200 -1 +De 15 0 21 0 400000 +Po 0 65193 31500 65200 31500 200 -1 +De 15 0 21 0 400000 +Po 3 62850 45960 62850 45960 310 160 +De 15 1 21 0 0 +Po 0 63250 45660 63250 45960 200 -1 +De 15 0 21 0 400000 +Po 0 64275 43675 63125 43675 1000 -1 +De 0 0 21 0 C00000 +Po 0 65200 31500 65900 32200 200 -1 +De 15 0 21 0 0 +Po 0 69291 35049 69300 35040 200 -1 +De 15 0 21 0 0 +Po 3 50300 40500 50300 40500 420 250 +De 15 1 21 0 0 +Po 3 54850 38000 54850 38000 420 250 +De 15 1 21 0 0 +Po 3 60690 42710 60690 42710 420 250 +De 15 1 21 0 0 +Po 3 65900 32200 65900 32200 420 250 +De 15 1 21 0 0 +Po 3 60940 44350 60940 44350 420 250 +De 15 1 21 0 0 +Po 0 64400 45780 64480 45860 200 -1 +De 15 0 21 0 0 +Po 3 64800 47410 64800 47410 310 160 +De 15 1 21 0 0 +Po 0 65000 39300 65000 39750 200 -1 +De 15 0 21 0 400000 +Po 0 66260 44250 66560 44250 80 -1 +De 15 0 21 0 400000 +Po 0 60150 45290 60150 44990 200 -1 +De 15 0 21 0 400000 +Po 0 60700 42700 60690 42710 200 -1 +De 15 0 21 0 0 +Po 3 69300 35040 69300 35040 420 250 +De 15 1 21 0 0 +Po 0 63125 43675 64275 42525 500 -1 +De 0 0 21 0 C00000 +Po 3 55750 46000 55750 46000 420 250 +De 15 1 21 0 0 +Po 3 65710 35040 65710 35040 420 250 +De 15 1 21 0 0 +Po 0 50290 40510 50300 40500 500 -1 +De 15 0 21 0 0 +Po 3 55750 44990 55750 44990 420 250 +De 15 1 21 0 0 +Po 0 63125 43675 63125 42525 1000 -1 +De 0 0 21 0 C00000 +Po 0 65709 35041 65710 35040 200 -1 +De 15 0 21 0 0 +Po 3 59650 42900 59650 42900 420 250 +De 15 1 21 0 0 +Po 3 52000 38900 52000 38900 420 250 +De 15 1 21 0 0 +Po 0 66550 43750 67000 43750 200 -1 +De 15 0 21 0 400000 +Po 0 52450 38900 52000 38900 200 -1 +De 15 0 21 0 400000 +Po 3 67000 43750 67000 43750 420 250 +De 15 1 21 0 0 +Po 0 47781 40512 48418 40512 80 -1 +De 15 0 21 0 400000 +Po 0 61140 42700 60700 42700 200 -1 +De 15 0 21 0 400000 +Po 0 64900 47310 64800 47410 200 -1 +De 15 0 21 0 0 +Po 3 52450 36650 52450 36650 420 250 +De 15 1 21 0 0 +Po 3 48420 40510 48420 40510 420 250 +De 15 1 21 0 0 +Po 0 52450 37100 52450 36650 200 -1 +De 15 0 21 0 400000 +Po 0 59200 41100 59650 41100 200 -1 +De 15 0 21 0 400000 +Po 0 62850 45660 62850 45960 200 -1 +De 15 0 21 0 400000 +Po 0 66559 47509 66250 47200 200 -1 +De 15 0 21 0 800000 +Po 3 63250 45960 63250 45960 310 160 +De 15 1 21 0 0 +Po 0 64350 40640 64350 40190 200 -1 +De 15 0 21 0 400000 +Po 0 61846 31500 62200 31500 80 -1 +De 15 0 22 0 400000 +Po 0 62200 31500 64700 34000 80 -1 +De 15 0 22 0 800000 +Po 0 64600 46800 65450 46800 500 -1 +De 15 0 23 0 400000 +Po 0 66050 46200 67250 46200 500 -1 +De 15 0 23 0 800000 +Po 0 65450 46800 66050 46200 500 -1 +De 15 0 23 0 0 +Po 0 64690 46890 64600 46800 80 -1 +De 15 0 23 0 800000 +Po 0 65100 46890 64690 46890 80 -1 +De 15 0 23 0 400000 +Po 0 57700 45000 56800 45000 80 -1 +De 15 0 24 0 C00000 +Po 0 56800 46000 57700 46000 80 -1 +De 15 0 25 0 C00000 +Po 0 63605 45575 63605 44915 200 -1 +De 15 0 26 0 0 +Po 0 63605 45740 63605 45575 80 -1 +De 15 0 26 0 400000 +Po 0 63700 44820 63605 44915 80 -1 +De 15 0 26 0 0 +Po 0 63700 44242 63700 44820 80 -1 +De 15 0 26 0 400000 +Po 0 63995 45575 63995 44925 200 -1 +De 15 0 27 0 0 +Po 0 63897 44242 63897 44827 80 -1 +De 15 0 27 0 400000 +Po 0 63897 44827 63995 44925 80 -1 +De 15 0 27 0 0 +Po 0 63995 45740 63995 45575 80 -1 +De 15 0 27 0 400000 +Po 0 64140 46000 64160 46020 80 -1 +De 15 0 28 0 0 +Po 0 64440 46300 64490 46300 200 -1 +De 15 0 28 0 800000 +Po 0 63995 46000 64140 46000 80 -1 +De 15 0 28 0 400000 +Po 0 64440 46300 64160 46020 200 -1 +De 15 0 28 0 0 +Po 0 64000 47400 64000 51937 500 -1 +De 15 0 29 0 C00000 +Po 0 64000 46265 63995 46260 80 -1 +De 15 0 30 0 800000 +Po 0 64000 46800 64000 46550 500 -1 +De 15 0 30 0 400000 +Po 0 64000 46550 64000 46265 80 -1 +De 15 0 30 0 0 +Po 0 64842 43494 65204 43494 80 -1 +De 15 0 31 0 400000 +Po 0 65280 43500 65210 43500 200 -1 +De 15 0 31 0 0 +Po 0 65530 43750 65280 43500 200 -1 +De 15 0 31 0 0 +Po 0 65530 43750 65950 43750 200 -1 +De 15 0 31 0 800000 +Po 0 65204 43494 65210 43500 80 -1 +De 15 0 31 0 0 +Po 0 63897 41958 63897 41639 80 -1 +De 15 0 32 0 400000 +Po 0 61620 39800 61150 39800 80 -1 +De 15 0 32 0 800000 +Po 0 62060 40240 61620 39800 80 -1 +De 15 0 32 0 0 +Po 3 62060 40240 62060 40240 310 160 +De 15 1 32 0 0 +Po 0 63260 40240 62060 40240 80 -1 +De 0 0 32 0 0 +Po 0 63280 40260 63260 40240 80 -1 +De 0 0 32 0 0 +Po 3 63280 40260 63280 40260 310 160 +De 15 1 32 0 0 +Po 0 63280 40430 63280 40260 80 -1 +De 15 0 32 0 0 +Po 0 63838 40988 63280 40430 80 -1 +De 15 0 32 0 0 +Po 0 63838 41580 63838 40988 80 -1 +De 15 0 32 0 0 +Po 0 63897 41639 63838 41580 80 -1 +De 15 0 32 0 0 +Po 0 57950 41100 57950 40700 80 -1 +De 15 0 33 0 400000 +Po 0 58900 39750 59800 39750 80 -1 +De 15 0 33 0 800000 +Po 0 57950 40700 58900 39750 80 -1 +De 15 0 33 0 0 +Po 0 59850 39800 59800 39750 80 -1 +De 15 0 33 0 800000 +Po 0 60550 39800 59850 39800 80 -1 +De 15 0 33 0 400000 +Po 0 64000 38700 65000 38700 80 -1 +De 15 0 34 0 C00000 +Po 0 49000 42260 49760 41500 200 -1 +De 15 0 35 0 0 +Po 0 49000 43000 49000 42260 200 -1 +De 15 0 35 0 400000 +Po 0 49760 41500 50200 41500 200 -1 +De 15 0 35 0 800000 +Po 0 47781 39744 56644 39744 80 -1 +De 15 0 36 0 400000 +Po 0 57650 40750 57650 42300 80 -1 +De 15 0 36 0 800000 +Po 0 56644 39744 57650 40750 80 -1 +De 15 0 36 0 0 +Po 0 57950 41700 59200 41700 80 -1 +De 15 0 37 0 C00000 +Po 0 62558 42313 62293 42313 80 -1 +De 15 0 37 0 400000 +Po 0 59638 42138 59200 41700 80 -1 +De 15 0 37 0 800000 +Po 0 62293 42313 62118 42138 80 -1 +De 15 0 37 0 0 +Po 0 62118 42138 59638 42138 80 -1 +De 15 0 37 0 0 +Po 0 48356 40000 48450 39906 80 -1 +De 15 0 38 0 0 +Po 0 56576 39906 57350 40680 80 -1 +De 15 0 38 0 0 +Po 0 47781 40000 48356 40000 80 -1 +De 15 0 38 0 400000 +Po 0 57350 41100 57350 41700 80 -1 +De 15 0 38 0 C00000 +Po 0 48450 39906 56576 39906 80 -1 +De 15 0 38 0 0 +Po 0 57350 40680 57350 41100 80 -1 +De 15 0 38 0 800000 +Po 0 62850 44940 62850 45240 80 -1 +De 15 0 39 0 800000 +Po 0 62488 45240 62228 45500 80 -1 +De 15 0 39 0 800000 +Po 0 62850 45240 62488 45240 80 -1 +De 15 0 39 0 400000 +Po 0 63306 44242 63306 44484 80 -1 +De 15 0 39 0 400000 +Po 0 63306 44484 62850 44940 80 -1 +De 15 0 39 0 0 +Po 0 65200 44680 64790 44270 200 -1 +De 15 0 40 0 0 +Po 0 64700 44270 64515 44270 80 -1 +De 15 0 40 0 0 +Po 0 64790 44270 64700 44270 200 -1 +De 15 0 40 0 0 +Po 0 65200 45190 65200 44680 200 -1 +De 15 0 40 0 400000 +Po 0 64515 44270 64487 44242 80 -1 +De 15 0 40 0 800000 +Po 0 60772 45368 60772 45500 80 -1 +De 15 0 41 0 800000 +Po 0 63109 44451 62780 44780 80 -1 +De 15 0 41 0 0 +Po 0 63109 44242 63109 44451 80 -1 +De 15 0 41 0 400000 +Po 0 62780 44780 61360 44780 80 -1 +De 15 0 41 0 0 +Po 0 60150 45710 60562 45710 80 -1 +De 15 0 41 0 400000 +Po 0 61360 44780 60772 45368 80 -1 +De 15 0 41 0 0 +Po 0 60562 45710 60772 45500 80 -1 +De 15 0 41 0 800000 +Po 0 64000 39300 64000 41490 80 -1 +De 15 0 42 0 400000 +Po 0 64094 41584 64094 41958 80 -1 +De 15 0 42 0 800000 +Po 0 64000 41490 64094 41584 80 -1 +De 15 0 42 0 0 +Po 0 58250 42300 59200 42300 80 -1 +De 15 0 43 0 C00000 +Po 0 62558 42509 62259 42509 80 -1 +De 15 0 43 0 400000 +Po 0 62050 42300 59200 42300 80 -1 +De 15 0 43 0 800000 +Po 0 62259 42509 62050 42300 80 -1 +De 15 0 43 0 0 +$EndTRACK +$ZONE +$EndZONE +$CZONE_OUTLINE +ZInfo 504D73B4 21 "GND" +ZLayer 0 +ZAux 4 E +ZClearance 200 T +ZMinThickness 100 +ZOptions 0 16 F 120 200 +ZSmoothing 0 0 +ZCorner 70500 48000 0 +ZCorner 70500 21500 0 +ZCorner 46500 21500 0 +ZCorner 46500 48000 1 +$POLYSCORNERS +63771 43100 0 0 +63700 43171 0 0 +63629 43100 0 0 +63700 43029 0 0 +63771 43100 1 0 +70450 47950 0 0 +68911 47950 0 0 +68911 47307 0 0 +68911 45307 0 0 +68902 45046 0 0 +68820 44848 0 0 +68728 44793 0 0 +68657 44864 0 0 +68657 44722 0 0 +68602 44630 0 0 +68516 44598 0 0 +68516 39854 0 0 +68516 37946 0 0 +68494 37835 0 0 +68431 37741 0 0 +67837 37147 0 0 +67743 37084 0 0 +67632 37062 0 0 +67492 37062 0 0 +65470 35040 0 0 +65470 34370 0 0 +65489 34390 0 0 +65658 34460 0 0 +65841 34460 0 0 +66010 34390 0 0 +66140 34261 0 0 +66210 34092 0 0 +66210 33909 0 0 +66140 33740 0 0 +66011 33610 0 0 +65842 33540 0 0 +65659 33540 0 0 +65490 33610 0 0 +65380 33719 0 0 +64145 32485 0 0 +64051 32422 0 0 +63940 32400 0 0 +57830 32400 0 0 +57719 32422 0 0 +57687 32443 0 0 +57637 32476 0 0 +57560 32476 0 0 +57411 32537 0 0 +57298 32651 0 0 +57236 32799 0 0 +57236 32960 0 0 +57297 33109 0 0 +57359 33170 0 0 +57078 33451 0 0 +56891 33451 0 0 +56689 33535 0 0 +56535 33689 0 0 +56500 33773 0 0 +56465 33689 0 0 +56311 33535 0 0 +56109 33451 0 0 +55891 33451 0 0 +55689 33535 0 0 +55535 33689 0 0 +55451 33891 0 0 +55451 34109 0 0 +55535 34311 0 0 +55689 34465 0 0 +55773 34500 0 0 +55689 34535 0 0 +55535 34689 0 0 +55451 34891 0 0 +55451 35109 0 0 +55535 35311 0 0 +55689 35465 0 0 +55891 35549 0 0 +56109 35549 0 0 +56311 35465 0 0 +56465 35311 0 0 +56500 35226 0 0 +56535 35311 0 0 +56689 35465 0 0 +56891 35549 0 0 +57109 35549 0 0 +57311 35465 0 0 +57465 35311 0 0 +57500 35226 0 0 +57535 35311 0 0 +57689 35465 0 0 +57891 35549 0 0 +58109 35549 0 0 +58311 35465 0 0 +58465 35311 0 0 +58500 35226 0 0 +58535 35311 0 0 +58689 35465 0 0 +58891 35549 0 0 +59109 35549 0 0 +59311 35465 0 0 +59465 35311 0 0 +59500 35226 0 0 +59535 35311 0 0 +59689 35465 0 0 +59891 35549 0 0 +60109 35549 0 0 +60311 35465 0 0 +60465 35311 0 0 +60500 35226 0 0 +60535 35311 0 0 +60689 35465 0 0 +60891 35549 0 0 +61109 35549 0 0 +61311 35465 0 0 +61465 35311 0 0 +61500 35226 0 0 +61535 35311 0 0 +61689 35465 0 0 +61891 35549 0 0 +62109 35549 0 0 +62311 35465 0 0 +62465 35311 0 0 +62500 35226 0 0 +62535 35311 0 0 +62689 35465 0 0 +62891 35549 0 0 +63109 35549 0 0 +63311 35465 0 0 +63465 35311 0 0 +63549 35109 0 0 +63549 34891 0 0 +63465 34689 0 0 +63311 34535 0 0 +63154 34470 0 0 +63334 34470 0 0 +63396 34444 0 0 +63444 34396 0 0 +63470 34334 0 0 +63470 34266 0 0 +63470 34092 0 0 +63428 34050 0 0 +63100 34050 0 0 +63050 34050 0 0 +62950 34050 0 0 +62950 33950 0 0 +63050 33950 0 0 +63100 33950 0 0 +63428 33950 0 0 +63470 33908 0 0 +63470 33790 0 0 +63480 33790 0 0 +64080 34390 0 0 +64080 35500 0 0 +64102 35611 0 0 +64165 35705 0 0 +66746 38286 0 0 +66746 38360 0 0 +66807 38509 0 0 +66921 38622 0 0 +67050 38676 0 0 +67097 38789 0 0 +67196 38887 0 0 +67196 39000 0 0 +67257 39149 0 0 +67356 39247 0 0 +67356 39360 0 0 +67417 39509 0 0 +67516 39607 0 0 +67516 39720 0 0 +67577 39869 0 0 +67676 39967 0 0 +67676 40080 0 0 +67737 40229 0 0 +67851 40342 0 0 +67999 40404 0 0 +68160 40404 0 0 +68309 40343 0 0 +68422 40229 0 0 +68484 40081 0 0 +68484 39979 0 0 +68494 39965 0 0 +68516 39854 0 0 +68516 44598 0 0 +68357 44539 0 0 +68096 44548 0 0 +67960 44604 0 0 +67960 43092 0 0 +67960 42909 0 0 +67890 42740 0 0 +67761 42610 0 0 +67592 42540 0 0 +67409 42540 0 0 +67240 42610 0 0 +67199 42650 0 0 +66000 42650 0 0 +65960 42658 0 0 +65960 41692 0 0 +65960 41509 0 0 +65890 41340 0 0 +65761 41210 0 0 +65592 41140 0 0 +65513 41140 0 0 +65464 41107 0 0 +65330 41080 0 0 +64549 41080 0 0 +64421 41026 0 0 +64260 41026 0 0 +64111 41087 0 0 +63998 41201 0 0 +63936 41349 0 0 +63936 41510 0 0 +63997 41659 0 0 +64111 41772 0 0 +64259 41834 0 0 +64420 41834 0 0 +64551 41780 0 0 +65076 41780 0 0 +65110 41860 0 0 +65239 41990 0 0 +65408 42060 0 0 +65591 42060 0 0 +65760 41990 0 0 +65890 41861 0 0 +65960 41692 0 0 +65960 42658 0 0 +65866 42677 0 0 +65752 42753 0 0 +65083 43423 0 0 +65007 43536 0 0 +64980 43670 0 0 +64980 43870 0 0 +64933 43982 0 0 +64717 44198 0 0 +64717 43729 0 0 +64717 43154 0 0 +64717 42579 0 0 +64704 42406 0 0 +64662 42306 0 0 +64592 42278 0 0 +64522 42348 0 0 +64522 42208 0 0 +64494 42138 0 0 +64329 42083 0 0 +64156 42096 0 0 +64056 42138 0 0 +64028 42208 0 0 +64275 42454 0 0 +64522 42208 0 0 +64522 42348 0 0 +64346 42525 0 0 +64592 42772 0 0 +64662 42744 0 0 +64717 42579 0 0 +64717 43154 0 0 +64704 42981 0 0 +64662 42881 0 0 +64592 42853 0 0 +64346 43100 0 0 +64592 43347 0 0 +64662 43319 0 0 +64717 43154 0 0 +64717 43729 0 0 +64704 43556 0 0 +64662 43456 0 0 +64592 43428 0 0 +64522 43498 0 0 +64522 43417 0 0 +64492 43387 0 0 +64522 43358 0 0 +64494 43288 0 0 +64341 43237 0 0 +64310 43206 0 0 +64275 43171 0 0 +64204 43100 0 0 +64275 43029 0 0 +64310 42994 0 0 +64309 42993 0 0 +64346 42957 0 0 +64394 42954 0 0 +64494 42912 0 0 +64522 42842 0 0 +64492 42812 0 0 +64522 42783 0 0 +64494 42713 0 0 +64341 42662 0 0 +64310 42631 0 0 +64275 42596 0 0 +64204 42525 0 0 +64169 42490 0 0 +64132 42453 0 0 +64129 42406 0 0 +64087 42306 0 0 +64017 42278 0 0 +63987 42307 0 0 +63958 42278 0 0 +63947 42282 0 0 +63947 42208 0 0 +63919 42138 0 0 +63754 42083 0 0 +63684 42088 0 0 +63684 40341 0 0 +63684 40180 0 0 +63623 40031 0 0 +63509 39918 0 0 +63361 39856 0 0 +63200 39856 0 0 +63051 39917 0 0 +63018 39950 0 0 +62341 39950 0 0 +62289 39898 0 0 +62141 39836 0 0 +61980 39836 0 0 +61831 39897 0 0 +61718 40011 0 0 +61656 40159 0 0 +61656 40320 0 0 +61717 40469 0 0 +61831 40582 0 0 +61979 40644 0 0 +62140 40644 0 0 +62289 40583 0 0 +62341 40530 0 0 +62978 40530 0 0 +63051 40602 0 0 +63199 40664 0 0 +63360 40664 0 0 +63509 40603 0 0 +63622 40489 0 0 +63684 40341 0 0 +63684 42088 0 0 +63581 42096 0 0 +63481 42138 0 0 +63453 42208 0 0 +63700 42454 0 0 +63947 42208 0 0 +63947 42282 0 0 +63888 42306 0 0 +63837 42458 0 0 +63771 42525 0 0 +63700 42596 0 0 +63629 42525 0 0 +63594 42490 0 0 +63557 42453 0 0 +63554 42406 0 0 +63512 42306 0 0 +63442 42278 0 0 +63412 42307 0 0 +63383 42278 0 0 +63372 42282 0 0 +63372 42208 0 0 +63344 42138 0 0 +63179 42083 0 0 +63006 42096 0 0 +62906 42138 0 0 +62878 42208 0 0 +63125 42454 0 0 +63372 42208 0 0 +63372 42282 0 0 +63313 42306 0 0 +63262 42458 0 0 +63196 42525 0 0 +63125 42596 0 0 +63054 42666 0 0 +63054 42525 0 0 +62808 42278 0 0 +62738 42306 0 0 +62683 42471 0 0 +62696 42644 0 0 +62738 42744 0 0 +62808 42772 0 0 +63054 42525 0 0 +63054 42666 0 0 +63053 42667 0 0 +63006 42671 0 0 +62906 42713 0 0 +62878 42783 0 0 +62907 42812 0 0 +62878 42842 0 0 +62906 42912 0 0 +63058 42962 0 0 +63090 42994 0 0 +63125 43029 0 0 +63196 43100 0 0 +63125 43171 0 0 +63054 43241 0 0 +63054 43100 0 0 +62808 42853 0 0 +62738 42881 0 0 +62683 43046 0 0 +62696 43219 0 0 +62738 43319 0 0 +62808 43347 0 0 +63054 43100 0 0 +63054 43241 0 0 +63053 43242 0 0 +63006 43246 0 0 +62906 43288 0 0 +62878 43358 0 0 +62907 43387 0 0 +62878 43417 0 0 +62906 43487 0 0 +63058 43537 0 0 +63090 43569 0 0 +63125 43604 0 0 +63196 43675 0 0 +63231 43710 0 0 +63267 43746 0 0 +63271 43794 0 0 +63313 43894 0 0 +63383 43922 0 0 +63412 43892 0 0 +63442 43922 0 0 +63512 43894 0 0 +63562 43741 0 0 +63593 43709 0 0 +63594 43710 0 0 +63629 43675 0 0 +63700 43604 0 0 +63771 43675 0 0 +63806 43710 0 0 +63842 43746 0 0 +63846 43794 0 0 +63888 43894 0 0 +63958 43922 0 0 +63987 43892 0 0 +64017 43922 0 0 +64087 43894 0 0 +64137 43741 0 0 +64168 43709 0 0 +64169 43710 0 0 +64204 43675 0 0 +64275 43604 0 0 +64310 43569 0 0 +64309 43568 0 0 +64346 43532 0 0 +64394 43529 0 0 +64494 43487 0 0 +64522 43417 0 0 +64522 43498 0 0 +64346 43675 0 0 +64592 43922 0 0 +64662 43894 0 0 +64717 43729 0 0 +64717 44198 0 0 +64699 44216 0 0 +64580 44216 0 0 +64522 44239 0 0 +64522 43992 0 0 +64275 43746 0 0 +64028 43992 0 0 +64056 44062 0 0 +64221 44117 0 0 +64394 44104 0 0 +64494 44062 0 0 +64522 43992 0 0 +64522 44239 0 0 +64431 44277 0 0 +64318 44391 0 0 +64264 44518 0 0 +64171 44557 0 0 +64058 44671 0 0 +63996 44819 0 0 +63996 44980 0 0 +64057 45129 0 0 +64171 45242 0 0 +64319 45304 0 0 +64480 45304 0 0 +64629 45243 0 0 +64742 45129 0 0 +64795 45001 0 0 +64889 44963 0 0 +64905 44946 0 0 +64924 44943 0 0 +65037 44867 0 0 +65428 44476 0 0 +65559 44423 0 0 +65672 44309 0 0 +65734 44161 0 0 +65734 44000 0 0 +65680 43868 0 0 +65680 43814 0 0 +66144 43350 0 0 +67199 43350 0 0 +67239 43390 0 0 +67408 43460 0 0 +67591 43460 0 0 +67760 43390 0 0 +67890 43261 0 0 +67960 43092 0 0 +67960 44604 0 0 +67898 44630 0 0 +67843 44722 0 0 +68250 45129 0 0 +68657 44722 0 0 +68657 44864 0 0 +68321 45200 0 0 +68728 45607 0 0 +68820 45552 0 0 +68911 45307 0 0 +68911 47307 0 0 +68902 47046 0 0 +68820 46848 0 0 +68728 46793 0 0 +68657 46864 0 0 +68657 46722 0 0 +68602 46630 0 0 +68357 46539 0 0 +68096 46548 0 0 +67999 46588 0 0 +67898 46630 0 0 +67869 46678 0 0 +67849 46658 0 0 +67884 46625 0 0 +67999 46350 0 0 +67999 46052 0 0 +67885 45777 0 0 +67849 45741 0 0 +67869 45721 0 0 +67898 45770 0 0 +68143 45861 0 0 +68404 45852 0 0 +68602 45770 0 0 +68657 45678 0 0 +68285 45306 0 0 +68250 45271 0 0 +68179 45200 0 0 +68144 45165 0 0 +67772 44793 0 0 +67680 44848 0 0 +67589 45093 0 0 +67598 45354 0 0 +67680 45552 0 0 +67728 45580 0 0 +67708 45600 0 0 +67675 45566 0 0 +67400 45451 0 0 +67102 45451 0 0 +66911 45530 0 0 +66827 45565 0 0 +66791 45600 0 0 +66771 45580 0 0 +66820 45552 0 0 +66911 45307 0 0 +66902 45046 0 0 +66820 44848 0 0 +66728 44793 0 0 +66657 44864 0 0 +66657 44722 0 0 +66602 44630 0 0 +66357 44539 0 0 +66096 44548 0 0 +65898 44630 0 0 +65843 44722 0 0 +66250 45129 0 0 +66657 44722 0 0 +66657 44864 0 0 +66356 45165 0 0 +66321 45200 0 0 +66250 45271 0 0 +66215 45306 0 0 +66179 45342 0 0 +66179 45200 0 0 +65772 44793 0 0 +65680 44848 0 0 +65589 45093 0 0 +65598 45354 0 0 +65680 45552 0 0 +65772 45607 0 0 +66179 45200 0 0 +66179 45342 0 0 +65843 45678 0 0 +65898 45770 0 0 +66143 45861 0 0 +66404 45852 0 0 +66602 45770 0 0 +66630 45721 0 0 +66650 45741 0 0 +66616 45775 0 0 +66501 46050 0 0 +66501 46348 0 0 +66615 46623 0 0 +66650 46658 0 0 +66630 46678 0 0 +66602 46630 0 0 +66357 46539 0 0 +66096 46548 0 0 +65898 46630 0 0 +65843 46722 0 0 +66215 47094 0 0 +66250 47129 0 0 +66321 47200 0 0 +66356 47235 0 0 +66728 47607 0 0 +66820 47552 0 0 +66911 47307 0 0 +66902 47046 0 0 +66820 46848 0 0 +66771 46819 0 0 +66791 46799 0 0 +66825 46834 0 0 +67100 46949 0 0 +67398 46949 0 0 +67673 46835 0 0 +67708 46799 0 0 +67728 46819 0 0 +67680 46848 0 0 +67589 47093 0 0 +67598 47354 0 0 +67680 47552 0 0 +67772 47607 0 0 +68144 47235 0 0 +68179 47200 0 0 +68250 47129 0 0 +68285 47094 0 0 +68657 46722 0 0 +68657 46864 0 0 +68321 47200 0 0 +68728 47607 0 0 +68820 47552 0 0 +68911 47307 0 0 +68911 47950 0 0 +68657 47950 0 0 +68657 47678 0 0 +68250 47271 0 0 +68179 47342 0 0 +67843 47678 0 0 +67898 47770 0 0 +68143 47861 0 0 +68404 47852 0 0 +68602 47770 0 0 +68657 47678 0 0 +68657 47950 0 0 +66911 47950 0 0 +66657 47950 0 0 +66657 47678 0 0 +66250 47271 0 0 +66179 47342 0 0 +66179 47200 0 0 +65772 46793 0 0 +65680 46848 0 0 +65589 47093 0 0 +65598 47354 0 0 +65680 47552 0 0 +65772 47607 0 0 +66179 47200 0 0 +66179 47342 0 0 +65843 47678 0 0 +65898 47770 0 0 +66143 47861 0 0 +66404 47852 0 0 +66602 47770 0 0 +66657 47678 0 0 +66657 47950 0 0 +63947 47950 0 0 +63947 43992 0 0 +63700 43746 0 0 +63453 43992 0 0 +63481 44062 0 0 +63646 44117 0 0 +63819 44104 0 0 +63919 44062 0 0 +63947 43992 0 0 +63947 47950 0 0 +63654 47950 0 0 +63654 45021 0 0 +63654 44860 0 0 +63593 44711 0 0 +63479 44598 0 0 +63372 44553 0 0 +63372 43992 0 0 +63125 43746 0 0 +63054 43816 0 0 +63054 43675 0 0 +62808 43428 0 0 +62738 43456 0 0 +62683 43621 0 0 +62696 43794 0 0 +62738 43894 0 0 +62808 43922 0 0 +63054 43675 0 0 +63054 43816 0 0 +62878 43992 0 0 +62906 44062 0 0 +63071 44117 0 0 +63244 44104 0 0 +63344 44062 0 0 +63372 43992 0 0 +63372 44553 0 0 +63331 44536 0 0 +63170 44536 0 0 +63038 44590 0 0 +63014 44590 0 0 +62676 44252 0 0 +62623 44121 0 0 +62509 44008 0 0 +62361 43946 0 0 +62324 43946 0 0 +62324 42781 0 0 +62324 42620 0 0 +62263 42471 0 0 +62149 42358 0 0 +62017 42302 0 0 +61807 42093 0 0 +61840 42061 0 0 +61910 41892 0 0 +61910 41709 0 0 +61840 41540 0 0 +61711 41410 0 0 +61542 41340 0 0 +61359 41340 0 0 +61190 41410 0 0 +61060 41539 0 0 +60990 41708 0 0 +60990 41891 0 0 +61060 42060 0 0 +61100 42100 0 0 +61100 42230 0 0 +61127 42364 0 0 +61203 42477 0 0 +61523 42798 0 0 +61577 42929 0 0 +61691 43042 0 0 +61839 43104 0 0 +62000 43104 0 0 +62149 43043 0 0 +62262 42929 0 0 +62324 42781 0 0 +62324 43946 0 0 +62200 43946 0 0 +62068 44000 0 0 +61690 44000 0 0 +61556 44027 0 0 +61442 44103 0 0 +61115 44430 0 0 +60684 44430 0 0 +60660 44406 0 0 +60660 40392 0 0 +60660 40209 0 0 +60590 40040 0 0 +60461 39910 0 0 +60292 39840 0 0 +60234 39840 0 0 +60150 39755 0 0 +60150 38850 0 0 +60190 38811 0 0 +60260 38642 0 0 +60260 38459 0 0 +60190 38290 0 0 +60061 38160 0 0 +59892 38090 0 0 +59709 38090 0 0 +59540 38160 0 0 +59410 38289 0 0 +59340 38458 0 0 +59340 38641 0 0 +59410 38810 0 0 +59450 38850 0 0 +59450 39900 0 0 +59477 40034 0 0 +59553 40147 0 0 +59740 40334 0 0 +59740 40391 0 0 +59810 40560 0 0 +59939 40690 0 0 +60108 40760 0 0 +60291 40760 0 0 +60460 40690 0 0 +60590 40561 0 0 +60660 40392 0 0 +60660 44406 0 0 +60597 44343 0 0 +60484 44267 0 0 +60350 44240 0 0 +60030 44240 0 0 +59991 44200 0 0 +59822 44130 0 0 +59639 44130 0 0 +59470 44200 0 0 +59340 44329 0 0 +59270 44498 0 0 +59270 44681 0 0 +59340 44850 0 0 +59469 44980 0 0 +59638 45050 0 0 +59821 45050 0 0 +59990 44980 0 0 +60030 44940 0 0 +60205 44940 0 0 +60292 45027 0 0 +60293 45027 0 0 +60406 45103 0 0 +60540 45130 0 0 +61260 45130 0 0 +61260 45129 0 0 +61394 45103 0 0 +61507 45027 0 0 +61834 44700 0 0 +62070 44700 0 0 +62183 44747 0 0 +62622 45187 0 0 +62623 45187 0 0 +62736 45263 0 0 +62870 45290 0 0 +63040 45290 0 0 +63169 45344 0 0 +63330 45344 0 0 +63479 45283 0 0 +63592 45169 0 0 +63654 45021 0 0 +63654 47950 0 0 +59214 47950 0 0 +59214 44801 0 0 +59214 44640 0 0 +59153 44491 0 0 +59039 44378 0 0 +58891 44316 0 0 +58876 44316 0 0 +58592 44032 0 0 +58592 43402 0 0 +58570 43291 0 0 +58507 43197 0 0 +56624 41314 0 0 +56624 39309 0 0 +56689 39283 0 0 +56802 39169 0 0 +56864 39021 0 0 +56864 38961 0 0 +56909 38943 0 0 +57022 38829 0 0 +57084 38681 0 0 +57084 38520 0 0 +57023 38371 0 0 +56909 38258 0 0 +56844 38230 0 0 +56844 38200 0 0 +56783 38051 0 0 +56669 37938 0 0 +56521 37876 0 0 +56360 37876 0 0 +56211 37937 0 0 +56098 38051 0 0 +56036 38199 0 0 +56036 38214 0 0 +55949 38128 0 0 +55801 38066 0 0 +55640 38066 0 0 +55491 38127 0 0 +55378 38241 0 0 +55316 38389 0 0 +55316 38550 0 0 +55377 38699 0 0 +55491 38812 0 0 +55558 38840 0 0 +55558 39942 0 0 +55205 40295 0 0 +55142 40389 0 0 +55120 40500 0 0 +55120 40740 0 0 +55142 40851 0 0 +55205 40945 0 0 +57850 43590 0 0 +57850 44410 0 0 +57872 44521 0 0 +57896 44556 0 0 +57896 44650 0 0 +57957 44799 0 0 +58071 44912 0 0 +58219 44974 0 0 +58380 44974 0 0 +58463 44939 0 0 +58467 44949 0 0 +58581 45062 0 0 +58729 45124 0 0 +58890 45124 0 0 +59039 45063 0 0 +59152 44949 0 0 +59214 44801 0 0 +59214 47950 0 0 +55549 47950 0 0 +55549 44109 0 0 +55549 43891 0 0 +55465 43689 0 0 +55311 43535 0 0 +55226 43500 0 0 +55311 43465 0 0 +55465 43311 0 0 +55549 43109 0 0 +55549 42891 0 0 +55465 42689 0 0 +55311 42535 0 0 +55109 42451 0 0 +54891 42451 0 0 +54689 42535 0 0 +54535 42689 0 0 +54500 42773 0 0 +54465 42689 0 0 +54311 42535 0 0 +54109 42451 0 0 +53891 42451 0 0 +53689 42535 0 0 +53560 42664 0 0 +53560 40592 0 0 +53560 40409 0 0 +53490 40240 0 0 +53450 40199 0 0 +53450 38586 0 0 +53510 38442 0 0 +53510 38259 0 0 +53440 38090 0 0 +53311 37960 0 0 +53142 37890 0 0 +52959 37890 0 0 +52790 37960 0 0 +52660 38089 0 0 +52590 38258 0 0 +52590 38441 0 0 +52660 38610 0 0 +52750 38700 0 0 +52750 40199 0 0 +52710 40239 0 0 +52640 40408 0 0 +52640 40591 0 0 +52710 40760 0 0 +52839 40890 0 0 +53008 40960 0 0 +53191 40960 0 0 +53360 40890 0 0 +53490 40761 0 0 +53560 40592 0 0 +53560 42664 0 0 +53535 42689 0 0 +53500 42773 0 0 +53465 42689 0 0 +53311 42535 0 0 +53109 42451 0 0 +52891 42451 0 0 +52689 42535 0 0 +52535 42689 0 0 +52500 42773 0 0 +52465 42689 0 0 +52311 42535 0 0 +52109 42451 0 0 +51891 42451 0 0 +51710 42526 0 0 +51710 41592 0 0 +51710 41409 0 0 +51640 41240 0 0 +51549 41148 0 0 +51549 34109 0 0 +51549 33891 0 0 +51465 33689 0 0 +51311 33535 0 0 +51109 33451 0 0 +50891 33451 0 0 +50689 33535 0 0 +50535 33689 0 0 +50500 33773 0 0 +50465 33689 0 0 +50311 33535 0 0 +50109 33451 0 0 +49891 33451 0 0 +49689 33535 0 0 +49535 33689 0 0 +49500 33773 0 0 +49465 33689 0 0 +49311 33535 0 0 +49109 33451 0 0 +48891 33451 0 0 +48689 33535 0 0 +48535 33689 0 0 +48451 33891 0 0 +48451 34109 0 0 +48535 34311 0 0 +48689 34465 0 0 +48845 34530 0 0 +48666 34530 0 0 +48604 34556 0 0 +48556 34604 0 0 +48530 34666 0 0 +48530 34734 0 0 +48530 34908 0 0 +48572 34950 0 0 +48900 34950 0 0 +48950 34950 0 0 +49050 34950 0 0 +49100 34950 0 0 +49428 34950 0 0 +49470 34908 0 0 +49470 34734 0 0 +49470 34666 0 0 +49444 34604 0 0 +49396 34556 0 0 +49334 34530 0 0 +49154 34530 0 0 +49311 34465 0 0 +49465 34311 0 0 +49500 34226 0 0 +49535 34311 0 0 +49689 34465 0 0 +49885 34546 0 0 +49878 34547 0 0 +49766 34593 0 0 +49735 34664 0 0 +50000 34929 0 0 +50265 34664 0 0 +50234 34593 0 0 +50102 34549 0 0 +50109 34549 0 0 +50311 34465 0 0 +50465 34311 0 0 +50500 34226 0 0 +50535 34311 0 0 +50689 34465 0 0 +50885 34546 0 0 +50878 34547 0 0 +50766 34593 0 0 +50735 34664 0 0 +51000 34929 0 0 +51265 34664 0 0 +51234 34593 0 0 +51102 34549 0 0 +51109 34549 0 0 +51311 34465 0 0 +51465 34311 0 0 +51549 34109 0 0 +51549 41148 0 0 +51511 41110 0 0 +51465 41090 0 0 +51465 35061 0 0 +51453 34878 0 0 +51407 34766 0 0 +51336 34735 0 0 +51071 35000 0 0 +51336 35265 0 0 +51407 35234 0 0 +51465 35061 0 0 +51465 41090 0 0 +51342 41040 0 0 +51265 41040 0 0 +51265 35336 0 0 +51000 35071 0 0 +50929 35142 0 0 +50929 35000 0 0 +50664 34735 0 0 +50593 34766 0 0 +50535 34939 0 0 +50547 35122 0 0 +50593 35234 0 0 +50664 35265 0 0 +50929 35000 0 0 +50929 35142 0 0 +50735 35336 0 0 +50766 35407 0 0 +50939 35465 0 0 +51122 35453 0 0 +51234 35407 0 0 +51265 35336 0 0 +51265 41040 0 0 +51159 41040 0 0 +50990 41110 0 0 +50860 41239 0 0 +50790 41408 0 0 +50790 41591 0 0 +50860 41760 0 0 +50989 41890 0 0 +51158 41960 0 0 +51341 41960 0 0 +51510 41890 0 0 +51640 41761 0 0 +51710 41592 0 0 +51710 42526 0 0 +51689 42535 0 0 +51535 42689 0 0 +51500 42773 0 0 +51465 42689 0 0 +51311 42535 0 0 +51109 42451 0 0 +50891 42451 0 0 +50689 42535 0 0 +50667 42557 0 0 +50465 42355 0 0 +50465 35061 0 0 +50453 34878 0 0 +50407 34766 0 0 +50336 34735 0 0 +50071 35000 0 0 +50336 35265 0 0 +50407 35234 0 0 +50465 35061 0 0 +50465 42355 0 0 +50265 42155 0 0 +50265 35336 0 0 +50000 35071 0 0 +49929 35142 0 0 +49929 35000 0 0 +49664 34735 0 0 +49593 34766 0 0 +49535 34939 0 0 +49547 35122 0 0 +49593 35234 0 0 +49664 35265 0 0 +49929 35000 0 0 +49929 35142 0 0 +49735 35336 0 0 +49766 35407 0 0 +49939 35465 0 0 +50122 35453 0 0 +50234 35407 0 0 +50265 35336 0 0 +50265 42155 0 0 +49952 41842 0 0 +49952 38702 0 0 +49951 38701 0 0 +49930 38591 0 0 +49929 38590 0 0 +49867 38497 0 0 +49866 38496 0 0 +49470 38100 0 0 +49470 35334 0 0 +49470 35266 0 0 +49470 35092 0 0 +49428 35050 0 0 +49050 35050 0 0 +49050 35428 0 0 +49092 35470 0 0 +49334 35470 0 0 +49396 35444 0 0 +49444 35396 0 0 +49470 35334 0 0 +49470 38100 0 0 +48950 37580 0 0 +48950 35428 0 0 +48950 35050 0 0 +48572 35050 0 0 +48530 35092 0 0 +48530 35266 0 0 +48530 35334 0 0 +48556 35396 0 0 +48604 35444 0 0 +48666 35470 0 0 +48908 35470 0 0 +48950 35428 0 0 +48950 37580 0 0 +48832 37462 0 0 +48832 37345 0 0 +48884 37221 0 0 +48884 37060 0 0 +48823 36911 0 0 +48709 36798 0 0 +48561 36736 0 0 +48400 36736 0 0 +48251 36797 0 0 +48239 36808 0 0 +48161 36776 0 0 +48000 36776 0 0 +47851 36837 0 0 +47738 36951 0 0 +47676 37099 0 0 +47676 37260 0 0 +47725 37380 0 0 +47676 37499 0 0 +47676 37660 0 0 +47737 37809 0 0 +47851 37922 0 0 +47999 37984 0 0 +48074 37984 0 0 +49048 38958 0 0 +49048 41542 0 0 +48374 42216 0 0 +48374 41086 0 0 +48374 40873 0 0 +48374 39128 0 0 +48374 38915 0 0 +48293 38718 0 0 +48142 38568 0 0 +47946 38486 0 0 +47733 38486 0 0 +47536 38567 0 0 +47386 38718 0 0 +47304 38914 0 0 +47304 39127 0 0 +47385 39324 0 0 +47536 39474 0 0 +47732 39556 0 0 +47945 39556 0 0 +48142 39475 0 0 +48292 39324 0 0 +48374 39128 0 0 +48374 40873 0 0 +48293 40676 0 0 +48142 40526 0 0 +47946 40444 0 0 +47733 40444 0 0 +47536 40525 0 0 +47386 40676 0 0 +47304 40872 0 0 +47304 41085 0 0 +47385 41282 0 0 +47536 41432 0 0 +47732 41514 0 0 +47945 41514 0 0 +48142 41433 0 0 +48292 41282 0 0 +48374 41086 0 0 +48374 42216 0 0 +48295 42295 0 0 +48232 42389 0 0 +48210 42500 0 0 +48210 44400 0 0 +48232 44511 0 0 +48295 44605 0 0 +48595 44905 0 0 +48689 44968 0 0 +48800 44990 0 0 +51300 44990 0 0 +51411 44968 0 0 +51505 44905 0 0 +51869 44540 0 0 +51891 44549 0 0 +52109 44549 0 0 +52311 44465 0 0 +52465 44311 0 0 +52546 44114 0 0 +52547 44122 0 0 +52593 44234 0 0 +52664 44265 0 0 +52929 44000 0 0 +52664 43735 0 0 +52593 43766 0 0 +52549 43897 0 0 +52549 43891 0 0 +52465 43689 0 0 +52311 43535 0 0 +52226 43500 0 0 +52311 43465 0 0 +52465 43311 0 0 +52500 43226 0 0 +52535 43311 0 0 +52689 43465 0 0 +52885 43546 0 0 +52878 43547 0 0 +52766 43593 0 0 +52735 43664 0 0 +53000 43929 0 0 +53265 43664 0 0 +53234 43593 0 0 +53102 43549 0 0 +53109 43549 0 0 +53311 43465 0 0 +53465 43311 0 0 +53500 43226 0 0 +53535 43311 0 0 +53689 43465 0 0 +53773 43500 0 0 +53689 43535 0 0 +53535 43689 0 0 +53453 43885 0 0 +53453 43878 0 0 +53407 43766 0 0 +53336 43735 0 0 +53071 44000 0 0 +53336 44265 0 0 +53407 44234 0 0 +53451 44102 0 0 +53451 44109 0 0 +53535 44311 0 0 +53689 44465 0 0 +53891 44549 0 0 +54109 44549 0 0 +54311 44465 0 0 +54465 44311 0 0 +54500 44226 0 0 +54535 44311 0 0 +54689 44465 0 0 +54891 44549 0 0 +55109 44549 0 0 +55311 44465 0 0 +55465 44311 0 0 +55549 44109 0 0 +55549 47950 0 0 +53265 47950 0 0 +53265 44336 0 0 +53000 44071 0 0 +52735 44336 0 0 +52766 44407 0 0 +52939 44465 0 0 +53122 44453 0 0 +53234 44407 0 0 +53265 44336 0 0 +53265 47950 0 0 +46550 47950 0 0 +46550 41645 0 0 +46556 41648 0 0 +46781 41648 0 0 +46989 41562 0 0 +47148 41403 0 0 +47234 41196 0 0 +47234 40971 0 0 +47148 40763 0 0 +46989 40604 0 0 +46782 40518 0 0 +46557 40518 0 0 +46550 40520 0 0 +46550 39479 0 0 +46556 39482 0 0 +46781 39482 0 0 +46989 39396 0 0 +47148 39237 0 0 +47234 39030 0 0 +47234 38805 0 0 +47148 38597 0 0 +46989 38438 0 0 +46782 38352 0 0 +46557 38352 0 0 +46550 38354 0 0 +46550 21550 0 0 +70450 21550 0 0 +70450 47950 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 504D73CA 20 "3V3" +ZLayer 15 +ZAux 6 E +ZClearance 200 T +ZMinThickness 100 +ZOptions 0 16 F 120 200 +ZSmoothing 0 0 +ZCorner 60100 48000 0 +ZCorner 60100 44800 0 +ZCorner 70500 44800 0 +ZCorner 70500 21500 0 +ZCorner 46500 21500 0 +ZCorner 46500 48000 1 +$POLYSCORNERS +60703 44750 0 0 +60481 44750 0 0 +60379 44648 0 0 +60231 44586 0 0 +60070 44586 0 0 +59921 44647 0 0 +59808 44761 0 0 +59746 44909 0 0 +59746 45070 0 0 +59791 45179 0 0 +59791 45239 0 0 +59791 45439 0 0 +59816 45499 0 0 +59791 45560 0 0 +59791 45659 0 0 +59791 45859 0 0 +59829 45951 0 0 +59899 46021 0 0 +59990 46059 0 0 +60050 46059 0 0 +60050 47950 0 0 +52340 47950 0 0 +52340 46004 0 0 +52340 45892 0 0 +52298 45850 0 0 +52050 45850 0 0 +52050 46098 0 0 +52092 46140 0 0 +52136 46140 0 0 +52204 46140 0 0 +52266 46114 0 0 +52314 46066 0 0 +52340 46004 0 0 +52340 47950 0 0 +51950 47950 0 0 +51950 46098 0 0 +51950 45850 0 0 +51702 45850 0 0 +51660 45892 0 0 +51660 46004 0 0 +51686 46066 0 0 +51734 46114 0 0 +51796 46140 0 0 +51864 46140 0 0 +51908 46140 0 0 +51950 46098 0 0 +51950 47950 0 0 +51340 47950 0 0 +51340 46004 0 0 +51340 45892 0 0 +51298 45850 0 0 +51050 45850 0 0 +51050 46098 0 0 +51092 46140 0 0 +51136 46140 0 0 +51204 46140 0 0 +51266 46114 0 0 +51314 46066 0 0 +51340 46004 0 0 +51340 47950 0 0 +50950 47950 0 0 +50950 46098 0 0 +50950 45850 0 0 +50702 45850 0 0 +50660 45892 0 0 +50660 46004 0 0 +50686 46066 0 0 +50734 46114 0 0 +50796 46140 0 0 +50864 46140 0 0 +50908 46140 0 0 +50950 46098 0 0 +50950 47950 0 0 +46550 47950 0 0 +46550 41647 0 0 +46553 41647 0 0 +46556 41648 0 0 +46781 41648 0 0 +46783 41647 0 0 +46979 41647 0 0 +46991 41676 0 0 +47061 41746 0 0 +47152 41784 0 0 +47251 41784 0 0 +47501 41784 0 0 +47503 41783 0 0 +47505 41784 0 0 +47604 41784 0 0 +48174 41784 0 0 +48266 41746 0 0 +48336 41676 0 0 +48374 41585 0 0 +48374 41486 0 0 +48374 41086 0 0 +48374 41000 0 0 +48420 41010 0 0 +50285 41010 0 0 +50290 41011 0 0 +50290 41010 0 0 +50481 40972 0 0 +50482 40972 0 0 +50644 40864 0 0 +50653 40854 0 0 +50762 40692 0 0 +50801 40500 0 0 +50762 40308 0 0 +50686 40196 0 0 +56456 40196 0 0 +57009 40749 0 0 +56969 40789 0 0 +56931 40880 0 0 +56931 40979 0 0 +56931 41319 0 0 +56964 41399 0 0 +56931 41480 0 0 +56931 41579 0 0 +56931 41919 0 0 +56969 42011 0 0 +57039 42081 0 0 +57130 42119 0 0 +57229 42119 0 0 +57231 42119 0 0 +57231 42179 0 0 +57231 42519 0 0 +57269 42611 0 0 +57339 42681 0 0 +57430 42719 0 0 +57529 42719 0 0 +57869 42719 0 0 +57949 42685 0 0 +58030 42719 0 0 +58129 42719 0 0 +58469 42719 0 0 +58561 42681 0 0 +58631 42611 0 0 +58639 42590 0 0 +58810 42590 0 0 +58814 42599 0 0 +58781 42680 0 0 +58781 42779 0 0 +58781 43006 0 0 +56958 43006 0 0 +56131 42179 0 0 +56131 41303 0 0 +56229 41263 0 0 +56342 41149 0 0 +56404 41001 0 0 +56404 40840 0 0 +56343 40691 0 0 +56229 40578 0 0 +56096 40522 0 0 +56043 40391 0 0 +55929 40278 0 0 +55781 40216 0 0 +55620 40216 0 0 +55471 40277 0 0 +55358 40391 0 0 +55296 40539 0 0 +55296 40700 0 0 +55357 40849 0 0 +55380 40871 0 0 +55380 42358 0 0 +55402 42469 0 0 +55465 42563 0 0 +56111 43210 0 0 +55507 43210 0 0 +55549 43109 0 0 +55549 42891 0 0 +55465 42689 0 0 +55311 42535 0 0 +55109 42451 0 0 +54891 42451 0 0 +54689 42535 0 0 +54535 42689 0 0 +54500 42773 0 0 +54465 42689 0 0 +54311 42535 0 0 +54109 42451 0 0 +53891 42451 0 0 +53689 42535 0 0 +53535 42689 0 0 +53500 42773 0 0 +53465 42689 0 0 +53311 42535 0 0 +53109 42451 0 0 +52891 42451 0 0 +52689 42535 0 0 +52535 42689 0 0 +52500 42773 0 0 +52465 42689 0 0 +52311 42535 0 0 +52109 42451 0 0 +51891 42451 0 0 +51689 42535 0 0 +51535 42689 0 0 +51500 42773 0 0 +51465 42689 0 0 +51311 42535 0 0 +51109 42451 0 0 +50891 42451 0 0 +50689 42535 0 0 +50535 42689 0 0 +50500 42773 0 0 +50465 42689 0 0 +50311 42535 0 0 +50109 42451 0 0 +49891 42451 0 0 +49689 42535 0 0 +49535 42689 0 0 +49500 42773 0 0 +49465 42689 0 0 +49350 42574 0 0 +49350 42404 0 0 +49881 41873 0 0 +49889 41881 0 0 +49980 41919 0 0 +50079 41919 0 0 +50419 41919 0 0 +50511 41881 0 0 +50565 41827 0 0 +50596 41840 0 0 +50708 41840 0 0 +50750 41798 0 0 +50750 41773 0 0 +50781 41761 0 0 +50850 41692 0 0 +50850 41798 0 0 +50892 41840 0 0 +51004 41840 0 0 +51066 41814 0 0 +51114 41766 0 0 +51140 41704 0 0 +51140 41636 0 0 +51140 41592 0 0 +51098 41550 0 0 +50889 41550 0 0 +50889 41501 0 0 +50889 41450 0 0 +51098 41450 0 0 +51140 41408 0 0 +51140 41364 0 0 +51140 41296 0 0 +51114 41234 0 0 +51066 41186 0 0 +51004 41160 0 0 +50892 41160 0 0 +50850 41202 0 0 +50850 41308 0 0 +50781 41239 0 0 +50750 41226 0 0 +50750 41202 0 0 +50708 41160 0 0 +50596 41160 0 0 +50565 41173 0 0 +50511 41119 0 0 +50420 41081 0 0 +50321 41081 0 0 +49981 41081 0 0 +49889 41119 0 0 +49858 41150 0 0 +49760 41150 0 0 +49626 41177 0 0 +49512 41253 0 0 +48753 42013 0 0 +48677 42126 0 0 +48650 42260 0 0 +48650 42574 0 0 +48535 42689 0 0 +48451 42891 0 0 +48451 43109 0 0 +48535 43311 0 0 +48675 43451 0 0 +48651 43451 0 0 +48559 43489 0 0 +48489 43559 0 0 +48451 43650 0 0 +48451 43749 0 0 +48451 44349 0 0 +48489 44441 0 0 +48559 44511 0 0 +48650 44549 0 0 +48749 44549 0 0 +49349 44549 0 0 +49441 44511 0 0 +49511 44441 0 0 +49549 44350 0 0 +49549 44325 0 0 +49689 44465 0 0 +49891 44549 0 0 +50109 44549 0 0 +50311 44465 0 0 +50465 44311 0 0 +50500 44226 0 0 +50535 44311 0 0 +50689 44465 0 0 +50710 44473 0 0 +50710 44810 0 0 +50689 44819 0 0 +50619 44889 0 0 +50581 44980 0 0 +50581 45079 0 0 +50581 45419 0 0 +50619 45511 0 0 +50673 45565 0 0 +50660 45596 0 0 +50660 45708 0 0 +50702 45750 0 0 +50900 45750 0 0 +50950 45750 0 0 +51050 45750 0 0 +51100 45750 0 0 +51298 45750 0 0 +51340 45708 0 0 +51340 45596 0 0 +51327 45565 0 0 +51381 45511 0 0 +51419 45420 0 0 +51419 45321 0 0 +51419 44981 0 0 +51381 44889 0 0 +51311 44819 0 0 +51290 44810 0 0 +51290 44473 0 0 +51311 44465 0 0 +51465 44311 0 0 +51500 44226 0 0 +51535 44311 0 0 +51689 44465 0 0 +51710 44473 0 0 +51710 44810 0 0 +51689 44819 0 0 +51619 44889 0 0 +51581 44980 0 0 +51581 45079 0 0 +51581 45419 0 0 +51619 45511 0 0 +51673 45565 0 0 +51660 45596 0 0 +51660 45708 0 0 +51702 45750 0 0 +51900 45750 0 0 +51950 45750 0 0 +52050 45750 0 0 +52100 45750 0 0 +52298 45750 0 0 +52340 45708 0 0 +52340 45596 0 0 +52327 45565 0 0 +52381 45511 0 0 +52389 45490 0 0 +54800 45490 0 0 +54911 45468 0 0 +55005 45405 0 0 +55301 45108 0 0 +55360 45250 0 0 +55489 45380 0 0 +55658 45450 0 0 +55841 45450 0 0 +55948 45405 0 0 +55980 45419 0 0 +56079 45419 0 0 +56419 45419 0 0 +56499 45385 0 0 +56580 45419 0 0 +56679 45419 0 0 +57019 45419 0 0 +57111 45381 0 0 +57181 45311 0 0 +57189 45290 0 0 +57310 45290 0 0 +57319 45311 0 0 +57389 45381 0 0 +57480 45419 0 0 +57579 45419 0 0 +57919 45419 0 0 +57999 45385 0 0 +58080 45419 0 0 +58179 45419 0 0 +58471 45419 0 0 +58309 45581 0 0 +58081 45581 0 0 +58000 45614 0 0 +57920 45581 0 0 +57821 45581 0 0 +57481 45581 0 0 +57389 45619 0 0 +57319 45689 0 0 +57310 45710 0 0 +57189 45710 0 0 +57181 45689 0 0 +57111 45619 0 0 +57020 45581 0 0 +56921 45581 0 0 +56581 45581 0 0 +56500 45614 0 0 +56420 45581 0 0 +56321 45581 0 0 +55981 45581 0 0 +55960 45589 0 0 +55842 45540 0 0 +55659 45540 0 0 +55490 45610 0 0 +55360 45739 0 0 +55290 45908 0 0 +55290 46091 0 0 +55360 46260 0 0 +55489 46390 0 0 +55658 46460 0 0 +55841 46460 0 0 +55960 46410 0 0 +55980 46419 0 0 +56079 46419 0 0 +56419 46419 0 0 +56499 46385 0 0 +56580 46419 0 0 +56679 46419 0 0 +57019 46419 0 0 +57111 46381 0 0 +57181 46311 0 0 +57189 46290 0 0 +57310 46290 0 0 +57319 46311 0 0 +57389 46381 0 0 +57480 46419 0 0 +57579 46419 0 0 +57919 46419 0 0 +57999 46385 0 0 +58080 46419 0 0 +58179 46419 0 0 +58519 46419 0 0 +58611 46381 0 0 +58681 46311 0 0 +58719 46220 0 0 +58719 46121 0 0 +58719 45991 0 0 +59015 45695 0 0 +59078 45601 0 0 +59100 45490 0 0 +59100 45001 0 0 +59152 44949 0 0 +59214 44801 0 0 +59214 44726 0 0 +59420 44521 0 0 +59420 44520 0 0 +59421 44518 0 0 +59544 44396 0 0 +60480 44396 0 0 +60480 44441 0 0 +60550 44610 0 0 +60679 44740 0 0 +60703 44750 1 0 +61987 42647 0 0 +61912 42698 0 0 +61830 42780 0 0 +61824 42786 0 0 +61788 42750 0 0 +61660 42750 0 0 +61610 42750 0 0 +61510 42750 0 0 +61510 42650 0 0 +61610 42650 0 0 +61660 42650 0 0 +61788 42650 0 0 +61830 42608 0 0 +61830 42590 0 0 +61930 42590 0 0 +61987 42647 1 0 +62623 41726 0 0 +62614 41748 0 0 +62614 41867 0 0 +62614 42014 0 0 +62404 42014 0 0 +62323 41933 0 0 +62229 41870 0 0 +62118 41848 0 0 +59758 41848 0 0 +59619 41709 0 0 +59619 41560 0 0 +59741 41560 0 0 +59910 41490 0 0 +60040 41361 0 0 +60110 41192 0 0 +60110 41009 0 0 +60040 40840 0 0 +59911 40710 0 0 +59742 40640 0 0 +59559 40640 0 0 +59439 40689 0 0 +59420 40681 0 0 +59321 40681 0 0 +58981 40681 0 0 +58889 40719 0 0 +58819 40789 0 0 +58781 40880 0 0 +58781 40979 0 0 +58781 41319 0 0 +58814 41399 0 0 +58810 41410 0 0 +58339 41410 0 0 +58335 41400 0 0 +58369 41320 0 0 +58369 41221 0 0 +58369 40881 0 0 +58331 40789 0 0 +58301 40759 0 0 +59020 40040 0 0 +59410 40040 0 0 +59419 40061 0 0 +59489 40131 0 0 +59580 40169 0 0 +59679 40169 0 0 +60019 40169 0 0 +60111 40131 0 0 +60152 40090 0 0 +60160 40090 0 0 +60169 40111 0 0 +60239 40181 0 0 +60330 40219 0 0 +60429 40219 0 0 +60769 40219 0 0 +60849 40185 0 0 +60930 40219 0 0 +61029 40219 0 0 +61369 40219 0 0 +61461 40181 0 0 +61526 40116 0 0 +61656 40246 0 0 +61656 40320 0 0 +61717 40469 0 0 +61831 40582 0 0 +61979 40644 0 0 +62062 40644 0 0 +62062 40652 0 0 +62084 40763 0 0 +62147 40857 0 0 +62623 41333 0 0 +62623 41726 1 0 +62810 44292 0 0 +62688 44292 0 0 +62688 44405 0 0 +62700 44449 0 0 +62660 44490 0 0 +62030 44490 0 0 +62030 44442 0 0 +61988 44400 0 0 +61860 44400 0 0 +61810 44400 0 0 +61710 44400 0 0 +61710 44300 0 0 +61810 44300 0 0 +61860 44300 0 0 +61988 44300 0 0 +62030 44258 0 0 +62030 44206 0 0 +62017 44177 0 0 +62326 44177 0 0 +62348 44186 0 0 +62467 44186 0 0 +62688 44186 0 0 +62688 44192 0 0 +62735 44192 0 0 +62786 44213 0 0 +62810 44213 0 0 +62810 44292 1 0 +64892 43937 0 0 +64877 43937 0 0 +64813 43924 0 0 +64813 43915 0 0 +64813 43837 0 0 +64892 43837 0 0 +64892 43860 0 0 +64892 43914 0 0 +64892 43916 0 0 +64892 43937 1 0 +65419 40341 0 0 +64619 41141 0 0 +64588 41110 0 0 +64400 41110 0 0 +64400 41288 0 0 +64436 41324 0 0 +64430 41330 0 0 +64331 41428 0 0 +64299 41379 0 0 +64298 41378 0 0 +64290 41370 0 0 +64290 41298 0 0 +64300 41288 0 0 +64300 41160 0 0 +64300 41110 0 0 +64300 41010 0 0 +64400 41010 0 0 +64450 41010 0 0 +64588 41010 0 0 +64630 40968 0 0 +64630 40926 0 0 +64628 40923 0 0 +64671 40881 0 0 +64709 40790 0 0 +64709 40691 0 0 +64709 40491 0 0 +64706 40484 0 0 +64740 40451 0 0 +64810 40282 0 0 +64810 40169 0 0 +64908 40210 0 0 +65091 40210 0 0 +65260 40140 0 0 +65390 40011 0 0 +65419 39940 0 0 +65419 40341 1 0 +65925 44523 0 0 +65827 44565 0 0 +65790 44601 0 0 +65790 44488 0 0 +65790 44300 0 0 +65612 44300 0 0 +65570 44342 0 0 +65570 44394 0 0 +65596 44456 0 0 +65644 44504 0 0 +65706 44530 0 0 +65748 44530 0 0 +65790 44488 0 0 +65790 44601 0 0 +65641 44750 0 0 +65550 44750 0 0 +65550 44680 0 0 +65549 44679 0 0 +65523 44546 0 0 +65447 44433 0 0 +65447 44432 0 0 +65096 44081 0 0 +65158 44031 0 0 +65180 43987 0 0 +65209 43987 0 0 +65209 43924 0 0 +65282 43997 0 0 +65283 43997 0 0 +65396 44073 0 0 +65530 44100 0 0 +65572 44100 0 0 +65570 44106 0 0 +65570 44158 0 0 +65612 44200 0 0 +65740 44200 0 0 +65790 44200 0 0 +65890 44200 0 0 +65890 44300 0 0 +65890 44350 0 0 +65890 44488 0 0 +65925 44523 1 0 +70450 44750 0 0 +68858 44750 0 0 +68675 44566 0 0 +68400 44451 0 0 +68102 44451 0 0 +67827 44565 0 0 +67641 44750 0 0 +66858 44750 0 0 +66727 44618 0 0 +66789 44593 0 0 +66902 44479 0 0 +66964 44331 0 0 +66964 44210 0 0 +67091 44210 0 0 +67260 44140 0 0 +67390 44011 0 0 +67460 43842 0 0 +67460 43659 0 0 +67390 43490 0 0 +67261 43360 0 0 +67092 43290 0 0 +66909 43290 0 0 +66789 43339 0 0 +66770 43331 0 0 +66671 43331 0 0 +66577 43331 0 0 +66582 43328 0 0 +68165 41746 0 0 +68165 41745 0 0 +68206 41683 0 0 +68227 41652 0 0 +68228 41651 0 0 +68249 41540 0 0 +68250 41540 0 0 +68250 40367 0 0 +68309 40343 0 0 +68422 40229 0 0 +68484 40081 0 0 +68484 39920 0 0 +68423 39771 0 0 +68324 39672 0 0 +68324 39560 0 0 +68263 39411 0 0 +68164 39312 0 0 +68164 39200 0 0 +68103 39051 0 0 +68004 38952 0 0 +68004 38840 0 0 +67943 38691 0 0 +67844 38592 0 0 +67844 38480 0 0 +67783 38331 0 0 +67669 38218 0 0 +67539 38163 0 0 +67493 38051 0 0 +67379 37938 0 0 +67231 37876 0 0 +67070 37876 0 0 +66921 37937 0 0 +66808 38051 0 0 +66746 38199 0 0 +66746 38360 0 0 +66807 38509 0 0 +66860 38561 0 0 +66860 41080 0 0 +65917 42023 0 0 +65073 42023 0 0 +65052 42014 0 0 +64933 42014 0 0 +64786 42014 0 0 +64786 41794 0 0 +65914 40666 0 0 +65977 40572 0 0 +65999 40461 0 0 +65999 37910 0 0 +66171 37910 0 0 +66263 37872 0 0 +66333 37802 0 0 +66371 37711 0 0 +66371 37676 0 0 +68629 37676 0 0 +68629 37710 0 0 +68667 37802 0 0 +68737 37872 0 0 +68828 37910 0 0 +68927 37910 0 0 +69753 37910 0 0 +69845 37872 0 0 +69915 37802 0 0 +69953 37711 0 0 +69953 37612 0 0 +69953 37062 0 0 +69953 35939 0 0 +69953 35840 0 0 +69953 35290 0 0 +69915 35198 0 0 +69845 35128 0 0 +69760 35092 0 0 +69760 34949 0 0 +69690 34780 0 0 +69561 34650 0 0 +69392 34580 0 0 +69209 34580 0 0 +69040 34650 0 0 +68910 34779 0 0 +68840 34948 0 0 +68840 35090 0 0 +68829 35090 0 0 +68737 35128 0 0 +68667 35198 0 0 +68629 35289 0 0 +68629 35388 0 0 +68629 35938 0 0 +68667 36030 0 0 +68737 36100 0 0 +68828 36138 0 0 +68927 36138 0 0 +69753 36138 0 0 +69845 36100 0 0 +69915 36030 0 0 +69953 35939 0 0 +69953 37062 0 0 +69915 36970 0 0 +69845 36900 0 0 +69754 36862 0 0 +69655 36862 0 0 +68829 36862 0 0 +68737 36900 0 0 +68667 36970 0 0 +68629 37061 0 0 +68629 37096 0 0 +66371 37096 0 0 +66371 37062 0 0 +66371 35939 0 0 +66371 35840 0 0 +66371 35290 0 0 +66360 35263 0 0 +66360 32292 0 0 +66360 32109 0 0 +66290 31940 0 0 +66161 31810 0 0 +65992 31740 0 0 +65934 31740 0 0 +65913 31718 0 0 +65942 31650 0 0 +65942 31352 0 0 +65828 31077 0 0 +65618 30866 0 0 +65343 30751 0 0 +65045 30751 0 0 +64770 30865 0 0 +64559 31075 0 0 +64444 31350 0 0 +64444 31648 0 0 +64558 31923 0 0 +64768 32134 0 0 +65043 32249 0 0 +65341 32249 0 0 +65421 32215 0 0 +65440 32234 0 0 +65440 32291 0 0 +65510 32460 0 0 +65639 32590 0 0 +65808 32660 0 0 +65991 32660 0 0 +66160 32590 0 0 +66290 32461 0 0 +66360 32292 0 0 +66360 35263 0 0 +66333 35198 0 0 +66263 35128 0 0 +66172 35090 0 0 +66170 35090 0 0 +66170 34949 0 0 +66100 34780 0 0 +65971 34650 0 0 +65802 34580 0 0 +65619 34580 0 0 +65450 34650 0 0 +65320 34779 0 0 +65250 34948 0 0 +65250 35090 0 0 +65247 35090 0 0 +65155 35128 0 0 +65085 35198 0 0 +65047 35289 0 0 +65047 35388 0 0 +65047 35938 0 0 +65085 36030 0 0 +65155 36100 0 0 +65246 36138 0 0 +65345 36138 0 0 +66171 36138 0 0 +66263 36100 0 0 +66333 36030 0 0 +66371 35939 0 0 +66371 37062 0 0 +66333 36970 0 0 +66263 36900 0 0 +66172 36862 0 0 +66073 36862 0 0 +65247 36862 0 0 +65155 36900 0 0 +65085 36970 0 0 +65047 37061 0 0 +65047 37096 0 0 +64766 37096 0 0 +64390 36720 0 0 +64390 34381 0 0 +64480 34419 0 0 +64579 34419 0 0 +64919 34419 0 0 +65011 34381 0 0 +65065 34327 0 0 +65096 34340 0 0 +65208 34340 0 0 +65250 34298 0 0 +65250 34273 0 0 +65281 34261 0 0 +65350 34192 0 0 +65350 34298 0 0 +65392 34340 0 0 +65504 34340 0 0 +65566 34314 0 0 +65614 34266 0 0 +65640 34204 0 0 +65640 34136 0 0 +65640 34092 0 0 +65598 34050 0 0 +65389 34050 0 0 +65389 34001 0 0 +65389 33950 0 0 +65598 33950 0 0 +65640 33908 0 0 +65640 33864 0 0 +65640 33796 0 0 +65614 33734 0 0 +65566 33686 0 0 +65504 33660 0 0 +65392 33660 0 0 +65350 33702 0 0 +65350 33808 0 0 +65281 33739 0 0 +65250 33726 0 0 +65250 33702 0 0 +65208 33660 0 0 +65096 33660 0 0 +65065 33673 0 0 +65011 33619 0 0 +64920 33581 0 0 +64821 33581 0 0 +64691 33581 0 0 +62595 31485 0 0 +62595 31352 0 0 +62481 31077 0 0 +62271 30866 0 0 +61996 30751 0 0 +61698 30751 0 0 +61423 30865 0 0 +61212 31075 0 0 +61097 31350 0 0 +61097 31648 0 0 +61211 31923 0 0 +61421 32134 0 0 +61696 32249 0 0 +61994 32249 0 0 +62269 32135 0 0 +62347 32057 0 0 +63500 33210 0 0 +60850 33210 0 0 +60739 33232 0 0 +60645 33295 0 0 +60644 33295 0 0 +60644 33296 0 0 +60358 33582 0 0 +60311 33535 0 0 +60109 33451 0 0 +59891 33451 0 0 +59689 33535 0 0 +59535 33689 0 0 +59500 33773 0 0 +59465 33689 0 0 +59311 33535 0 0 +59249 33509 0 0 +59249 31650 0 0 +59249 31352 0 0 +59135 31077 0 0 +58925 30866 0 0 +58650 30751 0 0 +58352 30751 0 0 +58077 30865 0 0 +57866 31075 0 0 +57809 31210 0 0 +57110 31210 0 0 +56333 30433 0 0 +56239 30370 0 0 +56128 30348 0 0 +48232 30348 0 0 +48121 30370 0 0 +48027 30433 0 0 +47333 31127 0 0 +47270 31221 0 0 +47248 31332 0 0 +47248 37038 0 0 +47270 37149 0 0 +47333 37243 0 0 +47676 37586 0 0 +47676 37660 0 0 +47737 37809 0 0 +47851 37922 0 0 +47999 37984 0 0 +48160 37984 0 0 +48309 37923 0 0 +48422 37809 0 0 +48484 37661 0 0 +48484 37544 0 0 +48560 37544 0 0 +48709 37483 0 0 +48822 37369 0 0 +48884 37221 0 0 +48884 37060 0 0 +48823 36911 0 0 +48709 36798 0 0 +48561 36736 0 0 +48486 36736 0 0 +48190 36440 0 0 +48190 31550 0 0 +48488 31252 0 0 +51098 31252 0 0 +51058 31350 0 0 +51058 31648 0 0 +51172 31923 0 0 +51382 32134 0 0 +51657 32249 0 0 +51955 32249 0 0 +52090 32193 0 0 +53162 33265 0 0 +53256 33328 0 0 +53367 33350 0 0 +57460 33350 0 0 +57571 33328 0 0 +57636 33284 0 0 +57720 33284 0 0 +57869 33223 0 0 +57982 33109 0 0 +58044 32961 0 0 +58044 32800 0 0 +57983 32651 0 0 +57869 32538 0 0 +57721 32476 0 0 +57560 32476 0 0 +57411 32537 0 0 +57298 32651 0 0 +57248 32770 0 0 +53487 32770 0 0 +52500 31783 0 0 +52556 31650 0 0 +52556 31352 0 0 +52447 31090 0 0 +54334 31090 0 0 +54460 31216 0 0 +54405 31350 0 0 +54405 31648 0 0 +54519 31923 0 0 +54729 32134 0 0 +55004 32249 0 0 +55302 32249 0 0 +55577 32135 0 0 +55788 31925 0 0 +55903 31650 0 0 +55903 31352 0 0 +55789 31077 0 0 +55640 30928 0 0 +56008 30928 0 0 +56785 31705 0 0 +56879 31768 0 0 +56990 31790 0 0 +57809 31790 0 0 +57865 31923 0 0 +58075 32134 0 0 +58350 32249 0 0 +58648 32249 0 0 +58923 32135 0 0 +59134 31925 0 0 +59249 31650 0 0 +59249 33509 0 0 +59109 33451 0 0 +58891 33451 0 0 +58689 33535 0 0 +58535 33689 0 0 +58500 33773 0 0 +58465 33689 0 0 +58311 33535 0 0 +58109 33451 0 0 +57891 33451 0 0 +57689 33535 0 0 +57535 33689 0 0 +57500 33773 0 0 +57465 33689 0 0 +57311 33535 0 0 +57109 33451 0 0 +56891 33451 0 0 +56689 33535 0 0 +56535 33689 0 0 +56500 33773 0 0 +56465 33689 0 0 +56311 33535 0 0 +56109 33451 0 0 +55891 33451 0 0 +55689 33535 0 0 +55535 33689 0 0 +55451 33891 0 0 +55451 34109 0 0 +55459 34130 0 0 +55295 34295 0 0 +55232 34389 0 0 +55210 34500 0 0 +55210 35180 0 0 +55232 35291 0 0 +55295 35385 0 0 +55518 35608 0 0 +55518 38115 0 0 +55491 38127 0 0 +55378 38241 0 0 +55316 38389 0 0 +55316 38550 0 0 +55377 38699 0 0 +55491 38812 0 0 +55639 38874 0 0 +55800 38874 0 0 +55930 38820 0 0 +56056 38946 0 0 +56056 39020 0 0 +56117 39169 0 0 +56231 39282 0 0 +56379 39344 0 0 +56540 39344 0 0 +56689 39283 0 0 +56802 39169 0 0 +56864 39021 0 0 +56864 38961 0 0 +56909 38943 0 0 +57022 38829 0 0 +57084 38681 0 0 +57084 38606 0 0 +59705 35985 0 0 +59768 35891 0 0 +59790 35780 0 0 +59790 35507 0 0 +59891 35549 0 0 +60109 35549 0 0 +60311 35465 0 0 +60465 35311 0 0 +60500 35226 0 0 +60535 35311 0 0 +60689 35465 0 0 +60891 35549 0 0 +60909 35549 0 0 +62062 36702 0 0 +62062 39832 0 0 +61825 39595 0 0 +61731 39532 0 0 +61620 39510 0 0 +61539 39510 0 0 +61531 39489 0 0 +61461 39419 0 0 +61370 39381 0 0 +61271 39381 0 0 +60931 39381 0 0 +60850 39414 0 0 +60770 39381 0 0 +60671 39381 0 0 +60331 39381 0 0 +60239 39419 0 0 +60192 39465 0 0 +60181 39439 0 0 +60127 39385 0 0 +60140 39354 0 0 +60140 39242 0 0 +60140 39058 0 0 +60140 38946 0 0 +60114 38884 0 0 +60066 38836 0 0 +60004 38810 0 0 +59936 38810 0 0 +59892 38810 0 0 +59850 38852 0 0 +59850 39100 0 0 +60098 39100 0 0 +60140 39058 0 0 +60140 39242 0 0 +60098 39200 0 0 +59900 39200 0 0 +59850 39200 0 0 +59750 39200 0 0 +59750 39100 0 0 +59750 38852 0 0 +59708 38810 0 0 +59664 38810 0 0 +59596 38810 0 0 +59534 38836 0 0 +59486 38884 0 0 +59460 38946 0 0 +59460 39058 0 0 +59502 39100 0 0 +59750 39100 0 0 +59750 39200 0 0 +59700 39200 0 0 +59502 39200 0 0 +59460 39242 0 0 +59460 39354 0 0 +59473 39385 0 0 +59419 39439 0 0 +59410 39460 0 0 +58900 39460 0 0 +58789 39482 0 0 +58695 39545 0 0 +57775 40464 0 0 +56849 39539 0 0 +56755 39476 0 0 +56644 39454 0 0 +53950 39454 0 0 +53950 38564 0 0 +53950 38442 0 0 +53908 38400 0 0 +53650 38400 0 0 +53650 38658 0 0 +53692 38700 0 0 +53746 38700 0 0 +53814 38700 0 0 +53876 38674 0 0 +53924 38626 0 0 +53950 38564 0 0 +53950 39454 0 0 +53550 39454 0 0 +53550 38658 0 0 +53550 38400 0 0 +53292 38400 0 0 +53250 38442 0 0 +53250 38560 0 0 +53142 38560 0 0 +53100 38602 0 0 +53100 38850 0 0 +53348 38850 0 0 +53390 38808 0 0 +53390 38764 0 0 +53390 38700 0 0 +53454 38700 0 0 +53508 38700 0 0 +53550 38658 0 0 +53550 39454 0 0 +53390 39454 0 0 +53390 39104 0 0 +53390 39036 0 0 +53390 38992 0 0 +53348 38950 0 0 +53100 38950 0 0 +53100 39198 0 0 +53142 39240 0 0 +53254 39240 0 0 +53316 39214 0 0 +53364 39166 0 0 +53390 39104 0 0 +53390 39454 0 0 +53000 39454 0 0 +53000 39198 0 0 +53000 39000 0 0 +53000 38950 0 0 +53000 38850 0 0 +53000 38800 0 0 +53000 38602 0 0 +52958 38560 0 0 +52846 38560 0 0 +52815 38573 0 0 +52761 38519 0 0 +52670 38481 0 0 +52571 38481 0 0 +52231 38481 0 0 +52210 38489 0 0 +52092 38440 0 0 +51909 38440 0 0 +51740 38510 0 0 +51610 38639 0 0 +51540 38808 0 0 +51540 38991 0 0 +51610 39160 0 0 +51739 39290 0 0 +51908 39360 0 0 +52091 39360 0 0 +52210 39310 0 0 +52230 39319 0 0 +52329 39319 0 0 +52669 39319 0 0 +52761 39281 0 0 +52815 39227 0 0 +52846 39240 0 0 +52958 39240 0 0 +53000 39198 0 0 +53000 39454 0 0 +49113 39454 0 0 +50417 38150 0 0 +52610 38150 0 0 +52801 38112 0 0 +52964 38004 0 0 +53072 37841 0 0 +53109 37653 0 0 +53171 37715 0 0 +53171 37879 0 0 +53209 37971 0 0 +53279 38041 0 0 +53300 38049 0 0 +53276 38074 0 0 +53250 38136 0 0 +53250 38258 0 0 +53292 38300 0 0 +53500 38300 0 0 +53550 38300 0 0 +53650 38300 0 0 +53700 38300 0 0 +53908 38300 0 0 +53950 38258 0 0 +53950 38136 0 0 +53924 38074 0 0 +53899 38049 0 0 +53921 38041 0 0 +53971 37991 0 0 +53971 38229 0 0 +54009 38321 0 0 +54079 38391 0 0 +54170 38429 0 0 +54269 38429 0 0 +54629 38429 0 0 +54656 38417 0 0 +54758 38460 0 0 +54941 38460 0 0 +55110 38390 0 0 +55240 38261 0 0 +55310 38092 0 0 +55310 37909 0 0 +55240 37740 0 0 +55111 37610 0 0 +54942 37540 0 0 +54759 37540 0 0 +54656 37582 0 0 +54630 37571 0 0 +54531 37571 0 0 +54171 37571 0 0 +54079 37609 0 0 +54029 37659 0 0 +54029 37421 0 0 +53991 37329 0 0 +53921 37259 0 0 +53830 37221 0 0 +53731 37221 0 0 +53665 37221 0 0 +53469 37024 0 0 +53469 36881 0 0 +53431 36789 0 0 +53361 36719 0 0 +53270 36681 0 0 +53171 36681 0 0 +52910 36681 0 0 +52910 36559 0 0 +52840 36390 0 0 +52711 36260 0 0 +52542 36190 0 0 +52359 36190 0 0 +52190 36260 0 0 +52060 36389 0 0 +51990 36558 0 0 +51990 36741 0 0 +52039 36860 0 0 +52031 36880 0 0 +52031 36979 0 0 +52031 37150 0 0 +51549 37150 0 0 +51549 35109 0 0 +51549 34891 0 0 +51465 34689 0 0 +51465 34061 0 0 +51453 33878 0 0 +51407 33766 0 0 +51336 33735 0 0 +51265 33806 0 0 +51265 33664 0 0 +51234 33593 0 0 +51061 33535 0 0 +50878 33547 0 0 +50766 33593 0 0 +50735 33664 0 0 +51000 33929 0 0 +51265 33664 0 0 +51265 33806 0 0 +51071 34000 0 0 +51336 34265 0 0 +51407 34234 0 0 +51465 34061 0 0 +51465 34689 0 0 +51311 34535 0 0 +51114 34453 0 0 +51122 34453 0 0 +51234 34407 0 0 +51265 34336 0 0 +51000 34071 0 0 +50929 34142 0 0 +50929 34000 0 0 +50664 33735 0 0 +50593 33766 0 0 +50535 33939 0 0 +50547 34122 0 0 +50593 34234 0 0 +50664 34265 0 0 +50929 34000 0 0 +50929 34142 0 0 +50735 34336 0 0 +50766 34407 0 0 +50897 34451 0 0 +50891 34451 0 0 +50689 34535 0 0 +50535 34689 0 0 +50500 34773 0 0 +50465 34689 0 0 +50465 34061 0 0 +50453 33878 0 0 +50407 33766 0 0 +50336 33735 0 0 +50265 33806 0 0 +50265 33664 0 0 +50234 33593 0 0 +50061 33535 0 0 +49878 33547 0 0 +49766 33593 0 0 +49735 33664 0 0 +50000 33929 0 0 +50265 33664 0 0 +50265 33806 0 0 +50071 34000 0 0 +50336 34265 0 0 +50407 34234 0 0 +50465 34061 0 0 +50465 34689 0 0 +50311 34535 0 0 +50114 34453 0 0 +50122 34453 0 0 +50234 34407 0 0 +50265 34336 0 0 +50000 34071 0 0 +49929 34142 0 0 +49929 34000 0 0 +49664 33735 0 0 +49593 33766 0 0 +49535 33939 0 0 +49547 34122 0 0 +49593 34234 0 0 +49664 34265 0 0 +49929 34000 0 0 +49929 34142 0 0 +49735 34336 0 0 +49766 34407 0 0 +49897 34451 0 0 +49891 34451 0 0 +49689 34535 0 0 +49549 34675 0 0 +49549 34651 0 0 +49511 34559 0 0 +49465 34513 0 0 +49465 34061 0 0 +49453 33878 0 0 +49407 33766 0 0 +49336 33735 0 0 +49265 33806 0 0 +49265 33664 0 0 +49234 33593 0 0 +49061 33535 0 0 +48878 33547 0 0 +48766 33593 0 0 +48735 33664 0 0 +49000 33929 0 0 +49265 33664 0 0 +49265 33806 0 0 +49071 34000 0 0 +49336 34265 0 0 +49407 34234 0 0 +49465 34061 0 0 +49465 34513 0 0 +49441 34489 0 0 +49350 34451 0 0 +49251 34451 0 0 +49126 34451 0 0 +49234 34407 0 0 +49265 34336 0 0 +49000 34071 0 0 +48929 34142 0 0 +48929 34000 0 0 +48664 33735 0 0 +48593 33766 0 0 +48535 33939 0 0 +48547 34122 0 0 +48593 34234 0 0 +48664 34265 0 0 +48929 34000 0 0 +48929 34142 0 0 +48735 34336 0 0 +48766 34407 0 0 +48897 34451 0 0 +48651 34451 0 0 +48559 34489 0 0 +48489 34559 0 0 +48451 34650 0 0 +48451 34749 0 0 +48451 35349 0 0 +48489 35441 0 0 +48559 35511 0 0 +48650 35549 0 0 +48749 35549 0 0 +49349 35549 0 0 +49441 35511 0 0 +49511 35441 0 0 +49549 35350 0 0 +49549 35325 0 0 +49689 35465 0 0 +49891 35549 0 0 +50109 35549 0 0 +50311 35465 0 0 +50465 35311 0 0 +50500 35226 0 0 +50535 35311 0 0 +50689 35465 0 0 +50891 35549 0 0 +51109 35549 0 0 +51311 35465 0 0 +51465 35311 0 0 +51549 35109 0 0 +51549 37150 0 0 +50210 37150 0 0 +50018 37188 0 0 +49953 37231 0 0 +49856 37296 0 0 +49854 37298 0 0 +48374 38778 0 0 +48374 38416 0 0 +48336 38324 0 0 +48266 38254 0 0 +48175 38216 0 0 +48076 38216 0 0 +47506 38216 0 0 +47503 38216 0 0 +47502 38216 0 0 +47403 38216 0 0 +47153 38216 0 0 +47061 38254 0 0 +46991 38324 0 0 +46978 38353 0 0 +46784 38353 0 0 +46782 38352 0 0 +46557 38352 0 0 +46554 38353 0 0 +46550 38353 0 0 +46550 21550 0 0 +70450 21550 0 0 +70450 44750 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660000 0 "" +ZLayer 20 +ZAux 1822 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 53880 25026 0 +ZCorner 53881 24994 0 +ZCorner 53882 24962 0 +ZCorner 53883 24929 0 +ZCorner 53884 24897 0 +ZCorner 53888 24888 0 +ZCorner 53892 24880 0 +ZCorner 53896 24871 0 +ZCorner 53900 24862 0 +ZCorner 53902 24858 0 +ZCorner 53905 24854 0 +ZCorner 53908 24850 0 +ZCorner 53911 24846 0 +ZCorner 53575 24846 0 +ZCorner 53239 24846 0 +ZCorner 52904 24846 0 +ZCorner 52568 24846 0 +ZCorner 52511 24915 0 +ZCorner 52470 24957 0 +ZCorner 52443 24971 0 +ZCorner 52431 24956 0 +ZCorner 51693 24956 0 +ZCorner 50955 24956 0 +ZCorner 50217 24956 0 +ZCorner 49479 24956 0 +ZCorner 49476 24977 0 +ZCorner 49454 24953 0 +ZCorner 49414 24885 0 +ZCorner 49354 24772 0 +ZCorner 50503 24772 0 +ZCorner 51652 24772 0 +ZCorner 52801 24772 0 +ZCorner 53950 24772 0 +ZCorner 54025 24660 0 +ZCorner 54102 24581 0 +ZCorner 54182 24536 0 +ZCorner 54263 24522 0 +ZCorner 54587 24523 0 +ZCorner 54911 24524 0 +ZCorner 55235 24525 0 +ZCorner 55559 24526 0 +ZCorner 55573 24531 0 +ZCorner 55587 24536 0 +ZCorner 55600 24541 0 +ZCorner 55614 24546 0 +ZCorner 55619 24552 0 +ZCorner 55624 24558 0 +ZCorner 55629 24563 0 +ZCorner 55634 24569 0 +ZCorner 55638 24575 0 +ZCorner 55641 24581 0 +ZCorner 55645 24587 0 +ZCorner 55649 24593 0 +ZCorner 55651 24601 0 +ZCorner 55653 24610 0 +ZCorner 55655 24619 0 +ZCorner 55657 24628 0 +ZCorner 55667 24624 0 +ZCorner 55677 24620 0 +ZCorner 55686 24616 0 +ZCorner 55696 24612 0 +ZCorner 55746 24592 0 +ZCorner 55796 24571 0 +ZCorner 55846 24551 0 +ZCorner 55895 24530 0 +ZCorner 55983 24522 0 +ZCorner 56071 24514 0 +ZCorner 56159 24507 0 +ZCorner 56247 24499 0 +ZCorner 56180 24449 0 +ZCorner 56112 24399 0 +ZCorner 56045 24349 0 +ZCorner 55977 24300 0 +ZCorner 56010 24244 0 +ZCorner 56042 24188 0 +ZCorner 56074 24133 0 +ZCorner 56106 24077 0 +ZCorner 56212 24129 0 +ZCorner 56317 24180 0 +ZCorner 56423 24232 0 +ZCorner 56528 24284 0 +ZCorner 56527 24285 0 +ZCorner 56526 24286 0 +ZCorner 56525 24287 0 +ZCorner 56524 24288 0 +ZCorner 56526 24287 0 +ZCorner 56528 24286 0 +ZCorner 56530 24285 0 +ZCorner 56532 24284 0 +ZCorner 56567 24237 0 +ZCorner 56602 24190 0 +ZCorner 56637 24143 0 +ZCorner 56672 24096 0 +ZCorner 56598 24007 0 +ZCorner 56524 23917 0 +ZCorner 56450 23827 0 +ZCorner 56376 23737 0 +ZCorner 56422 23692 0 +ZCorner 56467 23647 0 +ZCorner 56513 23602 0 +ZCorner 56559 23557 0 +ZCorner 56649 23632 0 +ZCorner 56739 23706 0 +ZCorner 56829 23780 0 +ZCorner 56918 23854 0 +ZCorner 56964 23819 0 +ZCorner 57010 23784 0 +ZCorner 57056 23749 0 +ZCorner 57102 23714 0 +ZCorner 57052 23609 0 +ZCorner 57003 23505 0 +ZCorner 56953 23400 0 +ZCorner 56903 23296 0 +ZCorner 56957 23262 0 +ZCorner 57010 23227 0 +ZCorner 57064 23193 0 +ZCorner 57118 23159 0 +ZCorner 57188 23252 0 +ZCorner 57258 23345 0 +ZCorner 57328 23437 0 +ZCorner 57399 23530 0 +ZCorner 57451 23508 0 +ZCorner 57504 23485 0 +ZCorner 57557 23463 0 +ZCorner 57610 23440 0 +ZCorner 57585 23326 0 +ZCorner 57561 23212 0 +ZCorner 57537 23098 0 +ZCorner 57512 22983 0 +ZCorner 57575 22964 0 +ZCorner 57637 22944 0 +ZCorner 57700 22925 0 +ZCorner 57762 22905 0 +ZCorner 57807 23013 0 +ZCorner 57852 23120 0 +ZCorner 57897 23227 0 +ZCorner 57942 23335 0 +ZCorner 57999 23325 0 +ZCorner 58055 23315 0 +ZCorner 58112 23305 0 +ZCorner 58168 23296 0 +ZCorner 58171 23179 0 +ZCorner 58174 23061 0 +ZCorner 58177 22944 0 +ZCorner 58180 22827 0 +ZCorner 58246 22823 0 +ZCorner 58313 22819 0 +ZCorner 58379 22815 0 +ZCorner 58445 22811 0 +ZCorner 58463 22928 0 +ZCorner 58481 23044 0 +ZCorner 58498 23160 0 +ZCorner 58516 23276 0 +ZCorner 58573 23278 0 +ZCorner 58631 23280 0 +ZCorner 58689 23282 0 +ZCorner 58746 23284 0 +ZCorner 58777 23177 0 +ZCorner 58807 23069 0 +ZCorner 58837 22962 0 +ZCorner 58878 22839 0 +ZCorner 58972 22853 0 +ZCorner 59125 22882 0 +ZCorner 59115 22999 0 +ZCorner 59105 23116 0 +ZCorner 59096 23233 0 +ZCorner 59086 23350 0 +ZCorner 59141 23367 0 +ZCorner 59195 23383 0 +ZCorner 59250 23400 0 +ZCorner 59305 23417 0 +ZCorner 59306 23418 0 +ZCorner 59306 23419 0 +ZCorner 59307 23420 0 +ZCorner 59308 23421 0 +ZCorner 59308 23420 0 +ZCorner 59308 23419 0 +ZCorner 59308 23418 0 +ZCorner 59308 23417 0 +ZCorner 59365 23315 0 +ZCorner 59422 23214 0 +ZCorner 59478 23112 0 +ZCorner 59535 23010 0 +ZCorner 59595 23037 0 +ZCorner 59654 23063 0 +ZCorner 59714 23090 0 +ZCorner 59773 23116 0 +ZCorner 59735 23227 0 +ZCorner 59697 23338 0 +ZCorner 59659 23450 0 +ZCorner 59621 23561 0 +ZCorner 59671 23590 0 +ZCorner 59720 23620 0 +ZCorner 59770 23649 0 +ZCorner 59820 23678 0 +ZCorner 59899 23594 0 +ZCorner 59978 23510 0 +ZCorner 60057 23426 0 +ZCorner 60136 23342 0 +ZCorner 60188 23381 0 +ZCorner 60240 23420 0 +ZCorner 60292 23460 0 +ZCorner 60343 23499 0 +ZCorner 60281 23597 0 +ZCorner 60218 23696 0 +ZCorner 60156 23794 0 +ZCorner 60093 23893 0 +ZCorner 60133 23934 0 +ZCorner 60174 23975 0 +ZCorner 60214 24016 0 +ZCorner 60254 24057 0 +ZCorner 60353 23994 0 +ZCorner 60453 23930 0 +ZCorner 60552 23867 0 +ZCorner 60652 23803 0 +ZCorner 60692 23853 0 +ZCorner 60732 23903 0 +ZCorner 60772 23953 0 +ZCorner 60812 24003 0 +ZCorner 60726 24084 0 +ZCorner 60640 24165 0 +ZCorner 60554 24246 0 +ZCorner 60468 24327 0 +ZCorner 60499 24376 0 +ZCorner 60529 24426 0 +ZCorner 60559 24476 0 +ZCorner 60589 24526 0 +ZCorner 60589 24529 0 +ZCorner 60589 24532 0 +ZCorner 60589 24535 0 +ZCorner 60589 24538 0 +ZCorner 60590 24538 0 +ZCorner 60591 24538 0 +ZCorner 60592 24538 0 +ZCorner 60593 24538 0 +ZCorner 60592 24535 0 +ZCorner 60591 24532 0 +ZCorner 60590 24529 0 +ZCorner 60589 24526 0 +ZCorner 60699 24488 0 +ZCorner 60808 24450 0 +ZCorner 60917 24412 0 +ZCorner 61039 24379 0 +ZCorner 61062 24431 0 +ZCorner 61097 24514 0 +ZCorner 61418 24495 0 +ZCorner 61666 24497 0 +ZCorner 61841 24519 0 +ZCorner 61945 24561 0 +ZCorner 61962 24569 0 +ZCorner 61980 24577 0 +ZCorner 61997 24584 0 +ZCorner 62015 24592 0 +ZCorner 62016 24564 0 +ZCorner 62017 24536 0 +ZCorner 62018 24507 0 +ZCorner 62019 24479 0 +ZCorner 62020 24466 0 +ZCorner 62021 24454 0 +ZCorner 62022 24441 0 +ZCorner 62023 24428 0 +ZCorner 62026 24416 0 +ZCorner 62028 24405 0 +ZCorner 62031 24393 0 +ZCorner 62034 24381 0 +ZCorner 62039 24373 0 +ZCorner 62044 24364 0 +ZCorner 62049 24355 0 +ZCorner 62054 24346 0 +ZCorner 62064 24337 0 +ZCorner 62073 24329 0 +ZCorner 62083 24320 0 +ZCorner 62093 24311 0 +ZCorner 62099 24308 0 +ZCorner 62105 24305 0 +ZCorner 62110 24302 0 +ZCorner 62116 24299 0 +ZCorner 62120 24296 0 +ZCorner 62124 24294 0 +ZCorner 62128 24291 0 +ZCorner 62132 24288 0 +ZCorner 62199 24278 0 +ZCorner 62366 24274 0 +ZCorner 62633 24276 0 +ZCorner 62999 24284 0 +ZCorner 63047 24298 0 +ZCorner 63082 24356 0 +ZCorner 63102 24458 0 +ZCorner 63108 24604 0 +ZCorner 63108 24609 0 +ZCorner 63108 24614 0 +ZCorner 63108 24619 0 +ZCorner 63108 24623 0 +ZCorner 63121 24629 0 +ZCorner 63134 24635 0 +ZCorner 63146 24641 0 +ZCorner 63159 24647 0 +ZCorner 63167 24655 0 +ZCorner 63175 24663 0 +ZCorner 63183 24670 0 +ZCorner 63190 24678 0 +ZCorner 63199 24702 0 +ZCorner 63208 24725 0 +ZCorner 63217 24748 0 +ZCorner 63225 24772 0 +ZCorner 64322 24772 0 +ZCorner 65418 24772 0 +ZCorner 66515 24772 0 +ZCorner 67611 24772 0 +ZCorner 67554 24885 0 +ZCorner 67515 24953 0 +ZCorner 67495 24977 0 +ZCorner 67494 24955 0 +ZCorner 67421 24967 0 +ZCorner 67348 24974 0 +ZCorner 67276 24976 0 +ZCorner 67205 24975 0 +ZCorner 66500 24975 0 +ZCorner 65794 24975 0 +ZCorner 65088 24975 0 +ZCorner 64382 24975 0 +ZCorner 64356 24947 0 +ZCorner 64331 24918 0 +ZCorner 64306 24890 0 +ZCorner 64280 24862 0 +ZCorner 64020 24862 0 +ZCorner 63759 24862 0 +ZCorner 63498 24862 0 +ZCorner 63237 24862 0 +ZCorner 63238 24888 0 +ZCorner 63239 24914 0 +ZCorner 63240 24941 0 +ZCorner 63241 24967 0 +ZCorner 63238 24982 0 +ZCorner 63235 24997 0 +ZCorner 63233 25011 0 +ZCorner 63230 25026 0 +ZCorner 64353 25026 0 +ZCorner 65477 25026 0 +ZCorner 66601 25026 0 +ZCorner 67725 25026 0 +ZCorner 67756 25022 0 +ZCorner 67732 25070 0 +ZCorner 67653 25170 0 +ZCorner 67522 25323 0 +ZCorner 67516 25341 0 +ZCorner 67510 25360 0 +ZCorner 67504 25378 0 +ZCorner 67498 25397 0 +ZCorner 66476 25398 0 +ZCorner 65454 25399 0 +ZCorner 64432 25400 0 +ZCorner 63409 25401 0 +ZCorner 63333 25400 0 +ZCorner 63257 25399 0 +ZCorner 63181 25398 0 +ZCorner 63105 25397 0 +ZCorner 63105 25399 0 +ZCorner 63105 25401 0 +ZCorner 63105 25403 0 +ZCorner 63105 25405 0 +ZCorner 63105 25447 0 +ZCorner 63105 25490 0 +ZCorner 63105 25533 0 +ZCorner 63105 25576 0 +ZCorner 64187 25576 0 +ZCorner 65270 25576 0 +ZCorner 66353 25576 0 +ZCorner 67436 25576 0 +ZCorner 67372 25652 0 +ZCorner 67309 25727 0 +ZCorner 67245 25802 0 +ZCorner 67182 25877 0 +ZCorner 67175 25949 0 +ZCorner 67161 26012 0 +ZCorner 67140 26068 0 +ZCorner 67111 26115 0 +ZCorner 67090 26139 0 +ZCorner 67067 26157 0 +ZCorner 67042 26170 0 +ZCorner 67014 26178 0 +ZCorner 66981 26180 0 +ZCorner 66948 26182 0 +ZCorner 66914 26184 0 +ZCorner 66881 26185 0 +ZCorner 66873 26185 0 +ZCorner 66865 26184 0 +ZCorner 66858 26183 0 +ZCorner 66850 26182 0 +ZCorner 66837 26178 0 +ZCorner 66824 26174 0 +ZCorner 66812 26170 0 +ZCorner 66799 26166 0 +ZCorner 66791 26160 0 +ZCorner 66784 26154 0 +ZCorner 66776 26148 0 +ZCorner 66768 26143 0 +ZCorner 66761 26137 0 +ZCorner 66754 26131 0 +ZCorner 66747 26125 0 +ZCorner 66741 26119 0 +ZCorner 66732 26114 0 +ZCorner 66723 26109 0 +ZCorner 66714 26105 0 +ZCorner 66705 26100 0 +ZCorner 66692 26095 0 +ZCorner 66678 26090 0 +ZCorner 66664 26085 0 +ZCorner 66651 26080 0 +ZCorner 66627 26080 0 +ZCorner 66604 26080 0 +ZCorner 66580 26080 0 +ZCorner 66557 26080 0 +ZCorner 66548 26081 0 +ZCorner 66539 26082 0 +ZCorner 66531 26083 0 +ZCorner 66522 26084 0 +ZCorner 66508 26088 0 +ZCorner 66495 26092 0 +ZCorner 66481 26096 0 +ZCorner 66467 26100 0 +ZCorner 66455 26109 0 +ZCorner 66442 26119 0 +ZCorner 66429 26129 0 +ZCorner 66416 26139 0 +ZCorner 66373 26195 0 +ZCorner 66329 26252 0 +ZCorner 66285 26309 0 +ZCorner 66241 26365 0 +ZCorner 66222 26384 0 +ZCorner 66193 26400 0 +ZCorner 66156 26412 0 +ZCorner 66108 26420 0 +ZCorner 66103 26419 0 +ZCorner 66098 26418 0 +ZCorner 66093 26417 0 +ZCorner 66088 26416 0 +ZCorner 66087 26416 0 +ZCorner 66086 26416 0 +ZCorner 66085 26416 0 +ZCorner 66084 26416 0 +ZCorner 66073 26413 0 +ZCorner 66061 26410 0 +ZCorner 66049 26407 0 +ZCorner 66038 26404 0 +ZCorner 66024 26395 0 +ZCorner 66010 26385 0 +ZCorner 65997 26375 0 +ZCorner 65983 26365 0 +ZCorner 65968 26351 0 +ZCorner 65954 26336 0 +ZCorner 65939 26321 0 +ZCorner 65924 26307 0 +ZCorner 65912 26292 0 +ZCorner 65899 26277 0 +ZCorner 65886 26263 0 +ZCorner 65874 26248 0 +ZCorner 65860 26234 0 +ZCorner 65846 26221 0 +ZCorner 65833 26207 0 +ZCorner 65819 26193 0 +ZCorner 65816 26192 0 +ZCorner 65813 26191 0 +ZCorner 65810 26190 0 +ZCorner 65807 26189 0 +ZCorner 65792 26180 0 +ZCorner 65776 26170 0 +ZCorner 65760 26160 0 +ZCorner 65745 26150 0 +ZCorner 65738 26150 0 +ZCorner 65731 26150 0 +ZCorner 65724 26150 0 +ZCorner 65717 26150 0 +ZCorner 65705 26147 0 +ZCorner 65692 26144 0 +ZCorner 65679 26142 0 +ZCorner 65667 26139 0 +ZCorner 65653 26141 0 +ZCorner 65639 26143 0 +ZCorner 65626 26145 0 +ZCorner 65612 26146 0 +ZCorner 65609 26146 0 +ZCorner 65606 26146 0 +ZCorner 65603 26146 0 +ZCorner 65600 26146 0 +ZCorner 65577 26151 0 +ZCorner 65553 26156 0 +ZCorner 65530 26161 0 +ZCorner 65507 26166 0 +ZCorner 65493 26174 0 +ZCorner 65479 26182 0 +ZCorner 65465 26189 0 +ZCorner 65452 26197 0 +ZCorner 65429 26220 0 +ZCorner 65407 26242 0 +ZCorner 65384 26265 0 +ZCorner 65362 26287 0 +ZCorner 65304 26395 0 +ZCorner 65254 26475 0 +ZCorner 65212 26526 0 +ZCorner 65178 26549 0 +ZCorner 65135 26550 0 +ZCorner 65092 26551 0 +ZCorner 65049 26552 0 +ZCorner 65006 26553 0 +ZCorner 65000 26550 0 +ZCorner 64993 26547 0 +ZCorner 64986 26544 0 +ZCorner 64979 26541 0 +ZCorner 64968 26535 0 +ZCorner 64958 26528 0 +ZCorner 64947 26521 0 +ZCorner 64936 26514 0 +ZCorner 64926 26501 0 +ZCorner 64917 26489 0 +ZCorner 64907 26476 0 +ZCorner 64897 26463 0 +ZCorner 64884 26444 0 +ZCorner 64872 26424 0 +ZCorner 64859 26405 0 +ZCorner 64846 26385 0 +ZCorner 64832 26366 0 +ZCorner 64817 26346 0 +ZCorner 64802 26327 0 +ZCorner 64788 26307 0 +ZCorner 64774 26292 0 +ZCorner 64760 26276 0 +ZCorner 64747 26260 0 +ZCorner 64733 26245 0 +ZCorner 64716 26234 0 +ZCorner 64700 26223 0 +ZCorner 64683 26212 0 +ZCorner 64667 26202 0 +ZCorner 64665 26200 0 +ZCorner 64663 26198 0 +ZCorner 64661 26196 0 +ZCorner 64659 26194 0 +ZCorner 64640 26188 0 +ZCorner 64622 26182 0 +ZCorner 64603 26176 0 +ZCorner 64585 26170 0 +ZCorner 64567 26168 0 +ZCorner 64550 26165 0 +ZCorner 64532 26162 0 +ZCorner 64514 26159 0 +ZCorner 64512 26158 0 +ZCorner 64509 26157 0 +ZCorner 64506 26156 0 +ZCorner 64503 26155 0 +ZCorner 64496 26155 0 +ZCorner 64489 26155 0 +ZCorner 64482 26155 0 +ZCorner 64475 26155 0 +ZCorner 64450 26153 0 +ZCorner 64425 26151 0 +ZCorner 64399 26149 0 +ZCorner 64374 26147 0 +ZCorner 64341 26148 0 +ZCorner 64307 26149 0 +ZCorner 64274 26150 0 +ZCorner 64241 26151 0 +ZCorner 64133 26182 0 +ZCorner 64048 26227 0 +ZCorner 63988 26286 0 +ZCorner 63952 26358 0 +ZCorner 63738 26358 0 +ZCorner 63524 26358 0 +ZCorner 63311 26358 0 +ZCorner 63097 26358 0 +ZCorner 63097 26370 0 +ZCorner 63097 26381 0 +ZCorner 63097 26393 0 +ZCorner 63097 26405 0 +ZCorner 63097 26407 0 +ZCorner 63097 26409 0 +ZCorner 63097 26411 0 +ZCorner 63097 26413 0 +ZCorner 63287 26413 0 +ZCorner 63477 26413 0 +ZCorner 63668 26413 0 +ZCorner 63858 26413 0 +ZCorner 63890 26405 0 +ZCorner 63888 26442 0 +ZCorner 63851 26522 0 +ZCorner 63780 26647 0 +ZCorner 63600 26647 0 +ZCorner 63421 26647 0 +ZCorner 63241 26647 0 +ZCorner 63061 26647 0 +ZCorner 62985 26755 0 +ZCorner 62900 26838 0 +ZCorner 62809 26897 0 +ZCorner 62710 26932 0 +ZCorner 62684 26941 0 +ZCorner 62623 26949 0 +ZCorner 62527 26955 0 +ZCorner 62398 26959 0 +ZCorner 62294 26957 0 +ZCorner 62191 26955 0 +ZCorner 62087 26953 0 +ZCorner 61984 26951 0 +ZCorner 61984 26924 0 +ZCorner 61984 26897 0 +ZCorner 61984 26869 0 +ZCorner 61984 26842 0 +ZCorner 61966 26851 0 +ZCorner 61949 26860 0 +ZCorner 61931 26868 0 +ZCorner 61913 26877 0 +ZCorner 61857 26900 0 +ZCorner 61789 26920 0 +ZCorner 61710 26938 0 +ZCorner 61621 26951 0 +ZCorner 61540 26954 0 +ZCorner 61458 26957 0 +ZCorner 61377 26960 0 +ZCorner 61296 26963 0 +ZCorner 61242 26956 0 +ZCorner 61187 26950 0 +ZCorner 61132 26943 0 +ZCorner 61078 26936 0 +ZCorner 60958 26885 0 +ZCorner 60866 26856 0 +ZCorner 60804 26848 0 +ZCorner 60769 26862 0 +ZCorner 60826 26903 0 +ZCorner 60883 26944 0 +ZCorner 60939 26985 0 +ZCorner 60996 27026 0 +ZCorner 60964 27081 0 +ZCorner 60931 27137 0 +ZCorner 60899 27192 0 +ZCorner 60867 27248 0 +ZCorner 60760 27197 0 +ZCorner 60654 27147 0 +ZCorner 60548 27096 0 +ZCorner 60441 27045 0 +ZCorner 60406 27092 0 +ZCorner 60371 27139 0 +ZCorner 60336 27186 0 +ZCorner 60301 27232 0 +ZCorner 60375 27323 0 +ZCorner 60449 27414 0 +ZCorner 60523 27505 0 +ZCorner 60597 27596 0 +ZCorner 60551 27640 0 +ZCorner 60506 27685 0 +ZCorner 60460 27730 0 +ZCorner 60414 27775 0 +ZCorner 60323 27700 0 +ZCorner 60232 27625 0 +ZCorner 60141 27550 0 +ZCorner 60050 27475 0 +ZCorner 60006 27511 0 +ZCorner 59961 27547 0 +ZCorner 59916 27583 0 +ZCorner 59871 27619 0 +ZCorner 59922 27724 0 +ZCorner 59972 27830 0 +ZCorner 60023 27935 0 +ZCorner 60074 28041 0 +ZCorner 60017 28074 0 +ZCorner 59961 28107 0 +ZCorner 59904 28140 0 +ZCorner 59847 28174 0 +ZCorner 59781 28082 0 +ZCorner 59715 27990 0 +ZCorner 59648 27898 0 +ZCorner 59582 27806 0 +ZCorner 59580 27805 0 +ZCorner 59578 27803 0 +ZCorner 59576 27801 0 +ZCorner 59574 27799 0 +ZCorner 59521 27822 0 +ZCorner 59469 27846 0 +ZCorner 59416 27869 0 +ZCorner 59363 27892 0 +ZCorner 59387 28007 0 +ZCorner 59410 28121 0 +ZCorner 59434 28235 0 +ZCorner 59457 28349 0 +ZCorner 59394 28369 0 +ZCorner 59332 28388 0 +ZCorner 59270 28408 0 +ZCorner 59207 28427 0 +ZCorner 59164 28320 0 +ZCorner 59121 28213 0 +ZCorner 59078 28105 0 +ZCorner 59035 27998 0 +ZCorner 58978 28008 0 +ZCorner 58920 28019 0 +ZCorner 58862 28030 0 +ZCorner 58805 28041 0 +ZCorner 58801 28157 0 +ZCorner 58797 28273 0 +ZCorner 58793 28389 0 +ZCorner 58789 28506 0 +ZCorner 58723 28509 0 +ZCorner 58656 28513 0 +ZCorner 58590 28517 0 +ZCorner 58524 28521 0 +ZCorner 58507 28405 0 +ZCorner 58490 28289 0 +ZCorner 58474 28172 0 +ZCorner 58457 28056 0 +ZCorner 58400 28053 0 +ZCorner 58342 28050 0 +ZCorner 58284 28048 0 +ZCorner 58227 28045 0 +ZCorner 58195 28157 0 +ZCorner 58162 28269 0 +ZCorner 58130 28382 0 +ZCorner 58098 28494 0 +ZCorner 58034 28483 0 +ZCorner 57969 28472 0 +ZCorner 57905 28461 0 +ZCorner 57840 28451 0 +ZCorner 57851 28334 0 +ZCorner 57862 28216 0 +ZCorner 57872 28099 0 +ZCorner 57883 27982 0 +ZCorner 57828 27965 0 +ZCorner 57774 27947 0 +ZCorner 57719 27929 0 +ZCorner 57664 27912 0 +ZCorner 57608 28012 0 +ZCorner 57551 28113 0 +ZCorner 57494 28214 0 +ZCorner 57438 28314 0 +ZCorner 57437 28322 0 +ZCorner 57416 28317 0 +ZCorner 57374 28299 0 +ZCorner 57309 28267 0 +ZCorner 57279 28257 0 +ZCorner 57248 28246 0 +ZCorner 57218 28235 0 +ZCorner 57188 28224 0 +ZCorner 57209 28159 0 +ZCorner 57243 28062 0 +ZCorner 57288 27933 0 +ZCorner 57344 27771 0 +ZCorner 57295 27742 0 +ZCorner 57247 27713 0 +ZCorner 57198 27684 0 +ZCorner 57149 27654 0 +ZCorner 57070 27736 0 +ZCorner 56991 27818 0 +ZCorner 56912 27900 0 +ZCorner 56833 27982 0 +ZCorner 56793 27962 0 +ZCorner 56745 27930 0 +ZCorner 56688 27887 0 +ZCorner 56622 27834 0 +ZCorner 56685 27736 0 +ZCorner 56749 27639 0 +ZCorner 56812 27541 0 +ZCorner 56876 27443 0 +ZCorner 56878 27444 0 +ZCorner 56880 27445 0 +ZCorner 56882 27446 0 +ZCorner 56884 27447 0 +ZCorner 56883 27446 0 +ZCorner 56882 27445 0 +ZCorner 56880 27444 0 +ZCorner 56879 27443 0 +ZCorner 56837 27400 0 +ZCorner 56794 27358 0 +ZCorner 56751 27315 0 +ZCorner 56708 27272 0 +ZCorner 56610 27337 0 +ZCorner 56513 27402 0 +ZCorner 56415 27468 0 +ZCorner 56317 27533 0 +ZCorner 56294 27503 0 +ZCorner 56260 27459 0 +ZCorner 56215 27399 0 +ZCorner 56161 27322 0 +ZCorner 56245 27244 0 +ZCorner 56329 27166 0 +ZCorner 56413 27088 0 +ZCorner 56497 27010 0 +ZCorner 56487 26991 0 +ZCorner 56477 26973 0 +ZCorner 56468 26954 0 +ZCorner 56458 26936 0 +ZCorner 56326 26939 0 +ZCorner 56194 26942 0 +ZCorner 56063 26945 0 +ZCorner 55931 26947 0 +ZCorner 55905 26944 0 +ZCorner 55880 26940 0 +ZCorner 55855 26936 0 +ZCorner 55829 26932 0 +ZCorner 55819 26926 0 +ZCorner 55810 26920 0 +ZCorner 55800 26914 0 +ZCorner 55790 26908 0 +ZCorner 55769 26884 0 +ZCorner 55747 26860 0 +ZCorner 55726 26835 0 +ZCorner 55704 26811 0 +ZCorner 55684 26799 0 +ZCorner 55663 26787 0 +ZCorner 55643 26776 0 +ZCorner 55622 26764 0 +ZCorner 55618 26778 0 +ZCorner 55614 26791 0 +ZCorner 55611 26805 0 +ZCorner 55607 26819 0 +ZCorner 55601 26830 0 +ZCorner 55595 26842 0 +ZCorner 55589 26854 0 +ZCorner 55583 26865 0 +ZCorner 55577 26872 0 +ZCorner 55571 26879 0 +ZCorner 55566 26886 0 +ZCorner 55560 26893 0 +ZCorner 55555 26897 0 +ZCorner 55550 26901 0 +ZCorner 55545 26905 0 +ZCorner 55540 26908 0 +ZCorner 55545 26918 0 +ZCorner 55507 26924 0 +ZCorner 55425 26925 0 +ZCorner 55298 26924 0 +ZCorner 54989 26923 0 +ZCorner 54679 26922 0 +ZCorner 54369 26921 0 +ZCorner 54060 26920 0 +ZCorner 53960 26863 0 +ZCorner 53895 26798 0 +ZCorner 53863 26726 0 +ZCorner 53865 26647 0 +ZCorner 53696 26647 0 +ZCorner 53527 26647 0 +ZCorner 53358 26647 0 +ZCorner 53189 26647 0 +ZCorner 53123 26536 0 +ZCorner 53089 26459 0 +ZCorner 53085 26418 0 +ZCorner 53111 26413 0 +ZCorner 53300 26413 0 +ZCorner 53490 26413 0 +ZCorner 53679 26413 0 +ZCorner 53869 26413 0 +ZCorner 53869 26411 0 +ZCorner 53869 26409 0 +ZCorner 53869 26407 0 +ZCorner 53869 26405 0 +ZCorner 53869 26393 0 +ZCorner 53869 26381 0 +ZCorner 53869 26370 0 +ZCorner 53869 26358 0 +ZCorner 53654 26358 0 +ZCorner 53439 26358 0 +ZCorner 53224 26358 0 +ZCorner 53010 26358 0 +ZCorner 52953 26259 0 +ZCorner 52866 26191 0 +ZCorner 52747 26154 0 +ZCorner 52596 26147 0 +ZCorner 52570 26149 0 +ZCorner 52545 26151 0 +ZCorner 52519 26153 0 +ZCorner 52494 26155 0 +ZCorner 52487 26155 0 +ZCorner 52480 26155 0 +ZCorner 52474 26155 0 +ZCorner 52467 26155 0 +ZCorner 52464 26156 0 +ZCorner 52461 26157 0 +ZCorner 52458 26158 0 +ZCorner 52455 26159 0 +ZCorner 52437 26162 0 +ZCorner 52420 26165 0 +ZCorner 52402 26168 0 +ZCorner 52385 26170 0 +ZCorner 52367 26176 0 +ZCorner 52350 26182 0 +ZCorner 52332 26188 0 +ZCorner 52315 26194 0 +ZCorner 52313 26196 0 +ZCorner 52310 26198 0 +ZCorner 52308 26200 0 +ZCorner 52306 26202 0 +ZCorner 52290 26212 0 +ZCorner 52273 26223 0 +ZCorner 52257 26234 0 +ZCorner 52240 26245 0 +ZCorner 52227 26260 0 +ZCorner 52213 26276 0 +ZCorner 52199 26292 0 +ZCorner 52185 26307 0 +ZCorner 52172 26327 0 +ZCorner 52158 26346 0 +ZCorner 52144 26366 0 +ZCorner 52131 26385 0 +ZCorner 52117 26405 0 +ZCorner 52103 26424 0 +ZCorner 52090 26444 0 +ZCorner 52076 26463 0 +ZCorner 52065 26476 0 +ZCorner 52054 26489 0 +ZCorner 52044 26502 0 +ZCorner 52033 26514 0 +ZCorner 52022 26521 0 +ZCorner 52011 26528 0 +ZCorner 52000 26535 0 +ZCorner 51990 26542 0 +ZCorner 51983 26544 0 +ZCorner 51976 26547 0 +ZCorner 51969 26550 0 +ZCorner 51963 26553 0 +ZCorner 51924 26553 0 +ZCorner 51885 26553 0 +ZCorner 51846 26553 0 +ZCorner 51807 26553 0 +ZCorner 51797 26547 0 +ZCorner 51787 26542 0 +ZCorner 51777 26536 0 +ZCorner 51767 26530 0 +ZCorner 51748 26505 0 +ZCorner 51728 26481 0 +ZCorner 51709 26457 0 +ZCorner 51689 26432 0 +ZCorner 51641 26344 0 +ZCorner 51601 26280 0 +ZCorner 51569 26239 0 +ZCorner 51545 26221 0 +ZCorner 51524 26208 0 +ZCorner 51504 26194 0 +ZCorner 51483 26180 0 +ZCorner 51463 26167 0 +ZCorner 51439 26162 0 +ZCorner 51416 26157 0 +ZCorner 51392 26152 0 +ZCorner 51369 26147 0 +ZCorner 51366 26147 0 +ZCorner 51363 26147 0 +ZCorner 51360 26147 0 +ZCorner 51357 26147 0 +ZCorner 51341 26145 0 +ZCorner 51326 26143 0 +ZCorner 51310 26141 0 +ZCorner 51295 26139 0 +ZCorner 51284 26142 0 +ZCorner 51273 26145 0 +ZCorner 51262 26148 0 +ZCorner 51252 26151 0 +ZCorner 51245 26151 0 +ZCorner 51238 26151 0 +ZCorner 51231 26151 0 +ZCorner 51224 26151 0 +ZCorner 51209 26161 0 +ZCorner 51193 26171 0 +ZCorner 51178 26180 0 +ZCorner 51162 26190 0 +ZCorner 51160 26191 0 +ZCorner 51158 26192 0 +ZCorner 51156 26193 0 +ZCorner 51154 26194 0 +ZCorner 51141 26207 0 +ZCorner 51129 26219 0 +ZCorner 51116 26232 0 +ZCorner 51103 26245 0 +ZCorner 51090 26261 0 +ZCorner 51076 26276 0 +ZCorner 51062 26292 0 +ZCorner 51049 26307 0 +ZCorner 51034 26322 0 +ZCorner 51019 26337 0 +ZCorner 51005 26351 0 +ZCorner 50990 26366 0 +ZCorner 50975 26376 0 +ZCorner 50961 26385 0 +ZCorner 50946 26395 0 +ZCorner 50931 26405 0 +ZCorner 50920 26408 0 +ZCorner 50908 26411 0 +ZCorner 50896 26414 0 +ZCorner 50885 26417 0 +ZCorner 50884 26417 0 +ZCorner 50883 26417 0 +ZCorner 50882 26417 0 +ZCorner 50881 26417 0 +ZCorner 50876 26418 0 +ZCorner 50871 26419 0 +ZCorner 50866 26420 0 +ZCorner 50861 26421 0 +ZCorner 50838 26415 0 +ZCorner 50814 26409 0 +ZCorner 50791 26403 0 +ZCorner 50767 26397 0 +ZCorner 50763 26393 0 +ZCorner 50760 26389 0 +ZCorner 50756 26386 0 +ZCorner 50752 26382 0 +ZCorner 50638 26234 0 +ZCorner 50550 26135 0 +ZCorner 50487 26086 0 +ZCorner 50451 26085 0 +ZCorner 50441 26084 0 +ZCorner 50431 26083 0 +ZCorner 50422 26082 0 +ZCorner 50412 26081 0 +ZCorner 50390 26081 0 +ZCorner 50367 26081 0 +ZCorner 50345 26081 0 +ZCorner 50322 26081 0 +ZCorner 50308 26086 0 +ZCorner 50295 26091 0 +ZCorner 50281 26096 0 +ZCorner 50268 26100 0 +ZCorner 50259 26105 0 +ZCorner 50250 26110 0 +ZCorner 50241 26115 0 +ZCorner 50232 26120 0 +ZCorner 50224 26126 0 +ZCorner 50217 26132 0 +ZCorner 50209 26138 0 +ZCorner 50201 26143 0 +ZCorner 50193 26149 0 +ZCorner 50185 26155 0 +ZCorner 50177 26161 0 +ZCorner 50170 26167 0 +ZCorner 50158 26171 0 +ZCorner 50146 26175 0 +ZCorner 50135 26179 0 +ZCorner 50123 26182 0 +ZCorner 50114 26183 0 +ZCorner 50105 26184 0 +ZCorner 50096 26185 0 +ZCorner 50087 26186 0 +ZCorner 50059 26185 0 +ZCorner 50031 26184 0 +ZCorner 50003 26183 0 +ZCorner 49974 26182 0 +ZCorner 49934 26172 0 +ZCorner 49902 26158 0 +ZCorner 49879 26141 0 +ZCorner 49865 26124 0 +ZCorner 49832 26071 0 +ZCorner 49808 26013 0 +ZCorner 49793 25948 0 +ZCorner 49787 25878 0 +ZCorner 49724 25803 0 +ZCorner 49662 25727 0 +ZCorner 49599 25652 0 +ZCorner 49537 25577 0 +ZCorner 50622 25577 0 +ZCorner 51706 25577 0 +ZCorner 52791 25577 0 +ZCorner 53876 25577 0 +ZCorner 53876 25534 0 +ZCorner 53876 25491 0 +ZCorner 53876 25448 0 +ZCorner 53876 25405 0 +ZCorner 53876 25403 0 +ZCorner 53876 25401 0 +ZCorner 53876 25399 0 +ZCorner 53876 25397 0 +ZCorner 53800 25398 0 +ZCorner 53724 25399 0 +ZCorner 53647 25400 0 +ZCorner 53571 25401 0 +ZCorner 52551 25400 0 +ZCorner 51531 25399 0 +ZCorner 50510 25398 0 +ZCorner 49490 25397 0 +ZCorner 49490 25397 0 +ZCorner 49490 25395 0 +ZCorner 49488 25392 0 +ZCorner 49486 25390 0 +ZCorner 49462 25350 0 +ZCorner 49413 25284 0 +ZCorner 49339 25192 0 +ZCorner 49240 25073 0 +ZCorner 49240 25062 0 +ZCorner 49240 25050 0 +ZCorner 49240 25038 0 +ZCorner 49240 25026 0 +ZCorner 50400 25026 0 +ZCorner 51560 25026 0 +ZCorner 52720 25026 0 +ZCorner 53880 25026 1 +ZCorner 63105 26030 0 +ZCorner 63605 26030 0 +ZCorner 64104 26030 0 +ZCorner 64604 26030 0 +ZCorner 65104 26030 0 +ZCorner 65137 26029 0 +ZCorner 65171 26028 0 +ZCorner 65204 26027 0 +ZCorner 65237 26026 0 +ZCorner 65198 25987 0 +ZCorner 65159 25948 0 +ZCorner 65120 25909 0 +ZCorner 65081 25870 0 +ZCorner 65047 25870 0 +ZCorner 65012 25870 0 +ZCorner 64978 25870 0 +ZCorner 64944 25870 0 +ZCorner 64484 25870 0 +ZCorner 64024 25870 0 +ZCorner 63564 25870 0 +ZCorner 63105 25870 0 +ZCorner 63105 25910 0 +ZCorner 63105 25950 0 +ZCorner 63105 25990 0 +ZCorner 63105 26030 1 +ZCorner 62183 26604 0 +ZCorner 62269 26604 0 +ZCorner 62355 26604 0 +ZCorner 62441 26604 0 +ZCorner 62527 26604 0 +ZCorner 62606 26598 0 +ZCorner 62664 26592 0 +ZCorner 62699 26585 0 +ZCorner 62710 26577 0 +ZCorner 62813 26518 0 +ZCorner 62880 26435 0 +ZCorner 62912 26327 0 +ZCorner 62909 26194 0 +ZCorner 62909 25925 0 +ZCorner 62909 25657 0 +ZCorner 62909 25388 0 +ZCorner 62909 25120 0 +ZCorner 62922 25120 0 +ZCorner 62935 25120 0 +ZCorner 62948 25120 0 +ZCorner 62960 25120 0 +ZCorner 62974 25118 0 +ZCorner 62988 25116 0 +ZCorner 63001 25114 0 +ZCorner 63015 25112 0 +ZCorner 63019 25111 0 +ZCorner 63023 25110 0 +ZCorner 63027 25109 0 +ZCorner 63030 25108 0 +ZCorner 63030 25088 0 +ZCorner 63030 25067 0 +ZCorner 63030 25047 0 +ZCorner 63030 25026 0 +ZCorner 63030 24981 0 +ZCorner 63030 24936 0 +ZCorner 63030 24891 0 +ZCorner 63030 24846 0 +ZCorner 63030 24841 0 +ZCorner 63030 24835 0 +ZCorner 63030 24829 0 +ZCorner 63030 24823 0 +ZCorner 63013 24823 0 +ZCorner 62995 24823 0 +ZCorner 62978 24823 0 +ZCorner 62960 24823 0 +ZCorner 62948 24822 0 +ZCorner 62935 24821 0 +ZCorner 62922 24820 0 +ZCorner 62909 24819 0 +ZCorner 62909 24750 0 +ZCorner 62909 24680 0 +ZCorner 62909 24611 0 +ZCorner 62909 24542 0 +ZCorner 62771 24542 0 +ZCorner 62632 24542 0 +ZCorner 62493 24542 0 +ZCorner 62355 24542 0 +ZCorner 62344 24546 0 +ZCorner 62333 24550 0 +ZCorner 62323 24553 0 +ZCorner 62312 24557 0 +ZCorner 62313 24624 0 +ZCorner 62314 24690 0 +ZCorner 62315 24757 0 +ZCorner 62316 24823 0 +ZCorner 62286 24824 0 +ZCorner 62257 24825 0 +ZCorner 62228 24826 0 +ZCorner 62199 24827 0 +ZCorner 62192 24828 0 +ZCorner 62185 24829 0 +ZCorner 62178 24830 0 +ZCorner 62171 24831 0 +ZCorner 62169 24834 0 +ZCorner 62167 24837 0 +ZCorner 62165 24840 0 +ZCorner 62163 24842 0 +ZCorner 62163 24910 0 +ZCorner 62163 24977 0 +ZCorner 62163 25045 0 +ZCorner 62163 25112 0 +ZCorner 62166 25114 0 +ZCorner 62169 25116 0 +ZCorner 62172 25118 0 +ZCorner 62175 25120 0 +ZCorner 62210 25120 0 +ZCorner 62245 25120 0 +ZCorner 62281 25120 0 +ZCorner 62316 25120 0 +ZCorner 62315 25388 0 +ZCorner 62314 25657 0 +ZCorner 62313 25925 0 +ZCorner 62312 26194 0 +ZCorner 62318 26246 0 +ZCorner 62302 26283 0 +ZCorner 62264 26305 0 +ZCorner 62202 26311 0 +ZCorner 62190 26310 0 +ZCorner 62177 26309 0 +ZCorner 62164 26308 0 +ZCorner 62152 26307 0 +ZCorner 62150 26379 0 +ZCorner 62148 26452 0 +ZCorner 62146 26524 0 +ZCorner 62144 26596 0 +ZCorner 62154 26598 0 +ZCorner 62163 26600 0 +ZCorner 62173 26602 0 +ZCorner 62183 26604 1 +ZCorner 60804 26010 0 +ZCorner 60808 26056 0 +ZCorner 60812 26102 0 +ZCorner 60816 26148 0 +ZCorner 60820 26194 0 +ZCorner 60850 26310 0 +ZCorner 60911 26412 0 +ZCorner 61004 26500 0 +ZCorner 61128 26577 0 +ZCorner 61129 26577 0 +ZCorner 61130 26577 0 +ZCorner 61131 26577 0 +ZCorner 61132 26577 0 +ZCorner 61133 26578 0 +ZCorner 61134 26579 0 +ZCorner 61135 26580 0 +ZCorner 61136 26581 0 +ZCorner 61139 26581 0 +ZCorner 61142 26582 0 +ZCorner 61145 26583 0 +ZCorner 61148 26584 0 +ZCorner 61366 26623 0 +ZCorner 61551 26635 0 +ZCorner 61703 26619 0 +ZCorner 61820 26577 0 +ZCorner 61917 26529 0 +ZCorner 61993 26450 0 +ZCorner 62049 26338 0 +ZCorner 62085 26194 0 +ZCorner 62089 26159 0 +ZCorner 62093 26124 0 +ZCorner 62097 26088 0 +ZCorner 62101 26053 0 +ZCorner 62101 25898 0 +ZCorner 62101 25743 0 +ZCorner 62101 25587 0 +ZCorner 62101 25432 0 +ZCorner 62097 25379 0 +ZCorner 62093 25325 0 +ZCorner 62089 25271 0 +ZCorner 62085 25217 0 +ZCorner 62073 25175 0 +ZCorner 62062 25133 0 +ZCorner 62050 25091 0 +ZCorner 62038 25049 0 +ZCorner 61890 24863 0 +ZCorner 61678 24768 0 +ZCorner 61403 24764 0 +ZCorner 61066 24850 0 +ZCorner 61063 24851 0 +ZCorner 61060 24852 0 +ZCorner 61057 24853 0 +ZCorner 61054 24854 0 +ZCorner 61052 24856 0 +ZCorner 61050 24858 0 +ZCorner 61048 24860 0 +ZCorner 61046 24862 0 +ZCorner 61026 24869 0 +ZCorner 61002 24883 0 +ZCorner 60974 24905 0 +ZCorner 60941 24936 0 +ZCorner 60921 24964 0 +ZCorner 60902 24993 0 +ZCorner 60882 25021 0 +ZCorner 60863 25049 0 +ZCorner 60852 25080 0 +ZCorner 60841 25110 0 +ZCorner 60830 25140 0 +ZCorner 60820 25170 0 +ZCorner 60815 25236 0 +ZCorner 60810 25301 0 +ZCorner 60805 25367 0 +ZCorner 60800 25432 0 +ZCorner 60801 25577 0 +ZCorner 60802 25721 0 +ZCorner 60803 25866 0 +ZCorner 60804 26010 1 +ZCorner 59391 25260 0 +ZCorner 59391 25267 0 +ZCorner 59391 25274 0 +ZCorner 59391 25281 0 +ZCorner 59391 25288 0 +ZCorner 59391 25491 0 +ZCorner 59391 25694 0 +ZCorner 59391 25897 0 +ZCorner 59391 26100 0 +ZCorner 59392 26106 0 +ZCorner 59392 26112 0 +ZCorner 59393 26118 0 +ZCorner 59394 26124 0 +ZCorner 59394 26127 0 +ZCorner 59394 26129 0 +ZCorner 59394 26132 0 +ZCorner 59394 26135 0 +ZCorner 59395 26141 0 +ZCorner 59396 26147 0 +ZCorner 59397 26153 0 +ZCorner 59398 26159 0 +ZCorner 59398 26161 0 +ZCorner 59398 26163 0 +ZCorner 59398 26165 0 +ZCorner 59398 26167 0 +ZCorner 59399 26172 0 +ZCorner 59400 26176 0 +ZCorner 59401 26181 0 +ZCorner 59402 26186 0 +ZCorner 59402 26189 0 +ZCorner 59402 26192 0 +ZCorner 59402 26195 0 +ZCorner 59402 26198 0 +ZCorner 59403 26201 0 +ZCorner 59404 26204 0 +ZCorner 59405 26207 0 +ZCorner 59406 26209 0 +ZCorner 59406 26210 0 +ZCorner 59406 26211 0 +ZCorner 59406 26212 0 +ZCorner 59406 26213 0 +ZCorner 59407 26217 0 +ZCorner 59408 26221 0 +ZCorner 59409 26225 0 +ZCorner 59410 26229 0 +ZCorner 59410 26230 0 +ZCorner 59410 26231 0 +ZCorner 59410 26232 0 +ZCorner 59410 26233 0 +ZCorner 59411 26235 0 +ZCorner 59412 26237 0 +ZCorner 59413 26239 0 +ZCorner 59414 26241 0 +ZCorner 59414 26242 0 +ZCorner 59414 26243 0 +ZCorner 59414 26244 0 +ZCorner 59414 26245 0 +ZCorner 59419 26258 0 +ZCorner 59424 26272 0 +ZCorner 59429 26286 0 +ZCorner 59433 26299 0 +ZCorner 59470 26383 0 +ZCorner 59527 26457 0 +ZCorner 59605 26522 0 +ZCorner 59703 26577 0 +ZCorner 59926 26620 0 +ZCorner 60113 26635 0 +ZCorner 60265 26620 0 +ZCorner 60382 26577 0 +ZCorner 60491 26509 0 +ZCorner 60573 26423 0 +ZCorner 60626 26318 0 +ZCorner 60652 26194 0 +ZCorner 60656 26098 0 +ZCorner 60660 26002 0 +ZCorner 60664 25907 0 +ZCorner 60667 25811 0 +ZCorner 60663 25660 0 +ZCorner 60658 25508 0 +ZCorner 60653 25357 0 +ZCorner 60648 25206 0 +ZCorner 60637 25167 0 +ZCorner 60626 25128 0 +ZCorner 60616 25089 0 +ZCorner 60605 25049 0 +ZCorner 60506 24906 0 +ZCorner 60367 24808 0 +ZCorner 60188 24756 0 +ZCorner 59968 24749 0 +ZCorner 59780 24787 0 +ZCorner 59630 24849 0 +ZCorner 59519 24937 0 +ZCorner 59449 25049 0 +ZCorner 59438 25075 0 +ZCorner 59427 25100 0 +ZCorner 59417 25126 0 +ZCorner 59406 25151 0 +ZCorner 59405 25157 0 +ZCorner 59404 25163 0 +ZCorner 59403 25169 0 +ZCorner 59402 25175 0 +ZCorner 59401 25177 0 +ZCorner 59400 25180 0 +ZCorner 59399 25183 0 +ZCorner 59398 25186 0 +ZCorner 59398 25189 0 +ZCorner 59398 25192 0 +ZCorner 59398 25195 0 +ZCorner 59398 25198 0 +ZCorner 59397 25202 0 +ZCorner 59396 25206 0 +ZCorner 59395 25210 0 +ZCorner 59394 25214 0 +ZCorner 59394 25216 0 +ZCorner 59394 25219 0 +ZCorner 59394 25222 0 +ZCorner 59394 25225 0 +ZCorner 59393 25229 0 +ZCorner 59392 25233 0 +ZCorner 59391 25237 0 +ZCorner 59390 25241 0 +ZCorner 59390 25246 0 +ZCorner 59390 25251 0 +ZCorner 59390 25256 0 +ZCorner 59391 25260 1 +ZCorner 58930 26604 0 +ZCorner 58930 26406 0 +ZCorner 58930 26208 0 +ZCorner 58930 26009 0 +ZCorner 58930 25811 0 +ZCorner 58934 25638 0 +ZCorner 58952 25516 0 +ZCorner 58984 25448 0 +ZCorner 59027 25432 0 +ZCorner 59051 25425 0 +ZCorner 59074 25417 0 +ZCorner 59098 25409 0 +ZCorner 59121 25401 0 +ZCorner 59122 25401 0 +ZCorner 59123 25401 0 +ZCorner 59124 25401 0 +ZCorner 59125 25401 0 +ZCorner 59156 25398 0 +ZCorner 59187 25395 0 +ZCorner 59219 25392 0 +ZCorner 59250 25389 0 +ZCorner 59251 25229 0 +ZCorner 59252 25069 0 +ZCorner 59253 24909 0 +ZCorner 59254 24749 0 +ZCorner 59249 24749 0 +ZCorner 59244 24749 0 +ZCorner 59239 24749 0 +ZCorner 59234 24749 0 +ZCorner 59149 24766 0 +ZCorner 59066 24812 0 +ZCorner 58987 24888 0 +ZCorner 58910 24995 0 +ZCorner 58914 24942 0 +ZCorner 58918 24889 0 +ZCorner 58922 24837 0 +ZCorner 58926 24784 0 +ZCorner 58787 24784 0 +ZCorner 58648 24784 0 +ZCorner 58510 24784 0 +ZCorner 58371 24784 0 +ZCorner 58371 25232 0 +ZCorner 58371 25680 0 +ZCorner 58371 26128 0 +ZCorner 58371 26577 0 +ZCorner 58345 26585 0 +ZCorner 58429 26592 0 +ZCorner 58624 26598 0 +ZCorner 58930 26604 1 +ZCorner 57555 25085 0 +ZCorner 57574 25085 0 +ZCorner 57592 25085 0 +ZCorner 57611 25085 0 +ZCorner 57629 25085 0 +ZCorner 57636 25092 0 +ZCorner 57643 25098 0 +ZCorner 57650 25105 0 +ZCorner 57657 25112 0 +ZCorner 57658 25131 0 +ZCorner 57660 25149 0 +ZCorner 57662 25168 0 +ZCorner 57664 25186 0 +ZCorner 57664 25438 0 +ZCorner 57664 25690 0 +ZCorner 57664 25942 0 +ZCorner 57664 26194 0 +ZCorner 57658 26213 0 +ZCorner 57653 26233 0 +ZCorner 57647 26252 0 +ZCorner 57641 26272 0 +ZCorner 57630 26281 0 +ZCorner 57619 26289 0 +ZCorner 57609 26298 0 +ZCorner 57598 26307 0 +ZCorner 57579 26304 0 +ZCorner 57561 26301 0 +ZCorner 57542 26298 0 +ZCorner 57524 26295 0 +ZCorner 57522 26293 0 +ZCorner 57520 26291 0 +ZCorner 57518 26289 0 +ZCorner 57516 26288 0 +ZCorner 57512 26280 0 +ZCorner 57508 26272 0 +ZCorner 57504 26264 0 +ZCorner 57500 26256 0 +ZCorner 57498 26250 0 +ZCorner 57496 26245 0 +ZCorner 57494 26239 0 +ZCorner 57492 26233 0 +ZCorner 57491 26216 0 +ZCorner 57491 26200 0 +ZCorner 57490 26183 0 +ZCorner 57489 26166 0 +ZCorner 57490 26164 0 +ZCorner 57491 26162 0 +ZCorner 57491 26160 0 +ZCorner 57492 26158 0 +ZCorner 57491 26158 0 +ZCorner 57491 26158 0 +ZCorner 57490 26158 0 +ZCorner 57489 26158 0 +ZCorner 57487 26144 0 +ZCorner 57485 26129 0 +ZCorner 57483 26115 0 +ZCorner 57481 26100 0 +ZCorner 57483 26098 0 +ZCorner 57485 26096 0 +ZCorner 57487 26094 0 +ZCorner 57489 26092 0 +ZCorner 57487 26092 0 +ZCorner 57485 26092 0 +ZCorner 57483 26092 0 +ZCorner 57481 26092 0 +ZCorner 57481 26073 0 +ZCorner 57481 26053 0 +ZCorner 57481 26033 0 +ZCorner 57481 26014 0 +ZCorner 57483 26010 0 +ZCorner 57485 26006 0 +ZCorner 57487 26002 0 +ZCorner 57489 25998 0 +ZCorner 57487 25997 0 +ZCorner 57485 25996 0 +ZCorner 57483 25995 0 +ZCorner 57481 25994 0 +ZCorner 57481 25959 0 +ZCorner 57481 25924 0 +ZCorner 57481 25889 0 +ZCorner 57481 25854 0 +ZCorner 57355 25854 0 +ZCorner 57229 25854 0 +ZCorner 57103 25854 0 +ZCorner 56977 25854 0 +ZCorner 56982 25939 0 +ZCorner 56987 26024 0 +ZCorner 56991 26109 0 +ZCorner 56996 26194 0 +ZCorner 57028 26309 0 +ZCorner 57087 26411 0 +ZCorner 57174 26500 0 +ZCorner 57289 26576 0 +ZCorner 57503 26620 0 +ZCorner 57681 26635 0 +ZCorner 57824 26620 0 +ZCorner 57930 26576 0 +ZCorner 58037 26513 0 +ZCorner 58118 26427 0 +ZCorner 58173 26321 0 +ZCorner 58203 26194 0 +ZCorner 58209 26154 0 +ZCorner 58215 26115 0 +ZCorner 58221 26076 0 +ZCorner 58227 26037 0 +ZCorner 58224 25822 0 +ZCorner 58221 25608 0 +ZCorner 58218 25393 0 +ZCorner 58215 25178 0 +ZCorner 58205 25146 0 +ZCorner 58195 25114 0 +ZCorner 58186 25081 0 +ZCorner 58176 25049 0 +ZCorner 58070 24909 0 +ZCorner 57929 24812 0 +ZCorner 57752 24759 0 +ZCorner 57539 24748 0 +ZCorner 57372 24778 0 +ZCorner 57232 24837 0 +ZCorner 57122 24928 0 +ZCorner 57040 25049 0 +ZCorner 57030 25080 0 +ZCorner 57020 25112 0 +ZCorner 57010 25143 0 +ZCorner 57001 25174 0 +ZCorner 56995 25239 0 +ZCorner 56989 25303 0 +ZCorner 56983 25367 0 +ZCorner 56977 25432 0 +ZCorner 56979 25441 0 +ZCorner 56981 25449 0 +ZCorner 56983 25458 0 +ZCorner 56985 25467 0 +ZCorner 57117 25467 0 +ZCorner 57249 25467 0 +ZCorner 57380 25467 0 +ZCorner 57512 25467 0 +ZCorner 57513 25392 0 +ZCorner 57514 25317 0 +ZCorner 57515 25242 0 +ZCorner 57516 25166 0 +ZCorner 57516 25161 0 +ZCorner 57516 25157 0 +ZCorner 57516 25152 0 +ZCorner 57516 25147 0 +ZCorner 57516 25145 0 +ZCorner 57516 25143 0 +ZCorner 57516 25141 0 +ZCorner 57516 25139 0 +ZCorner 57526 25125 0 +ZCorner 57536 25112 0 +ZCorner 57545 25098 0 +ZCorner 57555 25085 1 +ZCorner 55559 25967 0 +ZCorner 55563 26024 0 +ZCorner 55567 26081 0 +ZCorner 55571 26137 0 +ZCorner 55575 26194 0 +ZCorner 55596 26297 0 +ZCorner 55652 26394 0 +ZCorner 55744 26487 0 +ZCorner 55872 26577 0 +ZCorner 56097 26621 0 +ZCorner 56285 26635 0 +ZCorner 56438 26621 0 +ZCorner 56555 26577 0 +ZCorner 56577 26566 0 +ZCorner 56598 26555 0 +ZCorner 56620 26544 0 +ZCorner 56641 26534 0 +ZCorner 56646 26529 0 +ZCorner 56651 26524 0 +ZCorner 56656 26519 0 +ZCorner 56661 26514 0 +ZCorner 56667 26510 0 +ZCorner 56674 26506 0 +ZCorner 56681 26502 0 +ZCorner 56688 26498 0 +ZCorner 56692 26493 0 +ZCorner 56696 26487 0 +ZCorner 56700 26481 0 +ZCorner 56704 26475 0 +ZCorner 56723 26463 0 +ZCorner 56744 26438 0 +ZCorner 56766 26403 0 +ZCorner 56790 26358 0 +ZCorner 56800 26317 0 +ZCorner 56811 26276 0 +ZCorner 56822 26235 0 +ZCorner 56832 26194 0 +ZCorner 56837 26138 0 +ZCorner 56842 26083 0 +ZCorner 56847 26027 0 +ZCorner 56852 25971 0 +ZCorner 56851 25836 0 +ZCorner 56850 25702 0 +ZCorner 56849 25567 0 +ZCorner 56848 25432 0 +ZCorner 56844 25380 0 +ZCorner 56840 25329 0 +ZCorner 56837 25277 0 +ZCorner 56833 25225 0 +ZCorner 56823 25161 0 +ZCorner 56812 25111 0 +ZCorner 56800 25074 0 +ZCorner 56786 25049 0 +ZCorner 56779 25036 0 +ZCorner 56772 25022 0 +ZCorner 56765 25008 0 +ZCorner 56758 24995 0 +ZCorner 56756 24995 0 +ZCorner 56753 24995 0 +ZCorner 56750 24995 0 +ZCorner 56747 24995 0 +ZCorner 56737 24980 0 +ZCorner 56727 24966 0 +ZCorner 56718 24951 0 +ZCorner 56708 24936 0 +ZCorner 56705 24934 0 +ZCorner 56702 24932 0 +ZCorner 56699 24930 0 +ZCorner 56696 24928 0 +ZCorner 56597 24838 0 +ZCorner 56459 24780 0 +ZCorner 56283 24752 0 +ZCorner 56067 24757 0 +ZCorner 55916 24795 0 +ZCorner 55790 24856 0 +ZCorner 55691 24941 0 +ZCorner 55618 25050 0 +ZCorner 55608 25079 0 +ZCorner 55597 25108 0 +ZCorner 55586 25138 0 +ZCorner 55575 25167 0 +ZCorner 55571 25233 0 +ZCorner 55567 25300 0 +ZCorner 55564 25366 0 +ZCorner 55560 25432 0 +ZCorner 55560 25566 0 +ZCorner 55560 25700 0 +ZCorner 55560 25834 0 +ZCorner 55559 25967 1 +ZCorner 54657 26604 0 +ZCorner 54666 26602 0 +ZCorner 54675 26600 0 +ZCorner 54684 26598 0 +ZCorner 54692 26596 0 +ZCorner 54695 26231 0 +ZCorner 54698 25866 0 +ZCorner 54701 25501 0 +ZCorner 54704 25135 0 +ZCorner 54705 25128 0 +ZCorner 54706 25120 0 +ZCorner 54707 25112 0 +ZCorner 54708 25104 0 +ZCorner 54713 25099 0 +ZCorner 54718 25094 0 +ZCorner 54722 25090 0 +ZCorner 54727 25085 0 +ZCorner 54739 25084 0 +ZCorner 54751 25083 0 +ZCorner 54763 25082 0 +ZCorner 54774 25081 0 +ZCorner 54781 25086 0 +ZCorner 54788 25091 0 +ZCorner 54795 25095 0 +ZCorner 54802 25100 0 +ZCorner 54805 25117 0 +ZCorner 54809 25134 0 +ZCorner 54813 25150 0 +ZCorner 54817 25167 0 +ZCorner 54818 25526 0 +ZCorner 54819 25885 0 +ZCorner 54820 26245 0 +ZCorner 54821 26604 0 +ZCorner 54961 26604 0 +ZCorner 55100 26604 0 +ZCorner 55240 26604 0 +ZCorner 55379 26604 0 +ZCorner 55386 26602 0 +ZCorner 55393 26600 0 +ZCorner 55400 26598 0 +ZCorner 55407 26596 0 +ZCorner 55408 26146 0 +ZCorner 55409 25696 0 +ZCorner 55410 25246 0 +ZCorner 55411 24796 0 +ZCorner 55404 24793 0 +ZCorner 55397 24790 0 +ZCorner 55390 24787 0 +ZCorner 55383 24784 0 +ZCorner 55241 24784 0 +ZCorner 55098 24784 0 +ZCorner 54956 24784 0 +ZCorner 54813 24784 0 +ZCorner 54815 24812 0 +ZCorner 54817 24841 0 +ZCorner 54819 24869 0 +ZCorner 54821 24897 0 +ZCorner 54801 24880 0 +ZCorner 54782 24862 0 +ZCorner 54762 24845 0 +ZCorner 54743 24827 0 +ZCorner 54730 24821 0 +ZCorner 54717 24815 0 +ZCorner 54705 24809 0 +ZCorner 54692 24804 0 +ZCorner 54681 24799 0 +ZCorner 54671 24794 0 +ZCorner 54660 24789 0 +ZCorner 54649 24784 0 +ZCorner 54459 24746 0 +ZCorner 54307 24778 0 +ZCorner 54191 24879 0 +ZCorner 54114 25050 0 +ZCorner 54110 25438 0 +ZCorner 54106 25827 0 +ZCorner 54102 26215 0 +ZCorner 54098 26604 0 +ZCorner 54238 26604 0 +ZCorner 54378 26604 0 +ZCorner 54517 26604 0 +ZCorner 54657 26604 0 +ZCorner 54657 26604 0 +ZCorner 54657 26604 0 +ZCorner 54657 26604 0 +ZCorner 54657 26604 1 +ZCorner 53872 25870 0 +ZCorner 53410 25870 0 +ZCorner 52949 25870 0 +ZCorner 52487 25870 0 +ZCorner 52025 25870 0 +ZCorner 51991 25872 0 +ZCorner 51957 25874 0 +ZCorner 51922 25875 0 +ZCorner 51888 25877 0 +ZCorner 51850 25915 0 +ZCorner 51812 25952 0 +ZCorner 51774 25989 0 +ZCorner 51736 26026 0 +ZCorner 51768 26027 0 +ZCorner 51800 26028 0 +ZCorner 51833 26029 0 +ZCorner 51865 26030 0 +ZCorner 52367 26030 0 +ZCorner 52869 26030 0 +ZCorner 53370 26030 0 +ZCorner 53872 26030 0 +ZCorner 53872 25990 0 +ZCorner 53872 25950 0 +ZCorner 53872 25910 0 +ZCorner 53872 25870 1 +$POLYSCORNERS +58524 28521 0 0 +58656 28513 0 0 +58723 28509 0 0 +58789 28506 0 0 +58793 28389 0 0 +58805 28041 0 0 +58862 28030 0 0 +58930 28017 0 0 +58930 26604 0 0 +58624 26598 0 0 +58429 26592 0 0 +58345 26585 0 0 +58371 26577 0 0 +58371 24784 0 0 +58926 24784 0 0 +58922 24837 0 0 +58918 24889 0 0 +58910 24995 0 0 +58987 24888 0 0 +59066 24812 0 0 +59149 24766 0 0 +59234 24749 0 0 +59254 24749 0 0 +59250 25389 0 0 +59219 25392 0 0 +59187 25395 0 0 +59125 25401 0 0 +59121 25401 0 0 +59098 25409 0 0 +59074 25417 0 0 +59051 25425 0 0 +59027 25432 0 0 +58984 25448 0 0 +58952 25516 0 0 +58934 25638 0 0 +58930 25811 0 0 +58930 26604 0 0 +58930 28017 0 0 +58978 28008 0 0 +59035 27998 0 0 +59078 28105 0 0 +59121 28213 0 0 +59207 28427 0 0 +59270 28408 0 0 +59332 28388 0 0 +59394 28369 0 0 +59457 28349 0 0 +59434 28235 0 0 +59410 28121 0 0 +59387 28007 0 0 +59363 27892 0 0 +59469 27846 0 0 +59521 27822 0 0 +59574 27799 0 0 +59580 27805 0 0 +59582 27806 0 0 +59648 27898 0 0 +59715 27990 0 0 +59847 28174 0 0 +59904 28140 0 0 +59961 28107 0 0 +60017 28074 0 0 +60074 28041 0 0 +60023 27935 0 0 +59972 27830 0 0 +59922 27724 0 0 +59871 27619 0 0 +60006 27511 0 0 +60050 27475 0 0 +60113 27526 0 0 +60113 26635 0 0 +59926 26620 0 0 +59703 26577 0 0 +59605 26522 0 0 +59527 26457 0 0 +59470 26383 0 0 +59433 26299 0 0 +59429 26286 0 0 +59419 26258 0 0 +59414 26245 0 0 +59414 26241 0 0 +59410 26233 0 0 +59410 26229 0 0 +59406 26213 0 0 +59406 26209 0 0 +59405 26207 0 0 +59402 26198 0 0 +59402 26186 0 0 +59400 26176 0 0 +59399 26172 0 0 +59398 26167 0 0 +59398 26159 0 0 +59394 26135 0 0 +59394 26124 0 0 +59392 26112 0 0 +59392 26106 0 0 +59391 26100 0 0 +59391 25260 0 0 +59390 25256 0 0 +59390 25241 0 0 +59394 25225 0 0 +59394 25214 0 0 +59398 25198 0 0 +59398 25186 0 0 +59401 25177 0 0 +59402 25175 0 0 +59406 25151 0 0 +59417 25126 0 0 +59427 25100 0 0 +59438 25075 0 0 +59449 25049 0 0 +59519 24937 0 0 +59630 24849 0 0 +59780 24787 0 0 +59968 24749 0 0 +60188 24756 0 0 +60367 24808 0 0 +60506 24906 0 0 +60589 25025 0 0 +60589 24538 0 0 +60589 24526 0 0 +60593 24538 0 0 +60589 24538 0 0 +60589 25025 0 0 +60605 25049 0 0 +60616 25089 0 0 +60626 25128 0 0 +60648 25206 0 0 +60658 25508 0 0 +60663 25660 0 0 +60667 25811 0 0 +60664 25907 0 0 +60660 26002 0 0 +60652 26194 0 0 +60626 26318 0 0 +60589 26391 0 0 +60573 26423 0 0 +60491 26509 0 0 +60382 26577 0 0 +60265 26620 0 0 +60113 26635 0 0 +60113 27526 0 0 +60414 27775 0 0 +60506 27685 0 0 +60551 27640 0 0 +60597 27596 0 0 +60301 27232 0 0 +60336 27186 0 0 +60441 27045 0 0 +60548 27096 0 0 +60589 27115 0 0 +60654 27147 0 0 +60760 27197 0 0 +60867 27248 0 0 +60899 27192 0 0 +60931 27137 0 0 +60964 27081 0 0 +60996 27026 0 0 +60939 26985 0 0 +60883 26944 0 0 +60769 26862 0 0 +60804 26848 0 0 +60866 26856 0 0 +60958 26885 0 0 +61078 26936 0 0 +61132 26943 0 0 +61187 26950 0 0 +61242 26956 0 0 +61296 26963 0 0 +61458 26957 0 0 +61540 26954 0 0 +61551 26953 0 0 +61551 26635 0 0 +61366 26623 0 0 +61148 26584 0 0 +61139 26581 0 0 +61136 26581 0 0 +61132 26577 0 0 +61128 26577 0 0 +61004 26500 0 0 +60911 26412 0 0 +60850 26310 0 0 +60820 26194 0 0 +60804 26010 0 0 +60803 25866 0 0 +60802 25721 0 0 +60801 25577 0 0 +60800 25432 0 0 +60805 25367 0 0 +60810 25301 0 0 +60815 25236 0 0 +60820 25170 0 0 +60830 25140 0 0 +60852 25080 0 0 +60863 25049 0 0 +60882 25021 0 0 +60902 24993 0 0 +60921 24964 0 0 +60941 24936 0 0 +60974 24905 0 0 +61002 24883 0 0 +61026 24869 0 0 +61046 24862 0 0 +61054 24854 0 0 +61066 24850 0 0 +61403 24764 0 0 +61678 24768 0 0 +61890 24863 0 0 +62038 25049 0 0 +62062 25133 0 0 +62073 25175 0 0 +62085 25217 0 0 +62097 25379 0 0 +62101 25432 0 0 +62101 26053 0 0 +62097 26088 0 0 +62093 26124 0 0 +62085 26194 0 0 +62049 26338 0 0 +61993 26450 0 0 +61917 26529 0 0 +61820 26577 0 0 +61703 26619 0 0 +61551 26635 0 0 +61551 26953 0 0 +61621 26951 0 0 +61710 26938 0 0 +61789 26920 0 0 +61857 26900 0 0 +61913 26877 0 0 +61931 26868 0 0 +61949 26860 0 0 +61966 26851 0 0 +61984 26842 0 0 +61984 26951 0 0 +62087 26953 0 0 +62183 26954 0 0 +62183 26604 0 0 +62163 26600 0 0 +62154 26598 0 0 +62144 26596 0 0 +62148 26452 0 0 +62150 26379 0 0 +62152 26307 0 0 +62164 26308 0 0 +62190 26310 0 0 +62202 26311 0 0 +62264 26305 0 0 +62302 26283 0 0 +62318 26246 0 0 +62312 26194 0 0 +62313 25925 0 0 +62314 25657 0 0 +62315 25388 0 0 +62316 25120 0 0 +62175 25120 0 0 +62163 25112 0 0 +62163 24842 0 0 +62165 24840 0 0 +62171 24831 0 0 +62199 24827 0 0 +62286 24824 0 0 +62316 24823 0 0 +62315 24757 0 0 +62314 24690 0 0 +62313 24624 0 0 +62312 24557 0 0 +62323 24553 0 0 +62333 24550 0 0 +62355 24542 0 0 +62909 24542 0 0 +62909 24819 0 0 +62948 24822 0 0 +62960 24823 0 0 +63030 24823 0 0 +63030 25108 0 0 +63027 25109 0 0 +63015 25112 0 0 +63001 25114 0 0 +62988 25116 0 0 +62960 25120 0 0 +62909 25120 0 0 +62909 26194 0 0 +62912 26327 0 0 +62880 26435 0 0 +62813 26518 0 0 +62710 26577 0 0 +62699 26585 0 0 +62664 26592 0 0 +62606 26598 0 0 +62527 26604 0 0 +62183 26604 0 0 +62183 26954 0 0 +62191 26955 0 0 +62294 26957 0 0 +62398 26959 0 0 +62527 26955 0 0 +62623 26949 0 0 +62684 26941 0 0 +62710 26932 0 0 +62809 26897 0 0 +62900 26838 0 0 +62985 26755 0 0 +63061 26647 0 0 +63780 26647 0 0 +63851 26522 0 0 +63888 26442 0 0 +63890 26405 0 0 +63858 26413 0 0 +63097 26413 0 0 +63097 26358 0 0 +63105 26358 0 0 +63105 26030 0 0 +63105 25870 0 0 +65081 25870 0 0 +65237 26026 0 0 +65171 26028 0 0 +65137 26029 0 0 +65104 26030 0 0 +63105 26030 0 0 +63105 26358 0 0 +63952 26358 0 0 +63988 26286 0 0 +64048 26227 0 0 +64133 26182 0 0 +64241 26151 0 0 +64307 26149 0 0 +64341 26148 0 0 +64374 26147 0 0 +64399 26149 0 0 +64425 26151 0 0 +64475 26155 0 0 +64503 26155 0 0 +64512 26158 0 0 +64514 26159 0 0 +64550 26165 0 0 +64567 26168 0 0 +64585 26170 0 0 +64603 26176 0 0 +64622 26182 0 0 +64640 26188 0 0 +64659 26194 0 0 +64667 26202 0 0 +64683 26212 0 0 +64700 26223 0 0 +64716 26234 0 0 +64733 26245 0 0 +64747 26260 0 0 +64760 26276 0 0 +64774 26292 0 0 +64788 26307 0 0 +64802 26327 0 0 +64817 26346 0 0 +64832 26366 0 0 +64846 26385 0 0 +64859 26405 0 0 +64872 26424 0 0 +64884 26444 0 0 +64897 26463 0 0 +64917 26489 0 0 +64926 26501 0 0 +64936 26514 0 0 +64958 26528 0 0 +64968 26535 0 0 +64979 26541 0 0 +65000 26550 0 0 +65006 26553 0 0 +65178 26549 0 0 +65212 26526 0 0 +65254 26475 0 0 +65304 26395 0 0 +65362 26287 0 0 +65452 26197 0 0 +65465 26189 0 0 +65479 26182 0 0 +65507 26166 0 0 +65553 26156 0 0 +65577 26151 0 0 +65600 26146 0 0 +65612 26146 0 0 +65626 26145 0 0 +65639 26143 0 0 +65667 26139 0 0 +65679 26142 0 0 +65692 26144 0 0 +65705 26147 0 0 +65717 26150 0 0 +65745 26150 0 0 +65760 26160 0 0 +65792 26180 0 0 +65807 26189 0 0 +65819 26193 0 0 +65833 26207 0 0 +65846 26221 0 0 +65860 26234 0 0 +65874 26248 0 0 +65886 26263 0 0 +65899 26277 0 0 +65912 26292 0 0 +65924 26307 0 0 +65939 26321 0 0 +65954 26336 0 0 +65968 26351 0 0 +65983 26365 0 0 +65997 26375 0 0 +66010 26385 0 0 +66024 26395 0 0 +66038 26404 0 0 +66049 26407 0 0 +66073 26413 0 0 +66084 26416 0 0 +66088 26416 0 0 +66108 26420 0 0 +66156 26412 0 0 +66193 26400 0 0 +66222 26384 0 0 +66241 26365 0 0 +66285 26309 0 0 +66373 26195 0 0 +66416 26139 0 0 +66455 26109 0 0 +66467 26100 0 0 +66495 26092 0 0 +66508 26088 0 0 +66522 26084 0 0 +66531 26083 0 0 +66539 26082 0 0 +66557 26080 0 0 +66651 26080 0 0 +66664 26085 0 0 +66692 26095 0 0 +66705 26100 0 0 +66714 26105 0 0 +66723 26109 0 0 +66741 26119 0 0 +66747 26125 0 0 +66768 26143 0 0 +66776 26148 0 0 +66784 26154 0 0 +66791 26160 0 0 +66799 26166 0 0 +66812 26170 0 0 +66824 26174 0 0 +66850 26182 0 0 +66858 26183 0 0 +66865 26184 0 0 +66873 26185 0 0 +66881 26185 0 0 +66914 26184 0 0 +66948 26182 0 0 +67014 26178 0 0 +67042 26170 0 0 +67067 26157 0 0 +67090 26139 0 0 +67111 26115 0 0 +67140 26068 0 0 +67161 26012 0 0 +67175 25949 0 0 +67182 25877 0 0 +67245 25802 0 0 +67309 25727 0 0 +67372 25652 0 0 +67436 25576 0 0 +63105 25576 0 0 +63105 25397 0 0 +63409 25401 0 0 +67498 25397 0 0 +67504 25378 0 0 +67510 25360 0 0 +67516 25341 0 0 +67522 25323 0 0 +67653 25170 0 0 +67732 25070 0 0 +67756 25022 0 0 +67725 25026 0 0 +63230 25026 0 0 +63233 25011 0 0 +63235 24997 0 0 +63241 24967 0 0 +63240 24941 0 0 +63239 24914 0 0 +63237 24862 0 0 +64280 24862 0 0 +64306 24890 0 0 +64331 24918 0 0 +64356 24947 0 0 +64382 24975 0 0 +67205 24975 0 0 +67276 24976 0 0 +67348 24974 0 0 +67421 24967 0 0 +67494 24955 0 0 +67495 24977 0 0 +67515 24953 0 0 +67554 24885 0 0 +67611 24772 0 0 +63225 24772 0 0 +63217 24748 0 0 +63199 24702 0 0 +63190 24678 0 0 +63183 24670 0 0 +63175 24663 0 0 +63159 24647 0 0 +63146 24641 0 0 +63134 24635 0 0 +63108 24623 0 0 +63108 24604 0 0 +63102 24458 0 0 +63082 24356 0 0 +63047 24298 0 0 +62999 24284 0 0 +62633 24276 0 0 +62366 24274 0 0 +62199 24278 0 0 +62132 24288 0 0 +62124 24294 0 0 +62120 24296 0 0 +62116 24299 0 0 +62110 24302 0 0 +62105 24305 0 0 +62093 24311 0 0 +62073 24329 0 0 +62064 24337 0 0 +62054 24346 0 0 +62039 24373 0 0 +62034 24381 0 0 +62028 24405 0 0 +62026 24416 0 0 +62023 24428 0 0 +62021 24454 0 0 +62020 24466 0 0 +62019 24479 0 0 +62018 24507 0 0 +62017 24536 0 0 +62015 24592 0 0 +61997 24584 0 0 +61980 24577 0 0 +61962 24569 0 0 +61945 24561 0 0 +61841 24519 0 0 +61666 24497 0 0 +61418 24495 0 0 +61097 24514 0 0 +61062 24431 0 0 +61039 24379 0 0 +60917 24412 0 0 +60699 24488 0 0 +60589 24526 0 0 +60499 24376 0 0 +60468 24327 0 0 +60812 24003 0 0 +60652 23803 0 0 +60552 23867 0 0 +60453 23930 0 0 +60353 23994 0 0 +60254 24057 0 0 +60174 23975 0 0 +60133 23934 0 0 +60093 23893 0 0 +60156 23794 0 0 +60218 23696 0 0 +60281 23597 0 0 +60343 23499 0 0 +60292 23460 0 0 +60240 23420 0 0 +60136 23342 0 0 +59820 23678 0 0 +59720 23620 0 0 +59671 23590 0 0 +59621 23561 0 0 +59659 23450 0 0 +59697 23338 0 0 +59773 23116 0 0 +59714 23090 0 0 +59654 23063 0 0 +59595 23037 0 0 +59535 23010 0 0 +59478 23112 0 0 +59422 23214 0 0 +59365 23315 0 0 +59308 23417 0 0 +59308 23421 0 0 +59306 23419 0 0 +59306 23418 0 0 +59305 23417 0 0 +59195 23383 0 0 +59141 23367 0 0 +59086 23350 0 0 +59096 23233 0 0 +59105 23116 0 0 +59125 22882 0 0 +58972 22853 0 0 +58878 22839 0 0 +58837 22962 0 0 +58807 23069 0 0 +58777 23177 0 0 +58746 23284 0 0 +58689 23282 0 0 +58573 23278 0 0 +58516 23276 0 0 +58498 23160 0 0 +58481 23044 0 0 +58463 22928 0 0 +58445 22811 0 0 +58313 22819 0 0 +58246 22823 0 0 +58180 22827 0 0 +58174 23061 0 0 +58171 23179 0 0 +58168 23296 0 0 +58112 23305 0 0 +58055 23315 0 0 +57999 23325 0 0 +57942 23335 0 0 +57897 23227 0 0 +57807 23013 0 0 +57762 22905 0 0 +57700 22925 0 0 +57637 22944 0 0 +57575 22964 0 0 +57512 22983 0 0 +57537 23098 0 0 +57585 23326 0 0 +57610 23440 0 0 +57557 23463 0 0 +57504 23485 0 0 +57451 23508 0 0 +57399 23530 0 0 +57328 23437 0 0 +57258 23345 0 0 +57118 23159 0 0 +57010 23227 0 0 +56957 23262 0 0 +56903 23296 0 0 +56953 23400 0 0 +57003 23505 0 0 +57052 23609 0 0 +57102 23714 0 0 +56918 23854 0 0 +56829 23780 0 0 +56649 23632 0 0 +56559 23557 0 0 +56467 23647 0 0 +56422 23692 0 0 +56376 23737 0 0 +56598 24007 0 0 +56672 24096 0 0 +56532 24284 0 0 +56524 24288 0 0 +56528 24284 0 0 +56423 24232 0 0 +56317 24180 0 0 +56212 24129 0 0 +56106 24077 0 0 +56074 24133 0 0 +56042 24188 0 0 +56010 24244 0 0 +55977 24300 0 0 +56045 24349 0 0 +56112 24399 0 0 +56180 24449 0 0 +56247 24499 0 0 +56159 24507 0 0 +56071 24514 0 0 +55895 24530 0 0 +55846 24551 0 0 +55796 24571 0 0 +55746 24592 0 0 +55686 24616 0 0 +55677 24620 0 0 +55657 24628 0 0 +55651 24601 0 0 +55649 24593 0 0 +55641 24581 0 0 +55638 24575 0 0 +55634 24569 0 0 +55629 24563 0 0 +55624 24558 0 0 +55614 24546 0 0 +55600 24541 0 0 +55587 24536 0 0 +55559 24526 0 0 +54263 24522 0 0 +54182 24536 0 0 +54102 24581 0 0 +54025 24660 0 0 +53950 24772 0 0 +49354 24772 0 0 +49414 24885 0 0 +49454 24953 0 0 +49476 24977 0 0 +49479 24956 0 0 +52431 24956 0 0 +52443 24971 0 0 +52470 24957 0 0 +52511 24915 0 0 +52568 24846 0 0 +53911 24846 0 0 +53902 24858 0 0 +53900 24862 0 0 +53892 24880 0 0 +53888 24888 0 0 +53884 24897 0 0 +53883 24929 0 0 +53882 24962 0 0 +53880 25026 0 0 +49240 25026 0 0 +49240 25073 0 0 +49339 25192 0 0 +49413 25284 0 0 +49462 25350 0 0 +49486 25390 0 0 +49488 25392 0 0 +49490 25395 0 0 +49490 25397 0 0 +53571 25401 0 0 +53647 25400 0 0 +53724 25399 0 0 +53876 25397 0 0 +53876 25577 0 0 +49537 25577 0 0 +49599 25652 0 0 +49662 25727 0 0 +49724 25803 0 0 +49787 25878 0 0 +49793 25948 0 0 +49808 26013 0 0 +49832 26071 0 0 +49865 26124 0 0 +49879 26141 0 0 +49902 26158 0 0 +49934 26172 0 0 +49974 26182 0 0 +50003 26183 0 0 +50087 26186 0 0 +50123 26182 0 0 +50135 26179 0 0 +50146 26175 0 0 +50170 26167 0 0 +50177 26161 0 0 +50201 26143 0 0 +50209 26138 0 0 +50217 26132 0 0 +50224 26126 0 0 +50232 26120 0 0 +50268 26100 0 0 +50281 26096 0 0 +50295 26091 0 0 +50308 26086 0 0 +50322 26081 0 0 +50412 26081 0 0 +50422 26082 0 0 +50431 26083 0 0 +50451 26085 0 0 +50487 26086 0 0 +50550 26135 0 0 +50638 26234 0 0 +50752 26382 0 0 +50756 26386 0 0 +50760 26389 0 0 +50763 26393 0 0 +50767 26397 0 0 +50791 26403 0 0 +50814 26409 0 0 +50838 26415 0 0 +50861 26421 0 0 +50881 26417 0 0 +50885 26417 0 0 +50896 26414 0 0 +50920 26408 0 0 +50931 26405 0 0 +50961 26385 0 0 +50975 26376 0 0 +50990 26366 0 0 +51049 26307 0 0 +51062 26292 0 0 +51076 26276 0 0 +51090 26261 0 0 +51103 26245 0 0 +51154 26194 0 0 +51162 26190 0 0 +51178 26180 0 0 +51193 26171 0 0 +51209 26161 0 0 +51224 26151 0 0 +51252 26151 0 0 +51262 26148 0 0 +51295 26139 0 0 +51310 26141 0 0 +51326 26143 0 0 +51341 26145 0 0 +51357 26147 0 0 +51369 26147 0 0 +51392 26152 0 0 +51416 26157 0 0 +51439 26162 0 0 +51463 26167 0 0 +51483 26180 0 0 +51504 26194 0 0 +51524 26208 0 0 +51545 26221 0 0 +51569 26239 0 0 +51601 26280 0 0 +51641 26344 0 0 +51689 26432 0 0 +51709 26457 0 0 +51728 26481 0 0 +51748 26505 0 0 +51767 26530 0 0 +51787 26542 0 0 +51797 26547 0 0 +51807 26553 0 0 +51865 26553 0 0 +51865 26030 0 0 +51833 26029 0 0 +51800 26028 0 0 +51736 26026 0 0 +51850 25915 0 0 +51888 25877 0 0 +51922 25875 0 0 +51957 25874 0 0 +52025 25870 0 0 +53872 25870 0 0 +53872 26030 0 0 +51865 26030 0 0 +51865 26553 0 0 +51963 26553 0 0 +51969 26550 0 0 +51983 26544 0 0 +51990 26542 0 0 +52000 26535 0 0 +52033 26514 0 0 +52044 26502 0 0 +52054 26489 0 0 +52076 26463 0 0 +52090 26444 0 0 +52103 26424 0 0 +52117 26405 0 0 +52131 26385 0 0 +52144 26366 0 0 +52158 26346 0 0 +52172 26327 0 0 +52185 26307 0 0 +52199 26292 0 0 +52227 26260 0 0 +52240 26245 0 0 +52257 26234 0 0 +52273 26223 0 0 +52290 26212 0 0 +52306 26202 0 0 +52310 26198 0 0 +52313 26196 0 0 +52315 26194 0 0 +52332 26188 0 0 +52350 26182 0 0 +52367 26176 0 0 +52385 26170 0 0 +52402 26168 0 0 +52420 26165 0 0 +52437 26162 0 0 +52455 26159 0 0 +52467 26155 0 0 +52494 26155 0 0 +52519 26153 0 0 +52545 26151 0 0 +52570 26149 0 0 +52596 26147 0 0 +52747 26154 0 0 +52866 26191 0 0 +52953 26259 0 0 +53010 26358 0 0 +53869 26358 0 0 +53869 26413 0 0 +53111 26413 0 0 +53085 26418 0 0 +53089 26459 0 0 +53123 26536 0 0 +53189 26647 0 0 +53865 26647 0 0 +53863 26726 0 0 +53895 26798 0 0 +53960 26863 0 0 +54060 26920 0 0 +54369 26921 0 0 +54821 26922 0 0 +54821 26604 0 0 +54820 26245 0 0 +54819 25885 0 0 +54817 25167 0 0 +54813 25150 0 0 +54809 25134 0 0 +54805 25117 0 0 +54802 25100 0 0 +54795 25095 0 0 +54788 25091 0 0 +54774 25081 0 0 +54763 25082 0 0 +54727 25085 0 0 +54708 25104 0 0 +54705 25128 0 0 +54704 25135 0 0 +54701 25501 0 0 +54692 26596 0 0 +54684 26598 0 0 +54657 26604 0 0 +54098 26604 0 0 +54102 26215 0 0 +54106 25827 0 0 +54110 25438 0 0 +54114 25050 0 0 +54191 24879 0 0 +54307 24778 0 0 +54459 24746 0 0 +54649 24784 0 0 +54671 24794 0 0 +54681 24799 0 0 +54692 24804 0 0 +54705 24809 0 0 +54717 24815 0 0 +54743 24827 0 0 +54762 24845 0 0 +54782 24862 0 0 +54801 24880 0 0 +54821 24897 0 0 +54817 24841 0 0 +54815 24812 0 0 +54813 24784 0 0 +55383 24784 0 0 +55411 24796 0 0 +55407 26596 0 0 +55379 26604 0 0 +54821 26604 0 0 +54821 26922 0 0 +54989 26923 0 0 +55298 26924 0 0 +55425 26925 0 0 +55507 26924 0 0 +55545 26918 0 0 +55540 26908 0 0 +55545 26905 0 0 +55560 26893 0 0 +55566 26886 0 0 +55571 26879 0 0 +55583 26865 0 0 +55589 26854 0 0 +55601 26830 0 0 +55607 26819 0 0 +55611 26805 0 0 +55614 26791 0 0 +55618 26778 0 0 +55622 26764 0 0 +55643 26776 0 0 +55663 26787 0 0 +55684 26799 0 0 +55704 26811 0 0 +55726 26835 0 0 +55747 26860 0 0 +55769 26884 0 0 +55790 26908 0 0 +55810 26920 0 0 +55819 26926 0 0 +55829 26932 0 0 +55855 26936 0 0 +55905 26944 0 0 +55931 26947 0 0 +56063 26945 0 0 +56194 26942 0 0 +56285 26939 0 0 +56285 26635 0 0 +56097 26621 0 0 +55872 26577 0 0 +55744 26487 0 0 +55652 26394 0 0 +55596 26297 0 0 +55575 26194 0 0 +55571 26137 0 0 +55567 26081 0 0 +55559 25967 0 0 +55560 25834 0 0 +55560 25432 0 0 +55564 25366 0 0 +55567 25300 0 0 +55571 25233 0 0 +55575 25167 0 0 +55586 25138 0 0 +55597 25108 0 0 +55608 25079 0 0 +55618 25050 0 0 +55691 24941 0 0 +55790 24856 0 0 +55916 24795 0 0 +56067 24757 0 0 +56283 24752 0 0 +56459 24780 0 0 +56597 24838 0 0 +56696 24928 0 0 +56708 24936 0 0 +56718 24951 0 0 +56727 24966 0 0 +56737 24980 0 0 +56747 24995 0 0 +56758 24995 0 0 +56765 25008 0 0 +56779 25036 0 0 +56786 25049 0 0 +56800 25074 0 0 +56812 25111 0 0 +56823 25161 0 0 +56833 25225 0 0 +56837 25277 0 0 +56840 25329 0 0 +56844 25380 0 0 +56848 25432 0 0 +56850 25702 0 0 +56851 25836 0 0 +56852 25971 0 0 +56842 26083 0 0 +56837 26138 0 0 +56832 26194 0 0 +56822 26235 0 0 +56800 26317 0 0 +56790 26358 0 0 +56766 26403 0 0 +56744 26438 0 0 +56723 26463 0 0 +56704 26475 0 0 +56692 26493 0 0 +56688 26498 0 0 +56667 26510 0 0 +56661 26514 0 0 +56641 26534 0 0 +56620 26544 0 0 +56598 26555 0 0 +56577 26566 0 0 +56555 26577 0 0 +56438 26621 0 0 +56285 26635 0 0 +56285 26939 0 0 +56458 26936 0 0 +56468 26954 0 0 +56477 26973 0 0 +56487 26991 0 0 +56497 27010 0 0 +56161 27322 0 0 +56215 27399 0 0 +56260 27459 0 0 +56294 27503 0 0 +56317 27533 0 0 +56415 27468 0 0 +56513 27402 0 0 +56610 27337 0 0 +56708 27272 0 0 +56794 27358 0 0 +56837 27400 0 0 +56879 27443 0 0 +56880 27444 0 0 +56882 27445 0 0 +56884 27447 0 0 +56876 27443 0 0 +56812 27541 0 0 +56749 27639 0 0 +56685 27736 0 0 +56622 27834 0 0 +56688 27887 0 0 +56745 27930 0 0 +56793 27962 0 0 +56833 27982 0 0 +57149 27654 0 0 +57198 27684 0 0 +57247 27713 0 0 +57295 27742 0 0 +57344 27771 0 0 +57288 27933 0 0 +57243 28062 0 0 +57209 28159 0 0 +57188 28224 0 0 +57248 28246 0 0 +57279 28257 0 0 +57309 28267 0 0 +57374 28299 0 0 +57416 28317 0 0 +57437 28322 0 0 +57438 28314 0 0 +57494 28214 0 0 +57608 28012 0 0 +57664 27912 0 0 +57681 27917 0 0 +57681 26635 0 0 +57503 26620 0 0 +57289 26576 0 0 +57174 26500 0 0 +57087 26411 0 0 +57028 26309 0 0 +56996 26194 0 0 +56991 26109 0 0 +56987 26024 0 0 +56977 25854 0 0 +57481 25854 0 0 +57481 25994 0 0 +57489 25998 0 0 +57481 26014 0 0 +57481 26092 0 0 +57489 26092 0 0 +57481 26100 0 0 +57483 26115 0 0 +57485 26129 0 0 +57487 26144 0 0 +57489 26158 0 0 +57492 26158 0 0 +57491 26160 0 0 +57491 26162 0 0 +57489 26166 0 0 +57491 26200 0 0 +57491 26216 0 0 +57492 26233 0 0 +57496 26245 0 0 +57498 26250 0 0 +57500 26256 0 0 +57516 26288 0 0 +57518 26289 0 0 +57524 26295 0 0 +57542 26298 0 0 +57561 26301 0 0 +57579 26304 0 0 +57598 26307 0 0 +57609 26298 0 0 +57619 26289 0 0 +57630 26281 0 0 +57641 26272 0 0 +57647 26252 0 0 +57653 26233 0 0 +57658 26213 0 0 +57664 26194 0 0 +57664 25186 0 0 +57662 25168 0 0 +57660 25149 0 0 +57658 25131 0 0 +57657 25112 0 0 +57643 25098 0 0 +57636 25092 0 0 +57629 25085 0 0 +57555 25085 0 0 +57545 25098 0 0 +57536 25112 0 0 +57526 25125 0 0 +57516 25139 0 0 +57516 25166 0 0 +57515 25242 0 0 +57512 25467 0 0 +56985 25467 0 0 +56981 25449 0 0 +56979 25441 0 0 +56977 25432 0 0 +56983 25367 0 0 +56995 25239 0 0 +57001 25174 0 0 +57010 25143 0 0 +57020 25112 0 0 +57030 25080 0 0 +57040 25049 0 0 +57122 24928 0 0 +57232 24837 0 0 +57372 24778 0 0 +57539 24748 0 0 +57752 24759 0 0 +57929 24812 0 0 +58070 24909 0 0 +58176 25049 0 0 +58186 25081 0 0 +58195 25114 0 0 +58215 25178 0 0 +58221 25608 0 0 +58224 25822 0 0 +58227 26037 0 0 +58209 26154 0 0 +58203 26194 0 0 +58173 26321 0 0 +58118 26427 0 0 +58037 26513 0 0 +57930 26576 0 0 +57824 26620 0 0 +57681 26635 0 0 +57681 27917 0 0 +57719 27929 0 0 +57774 27947 0 0 +57828 27965 0 0 +57883 27982 0 0 +57872 28099 0 0 +57862 28216 0 0 +57851 28334 0 0 +57840 28451 0 0 +57905 28461 0 0 +57969 28472 0 0 +58034 28483 0 0 +58098 28494 0 0 +58130 28382 0 0 +58162 28269 0 0 +58195 28157 0 0 +58227 28045 0 0 +58284 28048 0 0 +58342 28050 0 0 +58400 28053 0 0 +58457 28056 0 0 +58474 28172 0 0 +58490 28289 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660001 0 "" +ZLayer 20 +ZAux 45 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 56180 25085 0 +ZCorner 56192 25084 0 +ZCorner 56204 25083 0 +ZCorner 56216 25082 0 +ZCorner 56227 25081 0 +ZCorner 56235 25085 0 +ZCorner 56243 25089 0 +ZCorner 56251 25093 0 +ZCorner 56259 25096 0 +ZCorner 56262 25109 0 +ZCorner 56264 25122 0 +ZCorner 56267 25135 0 +ZCorner 56270 25147 0 +ZCorner 56271 25409 0 +ZCorner 56272 25671 0 +ZCorner 56273 25932 0 +ZCorner 56274 26194 0 +ZCorner 56270 26215 0 +ZCorner 56267 26237 0 +ZCorner 56263 26258 0 +ZCorner 56259 26280 0 +ZCorner 56249 26287 0 +ZCorner 56239 26294 0 +ZCorner 56229 26300 0 +ZCorner 56220 26307 0 +ZCorner 56210 26305 0 +ZCorner 56200 26303 0 +ZCorner 56190 26301 0 +ZCorner 56181 26299 0 +ZCorner 56174 26294 0 +ZCorner 56167 26288 0 +ZCorner 56160 26282 0 +ZCorner 56153 26276 0 +ZCorner 56150 26255 0 +ZCorner 56148 26235 0 +ZCorner 56145 26214 0 +ZCorner 56142 26194 0 +ZCorner 56143 25927 0 +ZCorner 56144 25661 0 +ZCorner 56145 25394 0 +ZCorner 56145 25128 0 +ZCorner 56154 25117 0 +ZCorner 56163 25106 0 +ZCorner 56172 25096 0 +ZCorner 56180 25085 1 +$POLYSCORNERS +56220 26307 0 0 +56229 26300 0 0 +56239 26294 0 0 +56259 26280 0 0 +56263 26258 0 0 +56267 26237 0 0 +56270 26215 0 0 +56274 26194 0 0 +56273 25932 0 0 +56272 25671 0 0 +56270 25147 0 0 +56267 25135 0 0 +56264 25122 0 0 +56262 25109 0 0 +56259 25096 0 0 +56251 25093 0 0 +56227 25081 0 0 +56216 25082 0 0 +56180 25085 0 0 +56172 25096 0 0 +56163 25106 0 0 +56145 25128 0 0 +56145 25394 0 0 +56144 25661 0 0 +56143 25927 0 0 +56142 26194 0 0 +56145 26214 0 0 +56148 26235 0 0 +56150 26255 0 0 +56153 26276 0 0 +56174 26294 0 0 +56181 26299 0 0 +56190 26301 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660002 0 "" +ZLayer 20 +ZAux 53 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 61386 25174 0 +ZCorner 61389 25158 0 +ZCorner 61392 25141 0 +ZCorner 61395 25125 0 +ZCorner 61398 25108 0 +ZCorner 61405 25101 0 +ZCorner 61412 25094 0 +ZCorner 61418 25088 0 +ZCorner 61425 25081 0 +ZCorner 61439 25084 0 +ZCorner 61453 25087 0 +ZCorner 61466 25090 0 +ZCorner 61480 25093 0 +ZCorner 61486 25105 0 +ZCorner 61492 25118 0 +ZCorner 61497 25131 0 +ZCorner 61503 25143 0 +ZCorner 61504 25406 0 +ZCorner 61505 25669 0 +ZCorner 61506 25931 0 +ZCorner 61507 26194 0 +ZCorner 61504 26212 0 +ZCorner 61501 26231 0 +ZCorner 61498 26249 0 +ZCorner 61495 26268 0 +ZCorner 61491 26276 0 +ZCorner 61486 26284 0 +ZCorner 61481 26292 0 +ZCorner 61476 26299 0 +ZCorner 61467 26301 0 +ZCorner 61458 26303 0 +ZCorner 61449 26305 0 +ZCorner 61441 26307 0 +ZCorner 61433 26304 0 +ZCorner 61425 26301 0 +ZCorner 61417 26298 0 +ZCorner 61409 26295 0 +ZCorner 61406 26290 0 +ZCorner 61404 26284 0 +ZCorner 61401 26278 0 +ZCorner 61398 26272 0 +ZCorner 61395 26253 0 +ZCorner 61392 26233 0 +ZCorner 61389 26213 0 +ZCorner 61386 26194 0 +ZCorner 61386 25939 0 +ZCorner 61386 25684 0 +ZCorner 61386 25429 0 +ZCorner 61386 25174 0 +ZCorner 61386 25174 0 +ZCorner 61386 25174 0 +ZCorner 61386 25174 0 +ZCorner 61386 25174 1 +$POLYSCORNERS +61441 26307 0 0 +61449 26305 0 0 +61476 26299 0 0 +61481 26292 0 0 +61491 26276 0 0 +61495 26268 0 0 +61498 26249 0 0 +61501 26231 0 0 +61504 26212 0 0 +61507 26194 0 0 +61506 25931 0 0 +61505 25669 0 0 +61503 25143 0 0 +61497 25131 0 0 +61492 25118 0 0 +61486 25105 0 0 +61480 25093 0 0 +61466 25090 0 0 +61453 25087 0 0 +61425 25081 0 0 +61398 25108 0 0 +61395 25125 0 0 +61392 25141 0 0 +61389 25158 0 0 +61386 25174 0 0 +61386 26194 0 0 +61389 26213 0 0 +61395 26253 0 0 +61398 26272 0 0 +61404 26284 0 0 +61406 26290 0 0 +61409 26295 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660003 0 "" +ZLayer 20 +ZAux 49 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 59953 25159 0 +ZCorner 59957 25143 0 +ZCorner 59961 25128 0 +ZCorner 59965 25112 0 +ZCorner 59969 25096 0 +ZCorner 59974 25092 0 +ZCorner 59980 25088 0 +ZCorner 59986 25085 0 +ZCorner 59992 25081 0 +ZCorner 60044 25070 0 +ZCorner 60077 25125 0 +ZCorner 60093 25245 0 +ZCorner 60090 25432 0 +ZCorner 60090 25622 0 +ZCorner 60090 25813 0 +ZCorner 60090 26003 0 +ZCorner 60090 26194 0 +ZCorner 60086 26213 0 +ZCorner 60082 26233 0 +ZCorner 60078 26252 0 +ZCorner 60074 26272 0 +ZCorner 60069 26278 0 +ZCorner 60064 26285 0 +ZCorner 60059 26292 0 +ZCorner 60054 26299 0 +ZCorner 60042 26301 0 +ZCorner 60029 26303 0 +ZCorner 60016 26305 0 +ZCorner 60004 26307 0 +ZCorner 59999 26307 0 +ZCorner 59994 26307 0 +ZCorner 59989 26307 0 +ZCorner 59984 26307 0 +ZCorner 59978 26300 0 +ZCorner 59972 26293 0 +ZCorner 59967 26286 0 +ZCorner 59961 26280 0 +ZCorner 59959 26258 0 +ZCorner 59957 26237 0 +ZCorner 59955 26215 0 +ZCorner 59953 26194 0 +ZCorner 59953 25935 0 +ZCorner 59953 25676 0 +ZCorner 59953 25418 0 +ZCorner 59953 25159 0 +ZCorner 59953 25159 0 +ZCorner 59953 25159 0 +ZCorner 59953 25159 0 +ZCorner 59953 25159 1 +$POLYSCORNERS +60004 26307 0 0 +60016 26305 0 0 +60042 26301 0 0 +60054 26299 0 0 +60069 26278 0 0 +60074 26272 0 0 +60078 26252 0 0 +60082 26233 0 0 +60086 26213 0 0 +60090 26194 0 0 +60090 25432 0 0 +60093 25245 0 0 +60077 25125 0 0 +60044 25070 0 0 +59992 25081 0 0 +59986 25085 0 0 +59980 25088 0 0 +59974 25092 0 0 +59969 25096 0 0 +59961 25128 0 0 +59957 25143 0 0 +59953 25159 0 0 +59953 26194 0 0 +59955 26215 0 0 +59957 26237 0 0 +59959 26258 0 0 +59961 26280 0 0 +59967 26286 0 0 +59972 26293 0 0 +59984 26307 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660004 0 "" +ZLayer 20 +ZAux 41 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 56606 22603 0 +ZCorner 56612 22598 0 +ZCorner 56618 22593 0 +ZCorner 56624 22589 0 +ZCorner 56630 22584 0 +ZCorner 56670 22596 0 +ZCorner 56708 22604 0 +ZCorner 56746 22606 0 +ZCorner 56786 22603 0 +ZCorner 56789 22603 0 +ZCorner 56792 22603 0 +ZCorner 56795 22603 0 +ZCorner 56798 22603 0 +ZCorner 56802 22613 0 +ZCorner 56806 22623 0 +ZCorner 56809 22632 0 +ZCorner 56813 22642 0 +ZCorner 56786 22643 0 +ZCorner 56759 22644 0 +ZCorner 56731 22645 0 +ZCorner 56704 22646 0 +ZCorner 56708 22652 0 +ZCorner 56712 22658 0 +ZCorner 56716 22664 0 +ZCorner 56720 22670 0 +ZCorner 56720 22671 0 +ZCorner 56720 22672 0 +ZCorner 56720 22673 0 +ZCorner 56720 22673 0 +ZCorner 56755 22731 0 +ZCorner 56790 22789 0 +ZCorner 56825 22846 0 +ZCorner 56860 22904 0 +ZCorner 56851 22910 0 +ZCorner 56841 22916 0 +ZCorner 56831 22921 0 +ZCorner 56821 22927 0 +ZCorner 56768 22846 0 +ZCorner 56714 22765 0 +ZCorner 56660 22684 0 +ZCorner 56606 22603 1 +$POLYSCORNERS +56821 22927 0 0 +56831 22921 0 0 +56841 22916 0 0 +56851 22910 0 0 +56860 22904 0 0 +56825 22846 0 0 +56790 22789 0 0 +56720 22673 0 0 +56720 22670 0 0 +56704 22646 0 0 +56731 22645 0 0 +56759 22644 0 0 +56813 22642 0 0 +56809 22632 0 0 +56806 22623 0 0 +56798 22603 0 0 +56786 22603 0 0 +56746 22606 0 0 +56708 22604 0 0 +56670 22596 0 0 +56630 22584 0 0 +56624 22589 0 0 +56618 22593 0 0 +56606 22603 0 0 +56768 22846 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660005 0 "" +ZLayer 20 +ZAux 50 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 56665 22931 0 +ZCorner 56665 22932 0 +ZCorner 56665 22933 0 +ZCorner 56665 22934 0 +ZCorner 56665 22935 0 +ZCorner 56667 22940 0 +ZCorner 56669 22945 0 +ZCorner 56671 22950 0 +ZCorner 56673 22955 0 +ZCorner 56642 23043 0 +ZCorner 56594 23090 0 +ZCorner 56530 23095 0 +ZCorner 56450 23060 0 +ZCorner 56373 22972 0 +ZCorner 56334 22893 0 +ZCorner 56333 22825 0 +ZCorner 56372 22767 0 +ZCorner 56452 22734 0 +ZCorner 56527 22750 0 +ZCorner 56599 22816 0 +ZCorner 56665 22931 1 +ZCorner 56384 22826 0 +ZCorner 56384 22837 0 +ZCorner 56384 22847 0 +ZCorner 56384 22858 0 +ZCorner 56384 22869 0 +ZCorner 56387 22875 0 +ZCorner 56390 22880 0 +ZCorner 56393 22886 0 +ZCorner 56395 22892 0 +ZCorner 56450 22976 0 +ZCorner 56500 23030 0 +ZCorner 56548 23052 0 +ZCorner 56591 23044 0 +ZCorner 56618 23000 0 +ZCorner 56617 22948 0 +ZCorner 56587 22888 0 +ZCorner 56528 22822 0 +ZCorner 56515 22811 0 +ZCorner 56501 22800 0 +ZCorner 56487 22790 0 +ZCorner 56473 22779 0 +ZCorner 56460 22780 0 +ZCorner 56446 22781 0 +ZCorner 56433 22782 0 +ZCorner 56419 22783 0 +ZCorner 56410 22794 0 +ZCorner 56401 22804 0 +ZCorner 56393 22815 0 +ZCorner 56384 22826 1 +$POLYSCORNERS +56530 23095 0 0 +56548 23093 0 0 +56548 23052 0 0 +56500 23030 0 0 +56450 22976 0 0 +56395 22892 0 0 +56393 22886 0 0 +56390 22880 0 0 +56387 22875 0 0 +56384 22869 0 0 +56384 22826 0 0 +56393 22815 0 0 +56401 22804 0 0 +56410 22794 0 0 +56419 22783 0 0 +56433 22782 0 0 +56446 22781 0 0 +56460 22780 0 0 +56473 22779 0 0 +56487 22790 0 0 +56501 22800 0 0 +56515 22811 0 0 +56528 22822 0 0 +56587 22888 0 0 +56617 22948 0 0 +56618 23000 0 0 +56591 23044 0 0 +56548 23052 0 0 +56548 23093 0 0 +56594 23090 0 0 +56642 23043 0 0 +56673 22955 0 0 +56665 22935 0 0 +56665 22931 0 0 +56599 22816 0 0 +56527 22750 0 0 +56452 22734 0 0 +56372 22767 0 0 +56333 22825 0 0 +56334 22893 0 0 +56373 22972 0 0 +56450 23060 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660006 0 "" +ZLayer 20 +ZAux 70 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 56966 22720 0 +ZCorner 56898 22599 0 +ZCorner 56878 22504 0 +ZCorner 56904 22436 0 +ZCorner 56977 22396 0 +ZCorner 57057 22404 0 +ZCorner 57119 22452 0 +ZCorner 57165 22539 0 +ZCorner 57196 22666 0 +ZCorner 57191 22678 0 +ZCorner 57186 22689 0 +ZCorner 57181 22701 0 +ZCorner 57177 22713 0 +ZCorner 57171 22720 0 +ZCorner 57165 22728 0 +ZCorner 57159 22736 0 +ZCorner 57153 22744 0 +ZCorner 57140 22750 0 +ZCorner 57128 22756 0 +ZCorner 57115 22761 0 +ZCorner 57102 22767 0 +ZCorner 57088 22767 0 +ZCorner 57073 22767 0 +ZCorner 57058 22767 0 +ZCorner 57044 22767 0 +ZCorner 57037 22765 0 +ZCorner 57030 22763 0 +ZCorner 57023 22761 0 +ZCorner 57017 22759 0 +ZCorner 57004 22750 0 +ZCorner 56991 22740 0 +ZCorner 56979 22730 0 +ZCorner 56966 22720 1 +ZCorner 56935 22486 0 +ZCorner 56936 22498 0 +ZCorner 56937 22510 0 +ZCorner 56937 22521 0 +ZCorner 56938 22533 0 +ZCorner 56973 22629 0 +ZCorner 57011 22694 0 +ZCorner 57052 22727 0 +ZCorner 57095 22728 0 +ZCorner 57105 22719 0 +ZCorner 57116 22711 0 +ZCorner 57127 22702 0 +ZCorner 57138 22693 0 +ZCorner 57139 22678 0 +ZCorner 57139 22662 0 +ZCorner 57140 22646 0 +ZCorner 57141 22631 0 +ZCorner 57127 22597 0 +ZCorner 57112 22564 0 +ZCorner 57098 22531 0 +ZCorner 57083 22498 0 +ZCorner 57074 22486 0 +ZCorner 57065 22474 0 +ZCorner 57057 22463 0 +ZCorner 57048 22451 0 +ZCorner 57035 22446 0 +ZCorner 57022 22441 0 +ZCorner 57010 22436 0 +ZCorner 56997 22431 0 +ZCorner 56986 22437 0 +ZCorner 56976 22443 0 +ZCorner 56965 22449 0 +ZCorner 56954 22455 0 +ZCorner 56949 22463 0 +ZCorner 56944 22470 0 +ZCorner 56939 22478 0 +ZCorner 56935 22486 1 +$POLYSCORNERS +57102 22767 0 0 +57115 22761 0 0 +57128 22756 0 0 +57140 22750 0 0 +57153 22744 0 0 +57171 22720 0 0 +57177 22713 0 0 +57181 22701 0 0 +57186 22689 0 0 +57191 22678 0 0 +57196 22666 0 0 +57165 22539 0 0 +57119 22452 0 0 +57057 22404 0 0 +56977 22396 0 0 +56904 22436 0 0 +56878 22504 0 0 +56898 22599 0 0 +56966 22720 0 0 +56979 22730 0 0 +56991 22740 0 0 +57004 22750 0 0 +57017 22759 0 0 +57023 22761 0 0 +57044 22767 0 0 +57095 22767 0 0 +57095 22728 0 0 +57052 22727 0 0 +57011 22694 0 0 +56973 22629 0 0 +56938 22533 0 0 +56937 22521 0 0 +56937 22510 0 0 +56935 22486 0 0 +56939 22478 0 0 +56944 22470 0 0 +56949 22463 0 0 +56954 22455 0 0 +56976 22443 0 0 +56986 22437 0 0 +56997 22431 0 0 +57010 22436 0 0 +57022 22441 0 0 +57048 22451 0 0 +57057 22463 0 0 +57065 22474 0 0 +57083 22498 0 0 +57098 22531 0 0 +57112 22564 0 0 +57127 22597 0 0 +57141 22631 0 0 +57140 22646 0 0 +57139 22662 0 0 +57139 22678 0 0 +57138 22693 0 0 +57116 22711 0 0 +57105 22719 0 0 +57095 22728 0 0 +57095 22767 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660007 0 "" +ZLayer 20 +ZAux 66 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 56431 23134 0 +ZCorner 56431 23138 0 +ZCorner 56431 23142 0 +ZCorner 56431 23146 0 +ZCorner 56431 23150 0 +ZCorner 56406 23238 0 +ZCorner 56361 23285 0 +ZCorner 56298 23292 0 +ZCorner 56216 23259 0 +ZCorner 56128 23177 0 +ZCorner 56087 23098 0 +ZCorner 56093 23024 0 +ZCorner 56145 22955 0 +ZCorner 56213 22933 0 +ZCorner 56282 22955 0 +ZCorner 56354 23022 0 +ZCorner 56431 23134 1 +ZCorner 56247 22998 0 +ZCorner 56237 22994 0 +ZCorner 56228 22990 0 +ZCorner 56218 22986 0 +ZCorner 56208 22982 0 +ZCorner 56196 22985 0 +ZCorner 56185 22988 0 +ZCorner 56173 22991 0 +ZCorner 56161 22994 0 +ZCorner 56154 23005 0 +ZCorner 56148 23015 0 +ZCorner 56141 23026 0 +ZCorner 56134 23037 0 +ZCorner 56135 23049 0 +ZCorner 56136 23062 0 +ZCorner 56137 23075 0 +ZCorner 56138 23087 0 +ZCorner 56143 23092 0 +ZCorner 56148 23097 0 +ZCorner 56153 23102 0 +ZCorner 56157 23107 0 +ZCorner 56162 23116 0 +ZCorner 56167 23125 0 +ZCorner 56172 23133 0 +ZCorner 56177 23142 0 +ZCorner 56178 23144 0 +ZCorner 56179 23146 0 +ZCorner 56180 23148 0 +ZCorner 56181 23150 0 +ZCorner 56243 23211 0 +ZCorner 56296 23243 0 +ZCorner 56340 23245 0 +ZCorner 56376 23216 0 +ZCorner 56378 23204 0 +ZCorner 56380 23191 0 +ZCorner 56382 23178 0 +ZCorner 56384 23166 0 +ZCorner 56381 23157 0 +ZCorner 56378 23148 0 +ZCorner 56375 23139 0 +ZCorner 56372 23131 0 +ZCorner 56351 23105 0 +ZCorner 56329 23080 0 +ZCorner 56308 23054 0 +ZCorner 56286 23029 0 +ZCorner 56276 23021 0 +ZCorner 56267 23013 0 +ZCorner 56257 23006 0 +ZCorner 56247 22998 1 +$POLYSCORNERS +56298 23292 0 0 +56340 23287 0 0 +56340 23245 0 0 +56296 23243 0 0 +56243 23211 0 0 +56181 23150 0 0 +56177 23142 0 0 +56172 23133 0 0 +56167 23125 0 0 +56157 23107 0 0 +56153 23102 0 0 +56138 23087 0 0 +56137 23075 0 0 +56135 23049 0 0 +56134 23037 0 0 +56148 23015 0 0 +56154 23005 0 0 +56161 22994 0 0 +56185 22988 0 0 +56196 22985 0 0 +56208 22982 0 0 +56228 22990 0 0 +56237 22994 0 0 +56247 22998 0 0 +56257 23006 0 0 +56267 23013 0 0 +56276 23021 0 0 +56286 23029 0 0 +56308 23054 0 0 +56329 23080 0 0 +56351 23105 0 0 +56372 23131 0 0 +56375 23139 0 0 +56384 23166 0 0 +56382 23178 0 0 +56378 23204 0 0 +56376 23216 0 0 +56340 23245 0 0 +56340 23287 0 0 +56361 23285 0 0 +56406 23238 0 0 +56431 23150 0 0 +56431 23134 0 0 +56354 23022 0 0 +56282 22955 0 0 +56213 22933 0 0 +56145 22955 0 0 +56093 23024 0 0 +56087 23098 0 0 +56128 23177 0 0 +56216 23259 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660008 0 "" +ZLayer 20 +ZAux 98 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 56411 28203 0 +ZCorner 56408 28206 0 +ZCorner 56405 28209 0 +ZCorner 56403 28212 0 +ZCorner 56400 28215 0 +ZCorner 56399 28216 0 +ZCorner 56398 28217 0 +ZCorner 56397 28218 0 +ZCorner 56396 28219 0 +ZCorner 56320 28309 0 +ZCorner 56247 28356 0 +ZCorner 56176 28359 0 +ZCorner 56107 28317 0 +ZCorner 56083 28242 0 +ZCorner 56093 28170 0 +ZCorner 56139 28101 0 +ZCorner 56220 28036 0 +ZCorner 56222 28034 0 +ZCorner 56224 28032 0 +ZCorner 56226 28030 0 +ZCorner 56228 28028 0 +ZCorner 56295 28004 0 +ZCorner 56351 28010 0 +ZCorner 56397 28044 0 +ZCorner 56431 28106 0 +ZCorner 56429 28122 0 +ZCorner 56427 28139 0 +ZCorner 56425 28156 0 +ZCorner 56423 28172 0 +ZCorner 56422 28174 0 +ZCorner 56421 28176 0 +ZCorner 56420 28178 0 +ZCorner 56419 28180 0 +ZCorner 56419 28180 0 +ZCorner 56419 28180 0 +ZCorner 56419 28180 0 +ZCorner 56419 28180 0 +ZCorner 56417 28186 0 +ZCorner 56415 28192 0 +ZCorner 56413 28198 0 +ZCorner 56411 28203 1 +ZCorner 56177 28157 0 +ZCorner 56175 28158 0 +ZCorner 56173 28159 0 +ZCorner 56171 28160 0 +ZCorner 56169 28161 0 +ZCorner 56169 28163 0 +ZCorner 56169 28165 0 +ZCorner 56169 28167 0 +ZCorner 56169 28169 0 +ZCorner 56167 28170 0 +ZCorner 56165 28172 0 +ZCorner 56163 28174 0 +ZCorner 56161 28176 0 +ZCorner 56159 28179 0 +ZCorner 56157 28182 0 +ZCorner 56155 28185 0 +ZCorner 56153 28188 0 +ZCorner 56146 28199 0 +ZCorner 56140 28209 0 +ZCorner 56133 28220 0 +ZCorner 56126 28231 0 +ZCorner 56126 28237 0 +ZCorner 56126 28243 0 +ZCorner 56126 28249 0 +ZCorner 56126 28254 0 +ZCorner 56132 28265 0 +ZCorner 56138 28276 0 +ZCorner 56144 28287 0 +ZCorner 56150 28297 0 +ZCorner 56164 28302 0 +ZCorner 56179 28307 0 +ZCorner 56193 28312 0 +ZCorner 56208 28317 0 +ZCorner 56214 28316 0 +ZCorner 56220 28315 0 +ZCorner 56226 28314 0 +ZCorner 56231 28313 0 +ZCorner 56244 28302 0 +ZCorner 56257 28292 0 +ZCorner 56269 28281 0 +ZCorner 56282 28270 0 +ZCorner 56356 28184 0 +ZCorner 56383 28118 0 +ZCorner 56365 28072 0 +ZCorner 56302 28048 0 +ZCorner 56291 28052 0 +ZCorner 56280 28057 0 +ZCorner 56270 28062 0 +ZCorner 56259 28067 0 +ZCorner 56248 28077 0 +ZCorner 56237 28087 0 +ZCorner 56227 28096 0 +ZCorner 56216 28106 0 +ZCorner 56206 28119 0 +ZCorner 56196 28132 0 +ZCorner 56187 28144 0 +ZCorner 56177 28157 1 +$POLYSCORNERS +56176 28359 0 0 +56208 28357 0 0 +56208 28317 0 0 +56193 28312 0 0 +56179 28307 0 0 +56164 28302 0 0 +56150 28297 0 0 +56144 28287 0 0 +56126 28254 0 0 +56126 28231 0 0 +56140 28209 0 0 +56146 28199 0 0 +56153 28188 0 0 +56161 28176 0 0 +56167 28170 0 0 +56169 28169 0 0 +56169 28161 0 0 +56177 28157 0 0 +56187 28144 0 0 +56196 28132 0 0 +56216 28106 0 0 +56227 28096 0 0 +56237 28087 0 0 +56259 28067 0 0 +56270 28062 0 0 +56280 28057 0 0 +56291 28052 0 0 +56302 28048 0 0 +56365 28072 0 0 +56383 28118 0 0 +56356 28184 0 0 +56282 28270 0 0 +56269 28281 0 0 +56257 28292 0 0 +56244 28302 0 0 +56231 28313 0 0 +56226 28314 0 0 +56208 28317 0 0 +56208 28357 0 0 +56247 28356 0 0 +56320 28309 0 0 +56396 28219 0 0 +56403 28212 0 0 +56405 28209 0 0 +56411 28203 0 0 +56413 28198 0 0 +56419 28180 0 0 +56423 28172 0 0 +56425 28156 0 0 +56429 28122 0 0 +56431 28106 0 0 +56397 28044 0 0 +56351 28010 0 0 +56295 28004 0 0 +56228 28028 0 0 +56220 28036 0 0 +56139 28101 0 0 +56093 28170 0 0 +56083 28242 0 0 +56107 28317 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660009 0 "" +ZLayer 20 +ZAux 37 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 56442 28461 0 +ZCorner 56444 28457 0 +ZCorner 56446 28454 0 +ZCorner 56448 28450 0 +ZCorner 56450 28446 0 +ZCorner 56491 28393 0 +ZCorner 56532 28340 0 +ZCorner 56573 28288 0 +ZCorner 56614 28235 0 +ZCorner 56625 28242 0 +ZCorner 56636 28249 0 +ZCorner 56646 28255 0 +ZCorner 56657 28262 0 +ZCorner 56601 28340 0 +ZCorner 56544 28418 0 +ZCorner 56488 28497 0 +ZCorner 56431 28575 0 +ZCorner 56422 28570 0 +ZCorner 56413 28565 0 +ZCorner 56404 28560 0 +ZCorner 56396 28555 0 +ZCorner 56396 28513 0 +ZCorner 56390 28474 0 +ZCorner 56378 28438 0 +ZCorner 56360 28407 0 +ZCorner 56368 28397 0 +ZCorner 56376 28387 0 +ZCorner 56384 28377 0 +ZCorner 56392 28368 0 +ZCorner 56402 28390 0 +ZCorner 56411 28413 0 +ZCorner 56421 28435 0 +ZCorner 56431 28457 0 +ZCorner 56434 28458 0 +ZCorner 56437 28459 0 +ZCorner 56439 28460 0 +ZCorner 56442 28461 1 +$POLYSCORNERS +56431 28575 0 0 +56488 28497 0 0 +56544 28418 0 0 +56601 28340 0 0 +56657 28262 0 0 +56646 28255 0 0 +56636 28249 0 0 +56614 28235 0 0 +56573 28288 0 0 +56532 28340 0 0 +56450 28446 0 0 +56446 28454 0 0 +56444 28457 0 0 +56442 28461 0 0 +56439 28460 0 0 +56437 28459 0 0 +56431 28457 0 0 +56411 28413 0 0 +56402 28390 0 0 +56392 28368 0 0 +56384 28377 0 0 +56360 28407 0 0 +56378 28438 0 0 +56390 28474 0 0 +56396 28513 0 0 +56396 28555 0 0 +56404 28560 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66000A 0 "" +ZLayer 20 +ZAux 49 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 56860 28403 0 +ZCorner 56871 28409 0 +ZCorner 56882 28415 0 +ZCorner 56893 28420 0 +ZCorner 56903 28426 0 +ZCorner 56855 28507 0 +ZCorner 56808 28588 0 +ZCorner 56760 28669 0 +ZCorner 56712 28750 0 +ZCorner 56710 28752 0 +ZCorner 56708 28754 0 +ZCorner 56706 28756 0 +ZCorner 56704 28758 0 +ZCorner 56696 28755 0 +ZCorner 56689 28752 0 +ZCorner 56681 28749 0 +ZCorner 56673 28747 0 +ZCorner 56671 28729 0 +ZCorner 56669 28711 0 +ZCorner 56667 28694 0 +ZCorner 56665 28676 0 +ZCorner 56655 28658 0 +ZCorner 56646 28639 0 +ZCorner 56636 28621 0 +ZCorner 56626 28602 0 +ZCorner 56632 28591 0 +ZCorner 56638 28581 0 +ZCorner 56644 28570 0 +ZCorner 56649 28559 0 +ZCorner 56655 28567 0 +ZCorner 56661 28575 0 +ZCorner 56667 28583 0 +ZCorner 56673 28590 0 +ZCorner 56681 28605 0 +ZCorner 56689 28620 0 +ZCorner 56696 28634 0 +ZCorner 56704 28649 0 +ZCorner 56705 28650 0 +ZCorner 56706 28651 0 +ZCorner 56707 28652 0 +ZCorner 56708 28653 0 +ZCorner 56711 28647 0 +ZCorner 56714 28641 0 +ZCorner 56717 28635 0 +ZCorner 56720 28630 0 +ZCorner 56755 28573 0 +ZCorner 56790 28516 0 +ZCorner 56825 28460 0 +ZCorner 56860 28403 1 +$POLYSCORNERS +56704 28758 0 0 +56712 28750 0 0 +56808 28588 0 0 +56855 28507 0 0 +56903 28426 0 0 +56893 28420 0 0 +56882 28415 0 0 +56860 28403 0 0 +56825 28460 0 0 +56790 28516 0 0 +56720 28630 0 0 +56717 28635 0 0 +56708 28653 0 0 +56704 28649 0 0 +56696 28634 0 0 +56689 28620 0 0 +56673 28590 0 0 +56667 28583 0 0 +56649 28559 0 0 +56644 28570 0 0 +56638 28581 0 0 +56632 28591 0 0 +56626 28602 0 0 +56636 28621 0 0 +56646 28639 0 0 +56655 28658 0 0 +56665 28676 0 0 +56667 28694 0 0 +56669 28711 0 0 +56673 28747 0 0 +56681 28749 0 0 +56689 28752 0 0 +56696 28755 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66000B 0 "" +ZLayer 20 +ZAux 37 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 56958 28848 0 +ZCorner 56943 28828 0 +ZCorner 56929 28807 0 +ZCorner 56914 28786 0 +ZCorner 56900 28766 0 +ZCorner 56906 28755 0 +ZCorner 56913 28744 0 +ZCorner 56920 28734 0 +ZCorner 56927 28723 0 +ZCorner 56941 28745 0 +ZCorner 56956 28766 0 +ZCorner 56971 28788 0 +ZCorner 56985 28809 0 +ZCorner 56990 28803 0 +ZCorner 56995 28797 0 +ZCorner 57000 28791 0 +ZCorner 57005 28786 0 +ZCorner 57034 28727 0 +ZCorner 57064 28668 0 +ZCorner 57093 28610 0 +ZCorner 57122 28551 0 +ZCorner 57134 28556 0 +ZCorner 57146 28561 0 +ZCorner 57157 28566 0 +ZCorner 57169 28571 0 +ZCorner 57127 28658 0 +ZCorner 57085 28745 0 +ZCorner 57043 28831 0 +ZCorner 57001 28918 0 +ZCorner 56992 28915 0 +ZCorner 56983 28912 0 +ZCorner 56975 28910 0 +ZCorner 56966 28907 0 +ZCorner 56964 28892 0 +ZCorner 56962 28877 0 +ZCorner 56960 28863 0 +ZCorner 56958 28848 1 +$POLYSCORNERS +57001 28918 0 0 +57043 28831 0 0 +57085 28745 0 0 +57169 28571 0 0 +57157 28566 0 0 +57146 28561 0 0 +57122 28551 0 0 +57093 28610 0 0 +57064 28668 0 0 +57034 28727 0 0 +57005 28786 0 0 +57000 28791 0 0 +56985 28809 0 0 +56971 28788 0 0 +56956 28766 0 0 +56941 28745 0 0 +56927 28723 0 0 +56920 28734 0 0 +56913 28744 0 0 +56906 28755 0 0 +56900 28766 0 0 +56914 28786 0 0 +56929 28807 0 0 +56943 28828 0 0 +56958 28848 0 0 +56960 28863 0 0 +56962 28877 0 0 +56966 28907 0 0 +56975 28910 0 0 +56983 28912 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66000C 0 "" +ZLayer 20 +ZAux 37 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 58707 22057 0 +ZCorner 58717 22057 0 +ZCorner 58727 22057 0 +ZCorner 58737 22057 0 +ZCorner 58747 22057 0 +ZCorner 58766 22087 0 +ZCorner 58790 22114 0 +ZCorner 58817 22137 0 +ZCorner 58848 22154 0 +ZCorner 58851 22156 0 +ZCorner 58854 22158 0 +ZCorner 58857 22160 0 +ZCorner 58860 22162 0 +ZCorner 58859 22174 0 +ZCorner 58858 22185 0 +ZCorner 58857 22197 0 +ZCorner 58856 22209 0 +ZCorner 58841 22205 0 +ZCorner 58821 22194 0 +ZCorner 58794 22176 0 +ZCorner 58762 22150 0 +ZCorner 58762 22158 0 +ZCorner 58762 22166 0 +ZCorner 58762 22174 0 +ZCorner 58762 22181 0 +ZCorner 58756 22246 0 +ZCorner 58751 22310 0 +ZCorner 58745 22375 0 +ZCorner 58739 22439 0 +ZCorner 58726 22439 0 +ZCorner 58713 22439 0 +ZCorner 58701 22439 0 +ZCorner 58688 22439 0 +ZCorner 58693 22344 0 +ZCorner 58698 22248 0 +ZCorner 58703 22152 0 +ZCorner 58707 22057 1 +$POLYSCORNERS +58739 22439 0 0 +58745 22375 0 0 +58751 22310 0 0 +58756 22246 0 0 +58762 22181 0 0 +58762 22150 0 0 +58794 22176 0 0 +58821 22194 0 0 +58841 22205 0 0 +58856 22209 0 0 +58858 22185 0 0 +58859 22174 0 0 +58860 22162 0 0 +58848 22154 0 0 +58817 22137 0 0 +58790 22114 0 0 +58766 22087 0 0 +58747 22057 0 0 +58707 22057 0 0 +58703 22152 0 0 +58693 22344 0 0 +58688 22439 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66000D 0 "" +ZLayer 20 +ZAux 33 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 59036 22092 0 +ZCorner 59045 22092 0 +ZCorner 59055 22092 0 +ZCorner 59065 22092 0 +ZCorner 59075 22092 0 +ZCorner 59094 22128 0 +ZCorner 59119 22159 0 +ZCorner 59147 22186 0 +ZCorner 59180 22209 0 +ZCorner 59178 22220 0 +ZCorner 59176 22232 0 +ZCorner 59174 22244 0 +ZCorner 59172 22256 0 +ZCorner 59152 22247 0 +ZCorner 59131 22233 0 +ZCorner 59109 22213 0 +ZCorner 59086 22189 0 +ZCorner 59084 22196 0 +ZCorner 59082 22203 0 +ZCorner 59080 22210 0 +ZCorner 59078 22217 0 +ZCorner 59067 22282 0 +ZCorner 59055 22347 0 +ZCorner 59043 22413 0 +ZCorner 59032 22478 0 +ZCorner 59019 22476 0 +ZCorner 59006 22474 0 +ZCorner 58994 22472 0 +ZCorner 58981 22471 0 +ZCorner 58995 22376 0 +ZCorner 59008 22281 0 +ZCorner 59022 22186 0 +ZCorner 59036 22092 1 +$POLYSCORNERS +59032 22478 0 0 +59043 22413 0 0 +59055 22347 0 0 +59067 22282 0 0 +59078 22217 0 0 +59086 22189 0 0 +59109 22213 0 0 +59131 22233 0 0 +59152 22247 0 0 +59172 22256 0 0 +59178 22220 0 0 +59180 22209 0 0 +59147 22186 0 0 +59119 22159 0 0 +59094 22128 0 0 +59075 22092 0 0 +59036 22092 0 0 +59022 22186 0 0 +59008 22281 0 0 +58995 22376 0 0 +58981 22471 0 0 +58994 22472 0 0 +59006 22474 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66000E 0 "" +ZLayer 20 +ZAux 74 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 59231 22424 0 +ZCorner 59232 22414 0 +ZCorner 59233 22404 0 +ZCorner 59234 22394 0 +ZCorner 59235 22385 0 +ZCorner 59254 22275 0 +ZCorner 59296 22203 0 +ZCorner 59358 22169 0 +ZCorner 59442 22174 0 +ZCorner 59500 22229 0 +ZCorner 59524 22300 0 +ZCorner 59512 22387 0 +ZCorner 59465 22490 0 +ZCorner 59382 22543 0 +ZCorner 59316 22549 0 +ZCorner 59265 22509 0 +ZCorner 59231 22424 1 +ZCorner 59340 22232 0 +ZCorner 59335 22245 0 +ZCorner 59330 22258 0 +ZCorner 59326 22270 0 +ZCorner 59321 22283 0 +ZCorner 59321 22283 0 +ZCorner 59321 22283 0 +ZCorner 59321 22283 0 +ZCorner 59321 22283 0 +ZCorner 59320 22285 0 +ZCorner 59319 22287 0 +ZCorner 59318 22289 0 +ZCorner 59317 22291 0 +ZCorner 59317 22293 0 +ZCorner 59317 22295 0 +ZCorner 59317 22297 0 +ZCorner 59317 22299 0 +ZCorner 59316 22299 0 +ZCorner 59315 22299 0 +ZCorner 59314 22299 0 +ZCorner 59313 22299 0 +ZCorner 59287 22395 0 +ZCorner 59286 22463 0 +ZCorner 59307 22502 0 +ZCorner 59352 22513 0 +ZCorner 59362 22509 0 +ZCorner 59371 22506 0 +ZCorner 59381 22502 0 +ZCorner 59391 22498 0 +ZCorner 59400 22486 0 +ZCorner 59408 22474 0 +ZCorner 59417 22463 0 +ZCorner 59426 22451 0 +ZCorner 59436 22418 0 +ZCorner 59446 22384 0 +ZCorner 59455 22351 0 +ZCorner 59465 22318 0 +ZCorner 59467 22305 0 +ZCorner 59469 22293 0 +ZCorner 59471 22280 0 +ZCorner 59473 22267 0 +ZCorner 59469 22259 0 +ZCorner 59465 22252 0 +ZCorner 59461 22244 0 +ZCorner 59457 22236 0 +ZCorner 59445 22229 0 +ZCorner 59432 22222 0 +ZCorner 59419 22215 0 +ZCorner 59407 22209 0 +ZCorner 59394 22211 0 +ZCorner 59381 22213 0 +ZCorner 59368 22214 0 +ZCorner 59356 22216 0 +ZCorner 59352 22220 0 +ZCorner 59348 22224 0 +ZCorner 59344 22228 0 +ZCorner 59340 22232 1 +$POLYSCORNERS +59316 22549 0 0 +59352 22545 0 0 +59352 22513 0 0 +59307 22502 0 0 +59286 22463 0 0 +59287 22395 0 0 +59313 22299 0 0 +59317 22299 0 0 +59317 22291 0 0 +59321 22283 0 0 +59326 22270 0 0 +59330 22258 0 0 +59340 22232 0 0 +59356 22216 0 0 +59368 22214 0 0 +59381 22213 0 0 +59407 22209 0 0 +59419 22215 0 0 +59445 22229 0 0 +59457 22236 0 0 +59465 22252 0 0 +59469 22259 0 0 +59473 22267 0 0 +59469 22293 0 0 +59467 22305 0 0 +59465 22318 0 0 +59455 22351 0 0 +59446 22384 0 0 +59436 22418 0 0 +59426 22451 0 0 +59417 22463 0 0 +59408 22474 0 0 +59400 22486 0 0 +59391 22498 0 0 +59371 22506 0 0 +59362 22509 0 0 +59352 22513 0 0 +59352 22545 0 0 +59382 22543 0 0 +59465 22490 0 0 +59512 22387 0 0 +59524 22300 0 0 +59500 22229 0 0 +59442 22174 0 0 +59358 22169 0 0 +59296 22203 0 0 +59254 22275 0 0 +59235 22385 0 0 +59234 22394 0 0 +59231 22424 0 0 +59265 22509 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66000F 0 "" +ZLayer 20 +ZAux 41 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 59993 22385 0 +ZCorner 60002 22387 0 +ZCorner 60012 22390 0 +ZCorner 60022 22393 0 +ZCorner 60032 22396 0 +ZCorner 60031 22416 0 +ZCorner 60041 22446 0 +ZCorner 60063 22486 0 +ZCorner 60098 22537 0 +ZCorner 60092 22548 0 +ZCorner 60086 22558 0 +ZCorner 60081 22569 0 +ZCorner 60075 22580 0 +ZCorner 60066 22570 0 +ZCorner 60057 22560 0 +ZCorner 60048 22551 0 +ZCorner 60040 22541 0 +ZCorner 60033 22529 0 +ZCorner 60026 22517 0 +ZCorner 60019 22506 0 +ZCorner 60012 22494 0 +ZCorner 60009 22495 0 +ZCorner 60006 22496 0 +ZCorner 60003 22497 0 +ZCorner 60001 22498 0 +ZCorner 60000 22503 0 +ZCorner 59999 22508 0 +ZCorner 59998 22512 0 +ZCorner 59997 22517 0 +ZCorner 59967 22576 0 +ZCorner 59938 22635 0 +ZCorner 59909 22693 0 +ZCorner 59879 22752 0 +ZCorner 59869 22747 0 +ZCorner 59858 22742 0 +ZCorner 59847 22737 0 +ZCorner 59836 22732 0 +ZCorner 59875 22645 0 +ZCorner 59914 22558 0 +ZCorner 59954 22471 0 +ZCorner 59993 22385 1 +$POLYSCORNERS +59879 22752 0 0 +59909 22693 0 0 +59938 22635 0 0 +59967 22576 0 0 +59997 22517 0 0 +59998 22512 0 0 +59999 22508 0 0 +60001 22498 0 0 +60003 22497 0 0 +60012 22494 0 0 +60019 22506 0 0 +60026 22517 0 0 +60040 22541 0 0 +60048 22551 0 0 +60057 22560 0 0 +60075 22580 0 0 +60081 22569 0 0 +60086 22558 0 0 +60092 22548 0 0 +60098 22537 0 0 +60063 22486 0 0 +60041 22446 0 0 +60031 22416 0 0 +60032 22396 0 0 +60002 22387 0 0 +59993 22385 0 0 +59954 22471 0 0 +59914 22558 0 0 +59836 22732 0 0 +59869 22747 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660010 0 "" +ZLayer 20 +ZAux 33 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 60137 22892 0 +ZCorner 60126 22886 0 +ZCorner 60116 22881 0 +ZCorner 60105 22875 0 +ZCorner 60094 22869 0 +ZCorner 60143 22787 0 +ZCorner 60192 22705 0 +ZCorner 60240 22623 0 +ZCorner 60289 22541 0 +ZCorner 60298 22545 0 +ZCorner 60307 22549 0 +ZCorner 60316 22553 0 +ZCorner 60324 22556 0 +ZCorner 60323 22579 0 +ZCorner 60331 22611 0 +ZCorner 60348 22652 0 +ZCorner 60375 22701 0 +ZCorner 60369 22711 0 +ZCorner 60363 22720 0 +ZCorner 60358 22730 0 +ZCorner 60352 22740 0 +ZCorner 60346 22741 0 +ZCorner 60334 22725 0 +ZCorner 60317 22694 0 +ZCorner 60293 22646 0 +ZCorner 60289 22653 0 +ZCorner 60285 22660 0 +ZCorner 60281 22667 0 +ZCorner 60278 22674 0 +ZCorner 60242 22728 0 +ZCorner 60207 22783 0 +ZCorner 60172 22838 0 +ZCorner 60137 22892 1 +$POLYSCORNERS +60137 22892 0 0 +60172 22838 0 0 +60242 22728 0 0 +60278 22674 0 0 +60281 22667 0 0 +60293 22646 0 0 +60317 22694 0 0 +60334 22725 0 0 +60346 22741 0 0 +60352 22740 0 0 +60358 22730 0 0 +60363 22720 0 0 +60369 22711 0 0 +60375 22701 0 0 +60348 22652 0 0 +60331 22611 0 0 +60323 22579 0 0 +60324 22556 0 0 +60316 22553 0 0 +60289 22541 0 0 +60240 22623 0 0 +60192 22705 0 0 +60094 22869 0 0 +60116 22881 0 0 +60126 22886 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660011 0 "" +ZLayer 20 +ZAux 46 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 57181 22455 0 +ZCorner 57180 22437 0 +ZCorner 57179 22420 0 +ZCorner 57178 22402 0 +ZCorner 57177 22385 0 +ZCorner 57197 22325 0 +ZCorner 57233 22286 0 +ZCorner 57286 22269 0 +ZCorner 57356 22275 0 +ZCorner 57408 22323 0 +ZCorner 57445 22385 0 +ZCorner 57468 22461 0 +ZCorner 57477 22548 0 +ZCorner 57434 22622 0 +ZCorner 57379 22649 0 +ZCorner 57312 22631 0 +ZCorner 57231 22568 0 +ZCorner 57219 22540 0 +ZCorner 57206 22511 0 +ZCorner 57193 22483 0 +ZCorner 57181 22455 1 +ZCorner 57376 22369 0 +ZCorner 57325 22321 0 +ZCorner 57283 22308 0 +ZCorner 57250 22329 0 +ZCorner 57228 22385 0 +ZCorner 57230 22390 0 +ZCorner 57232 22396 0 +ZCorner 57234 22402 0 +ZCorner 57236 22408 0 +ZCorner 57237 22423 0 +ZCorner 57239 22437 0 +ZCorner 57241 22452 0 +ZCorner 57243 22466 0 +ZCorner 57245 22467 0 +ZCorner 57247 22468 0 +ZCorner 57249 22469 0 +ZCorner 57251 22470 0 +ZCorner 57276 22540 0 +ZCorner 57309 22584 0 +ZCorner 57349 22603 0 +ZCorner 57396 22595 0 +ZCorner 57422 22572 0 +ZCorner 57427 22526 0 +ZCorner 57411 22458 0 +ZCorner 57376 22369 1 +$POLYSCORNERS +57379 22649 0 0 +57434 22622 0 0 +57477 22548 0 0 +57468 22461 0 0 +57445 22385 0 0 +57408 22323 0 0 +57356 22275 0 0 +57286 22269 0 0 +57233 22286 0 0 +57197 22325 0 0 +57177 22385 0 0 +57178 22402 0 0 +57179 22420 0 0 +57180 22437 0 0 +57181 22455 0 0 +57193 22483 0 0 +57206 22511 0 0 +57219 22540 0 0 +57231 22568 0 0 +57312 22631 0 0 +57349 22640 0 0 +57349 22603 0 0 +57309 22584 0 0 +57276 22540 0 0 +57251 22470 0 0 +57243 22466 0 0 +57241 22452 0 0 +57239 22437 0 0 +57237 22423 0 0 +57236 22408 0 0 +57230 22390 0 0 +57228 22385 0 0 +57250 22329 0 0 +57283 22308 0 0 +57325 22321 0 0 +57376 22369 0 0 +57411 22458 0 0 +57427 22526 0 0 +57422 22572 0 0 +57396 22595 0 0 +57349 22603 0 0 +57349 22640 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660012 0 "" +ZLayer 20 +ZAux 33 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 57548 22178 0 +ZCorner 57579 22201 0 +ZCorner 57615 22219 0 +ZCorner 57655 22232 0 +ZCorner 57700 22240 0 +ZCorner 57702 22251 0 +ZCorner 57704 22261 0 +ZCorner 57706 22272 0 +ZCorner 57708 22283 0 +ZCorner 57680 22277 0 +ZCorner 57653 22271 0 +ZCorner 57626 22265 0 +ZCorner 57599 22259 0 +ZCorner 57601 22267 0 +ZCorner 57603 22275 0 +ZCorner 57604 22283 0 +ZCorner 57606 22291 0 +ZCorner 57623 22354 0 +ZCorner 57640 22418 0 +ZCorner 57656 22481 0 +ZCorner 57673 22545 0 +ZCorner 57662 22547 0 +ZCorner 57651 22550 0 +ZCorner 57641 22553 0 +ZCorner 57630 22556 0 +ZCorner 57603 22463 0 +ZCorner 57575 22371 0 +ZCorner 57548 22278 0 +ZCorner 57521 22185 0 +ZCorner 57527 22183 0 +ZCorner 57534 22181 0 +ZCorner 57541 22179 0 +ZCorner 57548 22178 1 +$POLYSCORNERS +57630 22556 0 0 +57641 22553 0 0 +57651 22550 0 0 +57662 22547 0 0 +57673 22545 0 0 +57656 22481 0 0 +57640 22418 0 0 +57623 22354 0 0 +57606 22291 0 0 +57604 22283 0 0 +57603 22275 0 0 +57599 22259 0 0 +57680 22277 0 0 +57708 22283 0 0 +57704 22261 0 0 +57702 22251 0 0 +57700 22240 0 0 +57655 22232 0 0 +57615 22219 0 0 +57579 22201 0 0 +57548 22178 0 0 +57541 22179 0 0 +57527 22183 0 0 +57521 22185 0 0 +57575 22371 0 0 +57603 22463 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660013 0 "" +ZLayer 20 +ZAux 33 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 57845 22115 0 +ZCorner 57853 22112 0 +ZCorner 57862 22109 0 +ZCorner 57871 22106 0 +ZCorner 57880 22103 0 +ZCorner 57905 22128 0 +ZCorner 57935 22147 0 +ZCorner 57970 22163 0 +ZCorner 58009 22174 0 +ZCorner 58012 22186 0 +ZCorner 58016 22199 0 +ZCorner 58020 22212 0 +ZCorner 58024 22225 0 +ZCorner 57998 22216 0 +ZCorner 57971 22207 0 +ZCorner 57945 22198 0 +ZCorner 57919 22189 0 +ZCorner 57919 22196 0 +ZCorner 57919 22203 0 +ZCorner 57919 22210 0 +ZCorner 57919 22217 0 +ZCorner 57929 22282 0 +ZCorner 57940 22348 0 +ZCorner 57951 22413 0 +ZCorner 57962 22479 0 +ZCorner 57951 22480 0 +ZCorner 57940 22482 0 +ZCorner 57929 22484 0 +ZCorner 57919 22486 0 +ZCorner 57900 22394 0 +ZCorner 57882 22301 0 +ZCorner 57863 22208 0 +ZCorner 57845 22115 1 +$POLYSCORNERS +57919 22486 0 0 +57929 22484 0 0 +57951 22480 0 0 +57962 22479 0 0 +57951 22413 0 0 +57940 22348 0 0 +57929 22282 0 0 +57919 22217 0 0 +57919 22189 0 0 +57971 22207 0 0 +57998 22216 0 0 +58024 22225 0 0 +58012 22186 0 0 +58009 22174 0 0 +57970 22163 0 0 +57935 22147 0 0 +57905 22128 0 0 +57880 22103 0 0 +57853 22112 0 0 +57845 22115 0 0 +57863 22208 0 0 +57882 22301 0 0 +57900 22394 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660014 0 "" +ZLayer 20 +ZAux 54 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 58149 22385 0 +ZCorner 58146 22381 0 +ZCorner 58143 22377 0 +ZCorner 58140 22373 0 +ZCorner 58138 22369 0 +ZCorner 58108 22248 0 +ZCorner 58116 22156 0 +ZCorner 58160 22092 0 +ZCorner 58243 22057 0 +ZCorner 58315 22071 0 +ZCorner 58361 22126 0 +ZCorner 58381 22222 0 +ZCorner 58376 22357 0 +ZCorner 58372 22364 0 +ZCorner 58368 22371 0 +ZCorner 58364 22378 0 +ZCorner 58360 22385 0 +ZCorner 58320 22433 0 +ZCorner 58272 22449 0 +ZCorner 58215 22433 0 +ZCorner 58149 22385 1 +ZCorner 58259 22096 0 +ZCorner 58246 22098 0 +ZCorner 58233 22099 0 +ZCorner 58221 22101 0 +ZCorner 58208 22103 0 +ZCorner 58202 22109 0 +ZCorner 58196 22115 0 +ZCorner 58190 22121 0 +ZCorner 58184 22127 0 +ZCorner 58182 22140 0 +ZCorner 58179 22154 0 +ZCorner 58176 22168 0 +ZCorner 58173 22181 0 +ZCorner 58170 22272 0 +ZCorner 58181 22340 0 +ZCorner 58206 22385 0 +ZCorner 58243 22408 0 +ZCorner 58292 22391 0 +ZCorner 58322 22351 0 +ZCorner 58333 22288 0 +ZCorner 58325 22201 0 +ZCorner 58323 22190 0 +ZCorner 58321 22179 0 +ZCorner 58319 22169 0 +ZCorner 58317 22158 0 +ZCorner 58313 22150 0 +ZCorner 58309 22142 0 +ZCorner 58305 22135 0 +ZCorner 58302 22127 0 +ZCorner 58291 22119 0 +ZCorner 58280 22111 0 +ZCorner 58269 22103 0 +ZCorner 58259 22096 1 +$POLYSCORNERS +58272 22449 0 0 +58320 22433 0 0 +58360 22385 0 0 +58376 22357 0 0 +58381 22222 0 0 +58361 22126 0 0 +58315 22071 0 0 +58243 22057 0 0 +58160 22092 0 0 +58116 22156 0 0 +58108 22248 0 0 +58138 22369 0 0 +58140 22373 0 0 +58149 22385 0 0 +58215 22433 0 0 +58243 22440 0 0 +58243 22408 0 0 +58206 22385 0 0 +58181 22340 0 0 +58170 22272 0 0 +58173 22181 0 0 +58176 22168 0 0 +58182 22140 0 0 +58184 22127 0 0 +58208 22103 0 0 +58221 22101 0 0 +58233 22099 0 0 +58246 22098 0 0 +58259 22096 0 0 +58269 22103 0 0 +58302 22127 0 0 +58305 22135 0 0 +58309 22142 0 0 +58317 22158 0 0 +58319 22169 0 0 +58321 22179 0 0 +58325 22201 0 0 +58333 22288 0 0 +58322 22351 0 0 +58292 22391 0 0 +58243 22408 0 0 +58243 22440 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660015 0 "" +ZLayer 20 +ZAux 41 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 60567 22728 0 +ZCorner 60575 22732 0 +ZCorner 60584 22736 0 +ZCorner 60593 22740 0 +ZCorner 60602 22744 0 +ZCorner 60599 22779 0 +ZCorner 60605 22815 0 +ZCorner 60617 22853 0 +ZCorner 60637 22892 0 +ZCorner 60631 22902 0 +ZCorner 60625 22912 0 +ZCorner 60619 22922 0 +ZCorner 60613 22931 0 +ZCorner 60604 22917 0 +ZCorner 60594 22902 0 +ZCorner 60584 22887 0 +ZCorner 60574 22873 0 +ZCorner 60571 22863 0 +ZCorner 60568 22853 0 +ZCorner 60566 22843 0 +ZCorner 60563 22834 0 +ZCorner 60559 22839 0 +ZCorner 60555 22845 0 +ZCorner 60551 22851 0 +ZCorner 60547 22857 0 +ZCorner 60546 22858 0 +ZCorner 60545 22859 0 +ZCorner 60544 22860 0 +ZCorner 60543 22861 0 +ZCorner 60503 22912 0 +ZCorner 60463 22963 0 +ZCorner 60423 23013 0 +ZCorner 60383 23064 0 +ZCorner 60372 23057 0 +ZCorner 60361 23050 0 +ZCorner 60351 23044 0 +ZCorner 60340 23037 0 +ZCorner 60397 22960 0 +ZCorner 60453 22882 0 +ZCorner 60510 22805 0 +ZCorner 60567 22728 1 +$POLYSCORNERS +60383 23064 0 0 +60423 23013 0 0 +60463 22963 0 0 +60543 22861 0 0 +60547 22857 0 0 +60559 22839 0 0 +60563 22834 0 0 +60566 22843 0 0 +60568 22853 0 0 +60574 22873 0 0 +60584 22887 0 0 +60604 22917 0 0 +60613 22931 0 0 +60619 22922 0 0 +60637 22892 0 0 +60617 22853 0 0 +60605 22815 0 0 +60599 22779 0 0 +60602 22744 0 0 +60575 22732 0 0 +60567 22728 0 0 +60453 22882 0 0 +60397 22960 0 0 +60340 23037 0 0 +60351 23044 0 0 +60361 23050 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660016 0 "" +ZLayer 20 +ZAux 58 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 60574 23150 0 +ZCorner 60577 23140 0 +ZCorner 60580 23131 0 +ZCorner 60583 23121 0 +ZCorner 60586 23111 0 +ZCorner 60653 23015 0 +ZCorner 60720 22956 0 +ZCorner 60785 22935 0 +ZCorner 60848 22951 0 +ZCorner 60905 23006 0 +ZCorner 60919 23071 0 +ZCorner 60891 23146 0 +ZCorner 60820 23232 0 +ZCorner 60813 23237 0 +ZCorner 60807 23242 0 +ZCorner 60800 23247 0 +ZCorner 60793 23252 0 +ZCorner 60696 23285 0 +ZCorner 60627 23278 0 +ZCorner 60586 23233 0 +ZCorner 60574 23150 1 +ZCorner 60719 23029 0 +ZCorner 60715 23034 0 +ZCorner 60711 23039 0 +ZCorner 60707 23044 0 +ZCorner 60703 23048 0 +ZCorner 60645 23113 0 +ZCorner 60615 23166 0 +ZCorner 60615 23208 0 +ZCorner 60645 23240 0 +ZCorner 60696 23241 0 +ZCorner 60745 23222 0 +ZCorner 60791 23183 0 +ZCorner 60836 23123 0 +ZCorner 60842 23117 0 +ZCorner 60848 23111 0 +ZCorner 60854 23105 0 +ZCorner 60860 23099 0 +ZCorner 60863 23088 0 +ZCorner 60867 23076 0 +ZCorner 60871 23064 0 +ZCorner 60875 23052 0 +ZCorner 60865 23038 0 +ZCorner 60856 23023 0 +ZCorner 60846 23009 0 +ZCorner 60836 22994 0 +ZCorner 60827 22991 0 +ZCorner 60818 22988 0 +ZCorner 60810 22985 0 +ZCorner 60801 22982 0 +ZCorner 60791 22984 0 +ZCorner 60781 22986 0 +ZCorner 60772 22988 0 +ZCorner 60762 22990 0 +ZCorner 60751 23000 0 +ZCorner 60740 23009 0 +ZCorner 60730 23019 0 +ZCorner 60719 23029 1 +$POLYSCORNERS +60696 23241 0 0 +60696 23285 0 0 +60793 23252 0 0 +60807 23242 0 0 +60813 23237 0 0 +60820 23232 0 0 +60891 23146 0 0 +60919 23071 0 0 +60905 23006 0 0 +60848 22951 0 0 +60785 22935 0 0 +60720 22956 0 0 +60653 23015 0 0 +60586 23111 0 0 +60580 23131 0 0 +60577 23140 0 0 +60574 23150 0 0 +60586 23233 0 0 +60627 23278 0 0 +60696 23285 0 0 +60696 23241 0 0 +60645 23240 0 0 +60615 23208 0 0 +60615 23166 0 0 +60645 23113 0 0 +60703 23048 0 0 +60707 23044 0 0 +60719 23029 0 0 +60730 23019 0 0 +60740 23009 0 0 +60751 23000 0 0 +60762 22990 0 0 +60772 22988 0 0 +60781 22986 0 0 +60801 22982 0 0 +60810 22985 0 0 +60818 22988 0 0 +60836 22994 0 0 +60846 23009 0 0 +60856 23023 0 0 +60865 23038 0 0 +60875 23052 0 0 +60863 23088 0 0 +60860 23099 0 0 +60836 23123 0 0 +60791 23183 0 0 +60745 23222 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660017 0 "" +ZLayer 20 +ZAux 54 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 57473 28774 0 +ZCorner 57450 28898 0 +ZCorner 57409 28982 0 +ZCorner 57350 29028 0 +ZCorner 57274 29036 0 +ZCorner 57202 29003 0 +ZCorner 57172 28939 0 +ZCorner 57184 28844 0 +ZCorner 57239 28719 0 +ZCorner 57318 28663 0 +ZCorner 57383 28653 0 +ZCorner 57435 28690 0 +ZCorner 57473 28774 1 +ZCorner 57235 28871 0 +ZCorner 57234 28878 0 +ZCorner 57233 28885 0 +ZCorner 57232 28892 0 +ZCorner 57231 28899 0 +ZCorner 57229 28908 0 +ZCorner 57227 28916 0 +ZCorner 57226 28925 0 +ZCorner 57224 28934 0 +ZCorner 57226 28942 0 +ZCorner 57229 28950 0 +ZCorner 57232 28957 0 +ZCorner 57235 28965 0 +ZCorner 57246 28972 0 +ZCorner 57257 28979 0 +ZCorner 57267 28986 0 +ZCorner 57278 28992 0 +ZCorner 57288 28992 0 +ZCorner 57298 28992 0 +ZCorner 57307 28992 0 +ZCorner 57317 28992 0 +ZCorner 57326 28988 0 +ZCorner 57335 28983 0 +ZCorner 57344 28978 0 +ZCorner 57352 28973 0 +ZCorner 57360 28959 0 +ZCorner 57368 28946 0 +ZCorner 57376 28932 0 +ZCorner 57384 28918 0 +ZCorner 57414 28822 0 +ZCorner 57422 28752 0 +ZCorner 57408 28708 0 +ZCorner 57372 28692 0 +ZCorner 57324 28705 0 +ZCorner 57286 28739 0 +ZCorner 57258 28793 0 +ZCorner 57239 28868 0 +ZCorner 57238 28869 0 +ZCorner 57237 28869 0 +ZCorner 57236 28870 0 +ZCorner 57235 28871 1 +$POLYSCORNERS +57274 29036 0 0 +57278 29035 0 0 +57278 28992 0 0 +57267 28986 0 0 +57257 28979 0 0 +57235 28965 0 0 +57232 28957 0 0 +57229 28950 0 0 +57226 28942 0 0 +57224 28934 0 0 +57226 28925 0 0 +57227 28916 0 0 +57229 28908 0 0 +57231 28899 0 0 +57235 28871 0 0 +57237 28869 0 0 +57238 28869 0 0 +57239 28868 0 0 +57258 28793 0 0 +57286 28739 0 0 +57324 28705 0 0 +57372 28692 0 0 +57408 28708 0 0 +57422 28752 0 0 +57414 28822 0 0 +57384 28918 0 0 +57368 28946 0 0 +57360 28959 0 0 +57352 28973 0 0 +57344 28978 0 0 +57326 28988 0 0 +57317 28992 0 0 +57278 28992 0 0 +57278 29035 0 0 +57350 29028 0 0 +57409 28982 0 0 +57450 28898 0 0 +57473 28774 0 0 +57435 28690 0 0 +57383 28653 0 0 +57318 28663 0 0 +57239 28719 0 0 +57184 28844 0 0 +57172 28939 0 0 +57202 29003 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660018 0 "" +ZLayer 20 +ZAux 33 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 57970 28824 0 +ZCorner 57982 28826 0 +ZCorner 57995 28828 0 +ZCorner 58007 28830 0 +ZCorner 58020 28832 0 +ZCorner 58006 28927 0 +ZCorner 57991 29022 0 +ZCorner 57976 29117 0 +ZCorner 57962 29211 0 +ZCorner 57952 29210 0 +ZCorner 57942 29209 0 +ZCorner 57932 29208 0 +ZCorner 57923 29207 0 +ZCorner 57896 29165 0 +ZCorner 57870 29132 0 +ZCorner 57845 29108 0 +ZCorner 57821 29094 0 +ZCorner 57823 29083 0 +ZCorner 57825 29071 0 +ZCorner 57827 29059 0 +ZCorner 57829 29047 0 +ZCorner 57848 29054 0 +ZCorner 57869 29067 0 +ZCorner 57890 29087 0 +ZCorner 57911 29114 0 +ZCorner 57914 29107 0 +ZCorner 57917 29100 0 +ZCorner 57920 29093 0 +ZCorner 57923 29086 0 +ZCorner 57935 29021 0 +ZCorner 57946 28955 0 +ZCorner 57958 28890 0 +ZCorner 57970 28824 1 +$POLYSCORNERS +57962 29211 0 0 +57976 29117 0 0 +58006 28927 0 0 +58020 28832 0 0 +58007 28830 0 0 +57995 28828 0 0 +57982 28826 0 0 +57970 28824 0 0 +57958 28890 0 0 +57946 28955 0 0 +57935 29021 0 0 +57923 29086 0 0 +57911 29114 0 0 +57890 29087 0 0 +57869 29067 0 0 +57848 29054 0 0 +57829 29047 0 0 +57823 29083 0 0 +57821 29094 0 0 +57845 29108 0 0 +57870 29132 0 0 +57896 29165 0 0 +57923 29207 0 0 +57932 29208 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660019 0 "" +ZLayer 20 +ZAux 37 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 58149 29145 0 +ZCorner 58148 29132 0 +ZCorner 58147 29120 0 +ZCorner 58146 29107 0 +ZCorner 58146 29094 0 +ZCorner 58168 29109 0 +ZCorner 58190 29123 0 +ZCorner 58213 29138 0 +ZCorner 58235 29153 0 +ZCorner 58237 29152 0 +ZCorner 58239 29151 0 +ZCorner 58241 29150 0 +ZCorner 58243 29149 0 +ZCorner 58243 29143 0 +ZCorner 58243 29137 0 +ZCorner 58243 29131 0 +ZCorner 58243 29125 0 +ZCorner 58248 29059 0 +ZCorner 58253 28993 0 +ZCorner 58258 28926 0 +ZCorner 58263 28860 0 +ZCorner 58276 28861 0 +ZCorner 58290 28862 0 +ZCorner 58304 28863 0 +ZCorner 58318 28864 0 +ZCorner 58312 28960 0 +ZCorner 58306 29057 0 +ZCorner 58300 29154 0 +ZCorner 58294 29250 0 +ZCorner 58285 29250 0 +ZCorner 58277 29250 0 +ZCorner 58268 29250 0 +ZCorner 58259 29250 0 +ZCorner 58232 29213 0 +ZCorner 58204 29183 0 +ZCorner 58176 29161 0 +ZCorner 58149 29145 1 +$POLYSCORNERS +58294 29250 0 0 +58300 29154 0 0 +58312 28960 0 0 +58318 28864 0 0 +58276 28861 0 0 +58263 28860 0 0 +58258 28926 0 0 +58253 28993 0 0 +58243 29125 0 0 +58243 29149 0 0 +58235 29153 0 0 +58213 29138 0 0 +58190 29123 0 0 +58168 29109 0 0 +58146 29094 0 0 +58146 29107 0 0 +58147 29120 0 0 +58148 29132 0 0 +58149 29145 0 0 +58176 29161 0 0 +58204 29183 0 0 +58232 29213 0 0 +58259 29250 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66001A 0 "" +ZLayer 20 +ZAux 66 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 57766 28844 0 +ZCorner 57767 28848 0 +ZCorner 57768 28852 0 +ZCorner 57769 28856 0 +ZCorner 57770 28860 0 +ZCorner 57754 28986 0 +ZCorner 57718 29074 0 +ZCorner 57662 29123 0 +ZCorner 57587 29133 0 +ZCorner 57519 29112 0 +ZCorner 57487 29055 0 +ZCorner 57490 28961 0 +ZCorner 57528 28832 0 +ZCorner 57590 28765 0 +ZCorner 57650 28744 0 +ZCorner 57710 28769 0 +ZCorner 57767 28840 0 +ZCorner 57767 28841 0 +ZCorner 57767 28842 0 +ZCorner 57767 28843 0 +ZCorner 57766 28844 1 +ZCorner 57563 28871 0 +ZCorner 57560 28881 0 +ZCorner 57558 28891 0 +ZCorner 57555 28901 0 +ZCorner 57552 28910 0 +ZCorner 57551 28911 0 +ZCorner 57550 28912 0 +ZCorner 57549 28913 0 +ZCorner 57548 28914 0 +ZCorner 57547 28929 0 +ZCorner 57546 28944 0 +ZCorner 57545 28958 0 +ZCorner 57544 28973 0 +ZCorner 57543 28973 0 +ZCorner 57542 28973 0 +ZCorner 57541 28973 0 +ZCorner 57540 28973 0 +ZCorner 57540 28979 0 +ZCorner 57540 28985 0 +ZCorner 57540 28990 0 +ZCorner 57540 28996 0 +ZCorner 57535 29035 0 +ZCorner 57544 29065 0 +ZCorner 57567 29086 0 +ZCorner 57606 29098 0 +ZCorner 57618 29093 0 +ZCorner 57630 29088 0 +ZCorner 57641 29083 0 +ZCorner 57653 29078 0 +ZCorner 57658 29072 0 +ZCorner 57663 29065 0 +ZCorner 57668 29058 0 +ZCorner 57673 29051 0 +ZCorner 57675 29044 0 +ZCorner 57677 29037 0 +ZCorner 57679 29031 0 +ZCorner 57681 29024 0 +ZCorner 57706 28954 0 +ZCorner 57716 28894 0 +ZCorner 57711 28844 0 +ZCorner 57692 28805 0 +ZCorner 57653 28787 0 +ZCorner 57619 28793 0 +ZCorner 57589 28821 0 +ZCorner 57563 28871 1 +$POLYSCORNERS +57587 29133 0 0 +57606 29130 0 0 +57606 29098 0 0 +57567 29086 0 0 +57544 29065 0 0 +57535 29035 0 0 +57540 28996 0 0 +57540 28973 0 0 +57544 28973 0 0 +57545 28958 0 0 +57546 28944 0 0 +57548 28914 0 0 +57552 28910 0 0 +57555 28901 0 0 +57558 28891 0 0 +57560 28881 0 0 +57563 28871 0 0 +57589 28821 0 0 +57619 28793 0 0 +57653 28787 0 0 +57692 28805 0 0 +57711 28844 0 0 +57716 28894 0 0 +57706 28954 0 0 +57681 29024 0 0 +57679 29031 0 0 +57677 29037 0 0 +57673 29051 0 0 +57658 29072 0 0 +57653 29078 0 0 +57641 29083 0 0 +57630 29088 0 0 +57606 29098 0 0 +57606 29130 0 0 +57662 29123 0 0 +57718 29074 0 0 +57754 28986 0 0 +57770 28860 0 0 +57766 28844 0 0 +57767 28843 0 0 +57767 28840 0 0 +57710 28769 0 0 +57650 28744 0 0 +57590 28765 0 0 +57528 28832 0 0 +57490 28961 0 0 +57487 29055 0 0 +57519 29112 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66001B 0 "" +ZLayer 20 +ZAux 54 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 59817 28684 0 +ZCorner 59823 28601 0 +ZCorner 59861 28553 0 +ZCorner 59929 28540 0 +ZCorner 60028 28563 0 +ZCorner 60096 28673 0 +ZCorner 60127 28763 0 +ZCorner 60118 28834 0 +ZCorner 60071 28887 0 +ZCorner 59975 28897 0 +ZCorner 59902 28868 0 +ZCorner 59850 28802 0 +ZCorner 59821 28700 0 +ZCorner 59820 28698 0 +ZCorner 59819 28696 0 +ZCorner 59818 28694 0 +ZCorner 59817 28692 0 +ZCorner 59817 28690 0 +ZCorner 59817 28688 0 +ZCorner 59817 28686 0 +ZCorner 59817 28684 1 +ZCorner 60059 28735 0 +ZCorner 60019 28646 0 +ZCorner 59978 28591 0 +ZCorner 59935 28568 0 +ZCorner 59891 28579 0 +ZCorner 59871 28633 0 +ZCorner 59871 28690 0 +ZCorner 59892 28752 0 +ZCorner 59934 28817 0 +ZCorner 59939 28824 0 +ZCorner 59944 28830 0 +ZCorner 59949 28837 0 +ZCorner 59953 28844 0 +ZCorner 59962 28849 0 +ZCorner 59971 28854 0 +ZCorner 59980 28859 0 +ZCorner 59989 28864 0 +ZCorner 60002 28862 0 +ZCorner 60016 28860 0 +ZCorner 60030 28858 0 +ZCorner 60043 28856 0 +ZCorner 60052 28844 0 +ZCorner 60061 28832 0 +ZCorner 60070 28821 0 +ZCorner 60078 28809 0 +ZCorner 60076 28792 0 +ZCorner 60074 28776 0 +ZCorner 60073 28759 0 +ZCorner 60071 28743 0 +ZCorner 60068 28741 0 +ZCorner 60065 28739 0 +ZCorner 60062 28737 0 +ZCorner 60059 28735 1 +$POLYSCORNERS +59975 28897 0 0 +59989 28895 0 0 +59989 28864 0 0 +59953 28844 0 0 +59949 28837 0 0 +59944 28830 0 0 +59939 28824 0 0 +59934 28817 0 0 +59892 28752 0 0 +59871 28690 0 0 +59871 28633 0 0 +59891 28579 0 0 +59935 28568 0 0 +59978 28591 0 0 +60019 28646 0 0 +60059 28735 0 0 +60071 28743 0 0 +60073 28759 0 0 +60074 28776 0 0 +60076 28792 0 0 +60078 28809 0 0 +60070 28821 0 0 +60061 28832 0 0 +60043 28856 0 0 +60030 28858 0 0 +60002 28862 0 0 +59989 28864 0 0 +59989 28895 0 0 +60071 28887 0 0 +60118 28834 0 0 +60127 28763 0 0 +60096 28673 0 0 +60028 28563 0 0 +59929 28540 0 0 +59861 28553 0 0 +59823 28601 0 0 +59817 28684 0 0 +59817 28692 0 0 +59821 28700 0 0 +59850 28802 0 0 +59902 28868 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66001C 0 "" +ZLayer 20 +ZAux 66 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 59743 28684 0 +ZCorner 59743 28686 0 +ZCorner 59743 28688 0 +ZCorner 59743 28690 0 +ZCorner 59743 28692 0 +ZCorner 59746 28694 0 +ZCorner 59748 28696 0 +ZCorner 59751 28698 0 +ZCorner 59754 28700 0 +ZCorner 59811 28834 0 +ZCorner 59830 28934 0 +ZCorner 59811 28998 0 +ZCorner 59754 29028 0 +ZCorner 59661 29022 0 +ZCorner 59593 28982 0 +ZCorner 59550 28908 0 +ZCorner 59532 28801 0 +ZCorner 59551 28713 0 +ZCorner 59593 28663 0 +ZCorner 59657 28654 0 +ZCorner 59743 28684 1 +ZCorner 59688 28704 0 +ZCorner 59680 28701 0 +ZCorner 59672 28698 0 +ZCorner 59665 28695 0 +ZCorner 59657 28692 0 +ZCorner 59608 28707 0 +ZCorner 59583 28742 0 +ZCorner 59583 28797 0 +ZCorner 59606 28872 0 +ZCorner 59613 28888 0 +ZCorner 59620 28905 0 +ZCorner 59627 28922 0 +ZCorner 59633 28938 0 +ZCorner 59639 28947 0 +ZCorner 59645 28956 0 +ZCorner 59651 28964 0 +ZCorner 59657 28973 0 +ZCorner 59665 28978 0 +ZCorner 59672 28983 0 +ZCorner 59680 28988 0 +ZCorner 59688 28993 0 +ZCorner 59701 28992 0 +ZCorner 59713 28991 0 +ZCorner 59726 28990 0 +ZCorner 59739 28989 0 +ZCorner 59749 28979 0 +ZCorner 59758 28969 0 +ZCorner 59768 28959 0 +ZCorner 59778 28950 0 +ZCorner 59779 28937 0 +ZCorner 59780 28924 0 +ZCorner 59781 28912 0 +ZCorner 59782 28899 0 +ZCorner 59779 28894 0 +ZCorner 59776 28889 0 +ZCorner 59773 28884 0 +ZCorner 59770 28879 0 +ZCorner 59756 28844 0 +ZCorner 59743 28809 0 +ZCorner 59729 28774 0 +ZCorner 59715 28739 0 +ZCorner 59708 28730 0 +ZCorner 59702 28721 0 +ZCorner 59695 28712 0 +ZCorner 59688 28704 1 +$POLYSCORNERS +59754 29028 0 0 +59811 28998 0 0 +59830 28934 0 0 +59811 28834 0 0 +59754 28700 0 0 +59748 28696 0 0 +59746 28694 0 0 +59743 28692 0 0 +59743 28684 0 0 +59657 28654 0 0 +59593 28663 0 0 +59551 28713 0 0 +59532 28801 0 0 +59550 28908 0 0 +59593 28982 0 0 +59661 29022 0 0 +59688 29023 0 0 +59688 28993 0 0 +59672 28983 0 0 +59665 28978 0 0 +59657 28973 0 0 +59651 28964 0 0 +59645 28956 0 0 +59633 28938 0 0 +59627 28922 0 0 +59613 28888 0 0 +59606 28872 0 0 +59583 28797 0 0 +59583 28742 0 0 +59608 28707 0 0 +59657 28692 0 0 +59665 28695 0 0 +59672 28698 0 0 +59688 28704 0 0 +59695 28712 0 0 +59702 28721 0 0 +59708 28730 0 0 +59715 28739 0 0 +59743 28809 0 0 +59756 28844 0 0 +59770 28879 0 0 +59782 28899 0 0 +59781 28912 0 0 +59780 28924 0 0 +59778 28950 0 0 +59768 28959 0 0 +59758 28969 0 0 +59749 28979 0 0 +59739 28989 0 0 +59713 28991 0 0 +59701 28992 0 0 +59688 28993 0 0 +59688 29023 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66001D 0 "" +ZLayer 20 +ZAux 37 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 59379 28747 0 +ZCorner 59406 28838 0 +ZCorner 59432 28930 0 +ZCorner 59458 29022 0 +ZCorner 59485 29114 0 +ZCorner 59476 29116 0 +ZCorner 59467 29118 0 +ZCorner 59459 29120 0 +ZCorner 59450 29122 0 +ZCorner 59428 29105 0 +ZCorner 59397 29089 0 +ZCorner 59357 29075 0 +ZCorner 59309 29063 0 +ZCorner 59307 29052 0 +ZCorner 59305 29041 0 +ZCorner 59303 29031 0 +ZCorner 59301 29020 0 +ZCorner 59328 29027 0 +ZCorner 59354 29034 0 +ZCorner 59380 29040 0 +ZCorner 59407 29047 0 +ZCorner 59408 29047 0 +ZCorner 59409 29047 0 +ZCorner 59410 29047 0 +ZCorner 59411 29047 0 +ZCorner 59410 29040 0 +ZCorner 59409 29034 0 +ZCorner 59408 29027 0 +ZCorner 59407 29020 0 +ZCorner 59388 28954 0 +ZCorner 59370 28889 0 +ZCorner 59351 28824 0 +ZCorner 59332 28758 0 +ZCorner 59344 28755 0 +ZCorner 59356 28752 0 +ZCorner 59368 28749 0 +ZCorner 59379 28747 1 +$POLYSCORNERS +59450 29122 0 0 +59459 29120 0 0 +59467 29118 0 0 +59485 29114 0 0 +59458 29022 0 0 +59406 28838 0 0 +59379 28747 0 0 +59368 28749 0 0 +59332 28758 0 0 +59351 28824 0 0 +59370 28889 0 0 +59388 28954 0 0 +59407 29020 0 0 +59409 29034 0 0 +59410 29040 0 0 +59411 29047 0 0 +59407 29047 0 0 +59380 29040 0 0 +59354 29034 0 0 +59328 29027 0 0 +59301 29020 0 0 +59303 29031 0 0 +59305 29041 0 0 +59309 29063 0 0 +59357 29075 0 0 +59397 29089 0 0 +59428 29105 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66001E 0 "" +ZLayer 20 +ZAux 33 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 59043 28824 0 +ZCorner 59055 28823 0 +ZCorner 59067 28821 0 +ZCorner 59079 28819 0 +ZCorner 59090 28817 0 +ZCorner 59108 28911 0 +ZCorner 59125 29006 0 +ZCorner 59143 29101 0 +ZCorner 59160 29196 0 +ZCorner 59151 29197 0 +ZCorner 59141 29197 0 +ZCorner 59131 29198 0 +ZCorner 59121 29199 0 +ZCorner 59100 29175 0 +ZCorner 59071 29155 0 +ZCorner 59034 29138 0 +ZCorner 58989 29125 0 +ZCorner 58987 29113 0 +ZCorner 58985 29102 0 +ZCorner 58983 29090 0 +ZCorner 58981 29078 0 +ZCorner 59007 29087 0 +ZCorner 59033 29096 0 +ZCorner 59060 29105 0 +ZCorner 59086 29113 0 +ZCorner 59087 29108 0 +ZCorner 59088 29102 0 +ZCorner 59089 29096 0 +ZCorner 59090 29090 0 +ZCorner 59078 29024 0 +ZCorner 59067 28957 0 +ZCorner 59055 28891 0 +ZCorner 59043 28824 1 +$POLYSCORNERS +59121 29199 0 0 +59141 29197 0 0 +59151 29197 0 0 +59160 29196 0 0 +59143 29101 0 0 +59125 29006 0 0 +59108 28911 0 0 +59090 28817 0 0 +59079 28819 0 0 +59055 28823 0 0 +59043 28824 0 0 +59055 28891 0 0 +59067 28957 0 0 +59078 29024 0 0 +59090 29090 0 0 +59087 29108 0 0 +59086 29113 0 0 +59060 29105 0 0 +59033 29096 0 0 +58981 29078 0 0 +58985 29102 0 0 +58987 29113 0 0 +58989 29125 0 0 +59034 29138 0 0 +59071 29155 0 0 +59100 29175 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E66001F 0 "" +ZLayer 20 +ZAux 62 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 60356 28395 0 +ZCorner 60345 28298 0 +ZCorner 60371 28238 0 +ZCorner 60436 28214 0 +ZCorner 60539 28227 0 +ZCorner 60632 28328 0 +ZCorner 60675 28416 0 +ZCorner 60670 28490 0 +ZCorner 60617 28551 0 +ZCorner 60544 28570 0 +ZCorner 60476 28551 0 +ZCorner 60414 28493 0 +ZCorner 60356 28395 1 +ZCorner 60617 28489 0 +ZCorner 60620 28477 0 +ZCorner 60623 28465 0 +ZCorner 60626 28454 0 +ZCorner 60629 28442 0 +ZCorner 60623 28430 0 +ZCorner 60617 28419 0 +ZCorner 60612 28407 0 +ZCorner 60606 28395 0 +ZCorner 60553 28318 0 +ZCorner 60505 28268 0 +ZCorner 60462 28245 0 +ZCorner 60422 28247 0 +ZCorner 60415 28254 0 +ZCorner 60408 28260 0 +ZCorner 60402 28267 0 +ZCorner 60395 28274 0 +ZCorner 60393 28280 0 +ZCorner 60391 28286 0 +ZCorner 60389 28292 0 +ZCorner 60387 28297 0 +ZCorner 60387 28307 0 +ZCorner 60387 28317 0 +ZCorner 60387 28327 0 +ZCorner 60387 28336 0 +ZCorner 60404 28365 0 +ZCorner 60420 28393 0 +ZCorner 60437 28421 0 +ZCorner 60453 28450 0 +ZCorner 60461 28458 0 +ZCorner 60469 28467 0 +ZCorner 60477 28476 0 +ZCorner 60485 28485 0 +ZCorner 60486 28486 0 +ZCorner 60487 28487 0 +ZCorner 60487 28488 0 +ZCorner 60488 28489 0 +ZCorner 60498 28496 0 +ZCorner 60508 28504 0 +ZCorner 60518 28512 0 +ZCorner 60527 28520 0 +ZCorner 60540 28521 0 +ZCorner 60553 28522 0 +ZCorner 60566 28523 0 +ZCorner 60578 28524 0 +ZCorner 60588 28515 0 +ZCorner 60598 28506 0 +ZCorner 60608 28497 0 +ZCorner 60617 28489 1 +$POLYSCORNERS +60544 28570 0 0 +60578 28561 0 0 +60578 28524 0 0 +60566 28523 0 0 +60527 28520 0 0 +60518 28512 0 0 +60498 28496 0 0 +60488 28489 0 0 +60487 28488 0 0 +60487 28487 0 0 +60485 28485 0 0 +60461 28458 0 0 +60453 28450 0 0 +60437 28421 0 0 +60420 28393 0 0 +60404 28365 0 0 +60387 28336 0 0 +60387 28297 0 0 +60389 28292 0 0 +60395 28274 0 0 +60402 28267 0 0 +60408 28260 0 0 +60415 28254 0 0 +60422 28247 0 0 +60462 28245 0 0 +60505 28268 0 0 +60553 28318 0 0 +60606 28395 0 0 +60612 28407 0 0 +60617 28419 0 0 +60623 28430 0 0 +60629 28442 0 0 +60626 28454 0 0 +60623 28465 0 0 +60617 28489 0 0 +60608 28497 0 0 +60578 28524 0 0 +60578 28561 0 0 +60617 28551 0 0 +60670 28490 0 0 +60675 28416 0 0 +60632 28328 0 0 +60539 28227 0 0 +60436 28214 0 0 +60371 28238 0 0 +60345 28298 0 0 +60356 28395 0 0 +60414 28493 0 0 +60476 28551 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660020 0 "" +ZLayer 20 +ZAux 78 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 60750 28016 0 +ZCorner 60754 28019 0 +ZCorner 60758 28020 0 +ZCorner 60764 28022 0 +ZCorner 60770 28024 0 +ZCorner 60802 28055 0 +ZCorner 60834 28087 0 +ZCorner 60866 28118 0 +ZCorner 60899 28149 0 +ZCorner 60916 28178 0 +ZCorner 60923 28213 0 +ZCorner 60918 28253 0 +ZCorner 60902 28297 0 +ZCorner 60847 28354 0 +ZCorner 60779 28361 0 +ZCorner 60700 28318 0 +ZCorner 60609 28223 0 +ZCorner 60599 28206 0 +ZCorner 60589 28188 0 +ZCorner 60581 28169 0 +ZCorner 60574 28149 0 +ZCorner 60573 28138 0 +ZCorner 60572 28128 0 +ZCorner 60571 28117 0 +ZCorner 60570 28106 0 +ZCorner 60597 28052 0 +ZCorner 60635 28019 0 +ZCorner 60686 28007 0 +ZCorner 60750 28016 1 +ZCorner 60879 28231 0 +ZCorner 60872 28217 0 +ZCorner 60865 28204 0 +ZCorner 60858 28190 0 +ZCorner 60852 28176 0 +ZCorner 60850 28175 0 +ZCorner 60848 28174 0 +ZCorner 60846 28173 0 +ZCorner 60844 28172 0 +ZCorner 60844 28172 0 +ZCorner 60844 28171 0 +ZCorner 60844 28170 0 +ZCorner 60844 28169 0 +ZCorner 60840 28165 0 +ZCorner 60836 28161 0 +ZCorner 60832 28157 0 +ZCorner 60828 28153 0 +ZCorner 60759 28080 0 +ZCorner 60701 28049 0 +ZCorner 60656 28058 0 +ZCorner 60621 28106 0 +ZCorner 60623 28120 0 +ZCorner 60625 28134 0 +ZCorner 60627 28147 0 +ZCorner 60629 28161 0 +ZCorner 60648 28184 0 +ZCorner 60666 28208 0 +ZCorner 60685 28231 0 +ZCorner 60703 28255 0 +ZCorner 60713 28263 0 +ZCorner 60723 28270 0 +ZCorner 60732 28278 0 +ZCorner 60742 28286 0 +ZCorner 60755 28294 0 +ZCorner 60768 28302 0 +ZCorner 60780 28310 0 +ZCorner 60793 28317 0 +ZCorner 60804 28316 0 +ZCorner 60814 28315 0 +ZCorner 60825 28314 0 +ZCorner 60836 28313 0 +ZCorner 60843 28308 0 +ZCorner 60850 28302 0 +ZCorner 60856 28296 0 +ZCorner 60863 28290 0 +ZCorner 60867 28275 0 +ZCorner 60871 28261 0 +ZCorner 60875 28246 0 +ZCorner 60879 28231 1 +$POLYSCORNERS +60779 28361 0 0 +60793 28359 0 0 +60793 28317 0 0 +60780 28310 0 0 +60768 28302 0 0 +60742 28286 0 0 +60732 28278 0 0 +60723 28270 0 0 +60713 28263 0 0 +60703 28255 0 0 +60685 28231 0 0 +60666 28208 0 0 +60648 28184 0 0 +60629 28161 0 0 +60627 28147 0 0 +60625 28134 0 0 +60621 28106 0 0 +60656 28058 0 0 +60701 28049 0 0 +60759 28080 0 0 +60828 28153 0 0 +60844 28169 0 0 +60844 28172 0 0 +60852 28176 0 0 +60858 28190 0 0 +60865 28204 0 0 +60872 28217 0 0 +60879 28231 0 0 +60871 28261 0 0 +60867 28275 0 0 +60863 28290 0 0 +60856 28296 0 0 +60850 28302 0 0 +60843 28308 0 0 +60836 28313 0 0 +60814 28315 0 0 +60804 28316 0 0 +60793 28317 0 0 +60793 28359 0 0 +60847 28354 0 0 +60902 28297 0 0 +60918 28253 0 0 +60923 28213 0 0 +60916 28178 0 0 +60899 28149 0 0 +60866 28118 0 0 +60834 28087 0 0 +60802 28055 0 0 +60770 28024 0 0 +60758 28020 0 0 +60754 28019 0 0 +60750 28016 0 0 +60686 28007 0 0 +60635 28019 0 0 +60597 28052 0 0 +60570 28106 0 0 +60572 28128 0 0 +60573 28138 0 0 +60574 28149 0 0 +60581 28169 0 0 +60589 28188 0 0 +60599 28206 0 0 +60609 28223 0 0 +60700 28318 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660021 0 "" +ZLayer 20 +ZAux 33 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 60149 28403 0 +ZCorner 60159 28397 0 +ZCorner 60170 28391 0 +ZCorner 60181 28385 0 +ZCorner 60192 28379 0 +ZCorner 60243 28458 0 +ZCorner 60295 28536 0 +ZCorner 60347 28614 0 +ZCorner 60399 28692 0 +ZCorner 60393 28698 0 +ZCorner 60387 28704 0 +ZCorner 60381 28709 0 +ZCorner 60375 28715 0 +ZCorner 60337 28703 0 +ZCorner 60298 28697 0 +ZCorner 60258 28694 0 +ZCorner 60215 28696 0 +ZCorner 60209 28687 0 +ZCorner 60204 28678 0 +ZCorner 60198 28669 0 +ZCorner 60192 28661 0 +ZCorner 60219 28659 0 +ZCorner 60247 28657 0 +ZCorner 60274 28655 0 +ZCorner 60301 28653 0 +ZCorner 60298 28647 0 +ZCorner 60295 28641 0 +ZCorner 60292 28635 0 +ZCorner 60290 28629 0 +ZCorner 60254 28573 0 +ZCorner 60219 28516 0 +ZCorner 60184 28459 0 +ZCorner 60149 28403 1 +$POLYSCORNERS +60375 28715 0 0 +60381 28709 0 0 +60387 28704 0 0 +60399 28692 0 0 +60243 28458 0 0 +60192 28379 0 0 +60159 28397 0 0 +60149 28403 0 0 +60184 28459 0 0 +60254 28573 0 0 +60290 28629 0 0 +60292 28635 0 0 +60301 28653 0 0 +60247 28657 0 0 +60219 28659 0 0 +60192 28661 0 0 +60198 28669 0 0 +60204 28678 0 0 +60209 28687 0 0 +60215 28696 0 0 +60258 28694 0 0 +60298 28697 0 0 +60337 28703 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660022 0 "" +ZLayer 20 +ZAux 82 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 58665 28887 0 +ZCorner 58668 28883 0 +ZCorner 58672 28879 0 +ZCorner 58676 28875 0 +ZCorner 58680 28871 0 +ZCorner 58694 28867 0 +ZCorner 58708 28862 0 +ZCorner 58721 28857 0 +ZCorner 58735 28852 0 +ZCorner 58744 28852 0 +ZCorner 58753 28852 0 +ZCorner 58761 28852 0 +ZCorner 58770 28852 0 +ZCorner 58782 28857 0 +ZCorner 58794 28862 0 +ZCorner 58805 28867 0 +ZCorner 58817 28871 0 +ZCorner 58828 28883 0 +ZCorner 58839 28895 0 +ZCorner 58849 28907 0 +ZCorner 58860 28918 0 +ZCorner 58887 29050 0 +ZCorner 58886 29148 0 +ZCorner 58858 29212 0 +ZCorner 58801 29242 0 +ZCorner 58709 29237 0 +ZCorner 58649 29190 0 +ZCorner 58620 29102 0 +ZCorner 58622 28973 0 +ZCorner 58623 28970 0 +ZCorner 58624 28967 0 +ZCorner 58625 28964 0 +ZCorner 58626 28961 0 +ZCorner 58626 28960 0 +ZCorner 58626 28959 0 +ZCorner 58626 28958 0 +ZCorner 58626 28957 0 +ZCorner 58636 28940 0 +ZCorner 58645 28922 0 +ZCorner 58655 28905 0 +ZCorner 58665 28887 1 +ZCorner 58786 29207 0 +ZCorner 58794 29201 0 +ZCorner 58803 29194 0 +ZCorner 58812 29187 0 +ZCorner 58821 29180 0 +ZCorner 58823 29175 0 +ZCorner 58825 29170 0 +ZCorner 58827 29165 0 +ZCorner 58829 29161 0 +ZCorner 58830 29149 0 +ZCorner 58831 29137 0 +ZCorner 58832 29125 0 +ZCorner 58833 29114 0 +ZCorner 58833 29112 0 +ZCorner 58833 29110 0 +ZCorner 58833 29108 0 +ZCorner 58833 29106 0 +ZCorner 58833 29103 0 +ZCorner 58834 29100 0 +ZCorner 58835 29097 0 +ZCorner 58836 29094 0 +ZCorner 58825 28987 0 +ZCorner 58801 28919 0 +ZCorner 58766 28889 0 +ZCorner 58719 28899 0 +ZCorner 58689 28931 0 +ZCorner 58674 28981 0 +ZCorner 58674 29048 0 +ZCorner 58688 29133 0 +ZCorner 58694 29147 0 +ZCorner 58700 29161 0 +ZCorner 58706 29174 0 +ZCorner 58711 29188 0 +ZCorner 58715 29190 0 +ZCorner 58719 29192 0 +ZCorner 58723 29194 0 +ZCorner 58727 29196 0 +ZCorner 58742 29199 0 +ZCorner 58756 29202 0 +ZCorner 58771 29204 0 +ZCorner 58786 29207 1 +$POLYSCORNERS +58801 29242 0 0 +58858 29212 0 0 +58886 29148 0 0 +58887 29050 0 0 +58860 28918 0 0 +58849 28907 0 0 +58839 28895 0 0 +58817 28871 0 0 +58805 28867 0 0 +58794 28862 0 0 +58770 28852 0 0 +58735 28852 0 0 +58721 28857 0 0 +58708 28862 0 0 +58694 28867 0 0 +58680 28871 0 0 +58668 28883 0 0 +58665 28887 0 0 +58655 28905 0 0 +58645 28922 0 0 +58636 28940 0 0 +58626 28957 0 0 +58626 28961 0 0 +58622 28973 0 0 +58620 29102 0 0 +58649 29190 0 0 +58709 29237 0 0 +58786 29241 0 0 +58786 29207 0 0 +58771 29204 0 0 +58756 29202 0 0 +58742 29199 0 0 +58727 29196 0 0 +58711 29188 0 0 +58706 29174 0 0 +58700 29161 0 0 +58688 29133 0 0 +58674 29048 0 0 +58674 28981 0 0 +58689 28931 0 0 +58719 28899 0 0 +58766 28889 0 0 +58801 28919 0 0 +58825 28987 0 0 +58836 29094 0 0 +58833 29103 0 0 +58833 29114 0 0 +58832 29125 0 0 +58829 29161 0 0 +58827 29165 0 0 +58821 29180 0 0 +58794 29201 0 0 +58786 29207 0 0 +58786 29241 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E660023 0 "" +ZLayer 20 +ZAux 62 E +ZClearance 80 T +ZMinThickness 60 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 59524 22541 0 +ZCorner 59524 22540 0 +ZCorner 59524 22539 0 +ZCorner 59524 22538 0 +ZCorner 59524 22537 0 +ZCorner 59525 22529 0 +ZCorner 59526 22521 0 +ZCorner 59527 22513 0 +ZCorner 59528 22506 0 +ZCorner 59534 22475 0 +ZCorner 59541 22445 0 +ZCorner 59548 22415 0 +ZCorner 59555 22385 0 +ZCorner 59606 22305 0 +ZCorner 59664 22267 0 +ZCorner 59730 22270 0 +ZCorner 59805 22314 0 +ZCorner 59826 22360 0 +ZCorner 59825 22422 0 +ZCorner 59801 22499 0 +ZCorner 59754 22592 0 +ZCorner 59676 22638 0 +ZCorner 59611 22645 0 +ZCorner 59560 22612 0 +ZCorner 59524 22541 1 +ZCorner 59621 22385 0 +ZCorner 59621 22385 0 +ZCorner 59621 22386 0 +ZCorner 59621 22387 0 +ZCorner 59621 22388 0 +ZCorner 59588 22465 0 +ZCorner 59575 22527 0 +ZCorner 59583 22572 0 +ZCorner 59614 22603 0 +ZCorner 59660 22607 0 +ZCorner 59702 22577 0 +ZCorner 59738 22513 0 +ZCorner 59770 22416 0 +ZCorner 59771 22408 0 +ZCorner 59772 22400 0 +ZCorner 59773 22392 0 +ZCorner 59774 22385 0 +ZCorner 59745 22329 0 +ZCorner 59712 22308 0 +ZCorner 59673 22321 0 +ZCorner 59629 22369 0 +ZCorner 59628 22370 0 +ZCorner 59627 22371 0 +ZCorner 59626 22372 0 +ZCorner 59625 22373 0 +ZCorner 59624 22375 0 +ZCorner 59623 22377 0 +ZCorner 59622 22379 0 +ZCorner 59621 22381 0 +ZCorner 59621 22382 0 +ZCorner 59621 22383 0 +ZCorner 59621 22384 0 +ZCorner 59621 22385 0 +ZCorner 59621 22385 0 +ZCorner 59621 22385 0 +ZCorner 59621 22385 0 +ZCorner 59621 22385 1 +$POLYSCORNERS +59611 22645 0 0 +59660 22639 0 0 +59660 22607 0 0 +59614 22603 0 0 +59583 22572 0 0 +59575 22527 0 0 +59588 22465 0 0 +59621 22388 0 0 +59621 22381 0 0 +59625 22373 0 0 +59629 22369 0 0 +59673 22321 0 0 +59712 22308 0 0 +59745 22329 0 0 +59774 22385 0 0 +59773 22392 0 0 +59770 22416 0 0 +59738 22513 0 0 +59702 22577 0 0 +59660 22607 0 0 +59660 22639 0 0 +59676 22638 0 0 +59754 22592 0 0 +59801 22499 0 0 +59825 22422 0 0 +59826 22360 0 0 +59805 22314 0 0 +59730 22270 0 0 +59664 22267 0 0 +59606 22305 0 0 +59555 22385 0 0 +59534 22475 0 0 +59528 22506 0 0 +59527 22513 0 0 +59524 22537 0 0 +59524 22541 0 0 +59560 22612 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E63E176 0 "" +ZLayer 21 +ZAux 26 E +ZClearance 100 T +ZMinThickness 100 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 48804 23098 0 +ZCorner 48804 23838 0 +ZCorner 49190 23838 0 +ZCorner 49190 24582 0 +ZCorner 48804 24582 0 +ZCorner 48804 27097 0 +ZCorner 48816 27458 0 +ZCorner 48851 27614 0 +ZCorner 48975 27654 0 +ZCorner 49250 27667 0 +ZCorner 49250 28425 0 +ZCorner 48673 28425 0 +ZCorner 48254 28415 0 +ZCorner 47975 28384 0 +ZCorner 47778 28317 0 +ZCorner 47607 28196 0 +ZCorner 47477 28039 0 +ZCorner 47408 27860 0 +ZCorner 47379 27542 0 +ZCorner 47369 26969 0 +ZCorner 47369 24582 0 +ZCorner 47061 24582 0 +ZCorner 47061 23838 0 +ZCorner 47369 23838 0 +ZCorner 47369 23098 0 +ZCorner 48804 23098 1 +$POLYSCORNERS +49250 28425 0 0 +49250 27667 0 0 +48975 27654 0 0 +48851 27614 0 0 +48816 27458 0 0 +48804 27097 0 0 +48804 24582 0 0 +49190 24582 0 0 +49190 23838 0 0 +48804 23838 0 0 +48804 23098 0 0 +47369 23098 0 0 +47369 23838 0 0 +47061 23838 0 0 +47061 24582 0 0 +47369 24582 0 0 +47369 26969 0 0 +47379 27542 0 0 +47408 27860 0 0 +47477 28039 0 0 +47607 28196 0 0 +47778 28317 0 0 +47975 28384 0 0 +48254 28415 0 0 +48673 28425 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E63E177 0 "" +ZLayer 21 +ZAux 58 E +ZClearance 100 T +ZMinThickness 100 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 52624 25376 0 +ZCorner 52624 25951 0 +ZCorner 52624 26526 0 +ZCorner 52608 27076 0 +ZCorner 52560 27456 0 +ZCorner 52460 27742 0 +ZCorner 52288 28009 0 +ZCorner 52049 28232 0 +ZCorner 51751 28387 0 +ZCorner 51399 28479 0 +ZCorner 50999 28510 0 +ZCorner 50561 28484 0 +ZCorner 50195 28405 0 +ZCorner 49902 28274 0 +ZCorner 49683 28090 0 +ZCorner 49527 27857 0 +ZCorner 49423 27580 0 +ZCorner 49364 27206 0 +ZCorner 49345 26682 0 +ZCorner 49345 26080 0 +ZCorner 49345 25478 0 +ZCorner 49380 24895 0 +ZCorner 49486 24455 0 +ZCorner 49685 24123 0 +ZCorner 49996 23864 0 +ZCorner 50416 23696 0 +ZCorner 50938 23640 0 +ZCorner 51386 23676 0 +ZCorner 51765 23784 0 +ZCorner 52071 23949 0 +ZCorner 52298 24157 0 +ZCorner 52457 24391 0 +ZCorner 52555 24632 0 +ZCorner 52607 24940 0 +ZCorner 52624 25376 1 +ZCorner 51193 25021 0 +ZCorner 51184 24727 0 +ZCorner 51155 24566 0 +ZCorner 51094 24496 0 +ZCorner 50988 24472 0 +ZCorner 50882 24496 0 +ZCorner 50818 24566 0 +ZCorner 50786 24727 0 +ZCorner 50776 25021 0 +ZCorner 50776 26082 0 +ZCorner 50776 27143 0 +ZCorner 50786 27418 0 +ZCorner 50818 27576 0 +ZCorner 50881 27652 0 +ZCorner 50985 27677 0 +ZCorner 51090 27654 0 +ZCorner 51153 27585 0 +ZCorner 51183 27440 0 +ZCorner 51194 27189 0 +ZCorner 51194 26105 0 +ZCorner 51194 25021 0 +ZCorner 51194 25021 0 +ZCorner 51193 25021 1 +$POLYSCORNERS +50999 28510 0 0 +51399 28479 0 0 +51751 28387 0 0 +52049 28232 0 0 +52288 28009 0 0 +52460 27742 0 0 +52560 27456 0 0 +52608 27076 0 0 +52624 26526 0 0 +52624 25376 0 0 +52607 24940 0 0 +52555 24632 0 0 +52457 24391 0 0 +52298 24157 0 0 +52071 23949 0 0 +51765 23784 0 0 +51386 23676 0 0 +50938 23640 0 0 +50416 23696 0 0 +49996 23864 0 0 +49685 24123 0 0 +49486 24455 0 0 +49380 24895 0 0 +49345 25478 0 0 +49345 26682 0 0 +49364 27206 0 0 +49423 27580 0 0 +49527 27857 0 0 +49683 28090 0 0 +49902 28274 0 0 +50195 28405 0 0 +50561 28484 0 0 +50985 28509 0 0 +50985 27677 0 0 +50881 27652 0 0 +50818 27576 0 0 +50786 27418 0 0 +50776 27143 0 0 +50776 25021 0 0 +50786 24727 0 0 +50818 24566 0 0 +50882 24496 0 0 +50988 24472 0 0 +51094 24496 0 0 +51155 24566 0 0 +51184 24727 0 0 +51193 25021 0 0 +51194 25021 0 0 +51194 27189 0 0 +51183 27440 0 0 +51153 27585 0 0 +51090 27654 0 0 +50985 27677 0 0 +50985 28509 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E63E178 0 "" +ZLayer 21 +ZAux 56 E +ZClearance 100 T +ZMinThickness 100 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 56332 25376 0 +ZCorner 56332 25951 0 +ZCorner 56332 26526 0 +ZCorner 56316 27076 0 +ZCorner 56268 27456 0 +ZCorner 56168 27742 0 +ZCorner 55996 28009 0 +ZCorner 55757 28232 0 +ZCorner 55459 28387 0 +ZCorner 55107 28479 0 +ZCorner 54707 28510 0 +ZCorner 54268 28484 0 +ZCorner 53903 28405 0 +ZCorner 53610 28274 0 +ZCorner 53391 28090 0 +ZCorner 53235 27857 0 +ZCorner 53131 27580 0 +ZCorner 53072 27206 0 +ZCorner 53053 26682 0 +ZCorner 53053 26080 0 +ZCorner 53053 25478 0 +ZCorner 53088 24895 0 +ZCorner 53194 24455 0 +ZCorner 53393 24123 0 +ZCorner 53704 23864 0 +ZCorner 54124 23696 0 +ZCorner 54646 23640 0 +ZCorner 55094 23676 0 +ZCorner 55473 23784 0 +ZCorner 55779 23949 0 +ZCorner 56006 24157 0 +ZCorner 56164 24391 0 +ZCorner 56263 24632 0 +ZCorner 56315 24940 0 +ZCorner 56332 25376 1 +ZCorner 54901 25021 0 +ZCorner 54892 24727 0 +ZCorner 54862 24566 0 +ZCorner 54801 24496 0 +ZCorner 54696 24472 0 +ZCorner 54590 24496 0 +ZCorner 54526 24566 0 +ZCorner 54494 24727 0 +ZCorner 54483 25021 0 +ZCorner 54483 26082 0 +ZCorner 54483 27143 0 +ZCorner 54494 27418 0 +ZCorner 54526 27576 0 +ZCorner 54589 27652 0 +ZCorner 54692 27677 0 +ZCorner 54798 27654 0 +ZCorner 54861 27585 0 +ZCorner 54891 27440 0 +ZCorner 54901 27189 0 +ZCorner 54901 26105 0 +ZCorner 54901 25021 1 +$POLYSCORNERS +54707 28510 0 0 +55107 28479 0 0 +55459 28387 0 0 +55757 28232 0 0 +55996 28009 0 0 +56168 27742 0 0 +56268 27456 0 0 +56316 27076 0 0 +56332 26526 0 0 +56332 25376 0 0 +56315 24940 0 0 +56263 24632 0 0 +56164 24391 0 0 +56006 24157 0 0 +55779 23949 0 0 +55473 23784 0 0 +55094 23676 0 0 +54646 23640 0 0 +54124 23696 0 0 +53704 23864 0 0 +53393 24123 0 0 +53194 24455 0 0 +53088 24895 0 0 +53053 25478 0 0 +53053 26682 0 0 +53072 27206 0 0 +53131 27580 0 0 +53235 27857 0 0 +53391 28090 0 0 +53610 28274 0 0 +53903 28405 0 0 +54268 28484 0 0 +54692 28509 0 0 +54692 27677 0 0 +54589 27652 0 0 +54526 27576 0 0 +54494 27418 0 0 +54483 27143 0 0 +54483 25021 0 0 +54494 24727 0 0 +54526 24566 0 0 +54590 24496 0 0 +54696 24472 0 0 +54801 24496 0 0 +54862 24566 0 0 +54892 24727 0 0 +54901 25021 0 0 +54901 27189 0 0 +54891 27440 0 0 +54861 27585 0 0 +54798 27654 0 0 +54692 27677 0 0 +54692 28509 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E63E179 0 "" +ZLayer 21 +ZAux 17 E +ZClearance 100 T +ZMinThickness 100 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 58984 23725 0 +ZCorner 58984 28425 0 +ZCorner 57553 28425 0 +ZCorner 57553 26569 0 +ZCorner 57511 25696 0 +ZCorner 57432 25527 0 +ZCorner 57284 25400 0 +ZCorner 57048 25321 0 +ZCorner 56707 25294 0 +ZCorner 56707 23640 0 +ZCorner 56985 23699 0 +ZCorner 57228 23836 0 +ZCorner 57436 24050 0 +ZCorner 57610 24343 0 +ZCorner 57553 23725 0 +ZCorner 58984 23725 0 +ZCorner 58984 23725 1 +$POLYSCORNERS +58984 28425 0 0 +58984 23725 0 0 +57553 23725 0 0 +57610 24343 0 0 +57436 24050 0 0 +57228 23836 0 0 +56985 23699 0 0 +56707 23640 0 0 +56707 25294 0 0 +57048 25321 0 0 +57284 25400 0 0 +57432 25527 0 0 +57511 25696 0 0 +57553 26569 0 0 +57553 28425 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E63E17A 0 "" +ZLayer 21 +ZAux 49 E +ZClearance 100 T +ZMinThickness 100 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 62562 25499 0 +ZCorner 61212 25499 0 +ZCorner 61212 24958 0 +ZCorner 61201 24720 0 +ZCorner 61166 24573 0 +ZCorner 61101 24498 0 +ZCorner 60996 24472 0 +ZCorner 60893 24495 0 +ZCorner 60830 24561 0 +ZCorner 60798 24705 0 +ZCorner 60787 24958 0 +ZCorner 60787 27174 0 +ZCorner 60803 27395 0 +ZCorner 60851 27552 0 +ZCorner 60930 27646 0 +ZCorner 61038 27677 0 +ZCorner 61160 27645 0 +ZCorner 61235 27546 0 +ZCorner 61274 27357 0 +ZCorner 61286 27051 0 +ZCorner 61286 26491 0 +ZCorner 62561 26491 0 +ZCorner 62549 26984 0 +ZCorner 62520 27336 0 +ZCorner 62443 27621 0 +ZCorner 62283 27913 0 +ZCorner 62053 28172 0 +ZCorner 61761 28359 0 +ZCorner 61401 28472 0 +ZCorner 60964 28509 0 +ZCorner 60422 28458 0 +ZCorner 60005 28302 0 +ZCorner 59702 28054 0 +ZCorner 59503 27721 0 +ZCorner 59393 27270 0 +ZCorner 59356 26661 0 +ZCorner 59356 25326 0 +ZCorner 59386 24801 0 +ZCorner 59477 24423 0 +ZCorner 59665 24135 0 +ZCorner 59990 23879 0 +ZCorner 60426 23700 0 +ZCorner 60946 23640 0 +ZCorner 61465 23699 0 +ZCorner 61902 23877 0 +ZCorner 62233 24146 0 +ZCorner 62430 24476 0 +ZCorner 62529 24912 0 +ZCorner 62562 25499 1 +$POLYSCORNERS +60964 28509 0 0 +61401 28472 0 0 +61761 28359 0 0 +62053 28172 0 0 +62283 27913 0 0 +62443 27621 0 0 +62520 27336 0 0 +62549 26984 0 0 +62561 26491 0 0 +61286 26491 0 0 +61286 27051 0 0 +61274 27357 0 0 +61235 27546 0 0 +61160 27645 0 0 +61038 27677 0 0 +60930 27646 0 0 +60851 27552 0 0 +60803 27395 0 0 +60787 27174 0 0 +60787 24958 0 0 +60798 24705 0 0 +60830 24561 0 0 +60893 24495 0 0 +60996 24472 0 0 +61101 24498 0 0 +61166 24573 0 0 +61201 24720 0 0 +61212 24958 0 0 +61212 25499 0 0 +62562 25499 0 0 +62529 24912 0 0 +62430 24476 0 0 +62233 24146 0 0 +61902 23877 0 0 +61465 23699 0 0 +60946 23640 0 0 +60426 23700 0 0 +59990 23879 0 0 +59665 24135 0 0 +59477 24423 0 0 +59386 24801 0 0 +59356 25326 0 0 +59356 26661 0 0 +59393 27270 0 0 +59503 27721 0 0 +59702 28054 0 0 +60005 28302 0 0 +60422 28458 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E63E17B 0 "" +ZLayer 21 +ZAux 56 E +ZClearance 100 T +ZMinThickness 100 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 66106 25376 0 +ZCorner 66106 25951 0 +ZCorner 66106 26526 0 +ZCorner 66090 27076 0 +ZCorner 66042 27456 0 +ZCorner 65942 27742 0 +ZCorner 65770 28009 0 +ZCorner 65531 28232 0 +ZCorner 65233 28387 0 +ZCorner 64881 28479 0 +ZCorner 64480 28510 0 +ZCorner 64042 28484 0 +ZCorner 63676 28405 0 +ZCorner 63384 28274 0 +ZCorner 63165 28090 0 +ZCorner 63008 27857 0 +ZCorner 62904 27580 0 +ZCorner 62846 27206 0 +ZCorner 62826 26682 0 +ZCorner 62826 26080 0 +ZCorner 62826 25478 0 +ZCorner 62862 24895 0 +ZCorner 62968 24455 0 +ZCorner 63166 24123 0 +ZCorner 63478 23864 0 +ZCorner 63898 23696 0 +ZCorner 64420 23640 0 +ZCorner 64868 23676 0 +ZCorner 65247 23784 0 +ZCorner 65553 23949 0 +ZCorner 65780 24157 0 +ZCorner 65938 24391 0 +ZCorner 66036 24632 0 +ZCorner 66088 24940 0 +ZCorner 66106 25376 1 +ZCorner 64675 25021 0 +ZCorner 64666 24727 0 +ZCorner 64636 24566 0 +ZCorner 64575 24496 0 +ZCorner 64469 24472 0 +ZCorner 64364 24496 0 +ZCorner 64299 24566 0 +ZCorner 64268 24727 0 +ZCorner 64257 25021 0 +ZCorner 64257 26082 0 +ZCorner 64257 27143 0 +ZCorner 64268 27418 0 +ZCorner 64299 27576 0 +ZCorner 64363 27652 0 +ZCorner 64466 27677 0 +ZCorner 64572 27654 0 +ZCorner 64634 27585 0 +ZCorner 64665 27440 0 +ZCorner 64675 27189 0 +ZCorner 64675 26105 0 +ZCorner 64675 25021 1 +$POLYSCORNERS +64480 28510 0 0 +64881 28479 0 0 +65233 28387 0 0 +65531 28232 0 0 +65770 28009 0 0 +65942 27742 0 0 +66042 27456 0 0 +66090 27076 0 0 +66106 26526 0 0 +66106 25376 0 0 +66088 24940 0 0 +66036 24632 0 0 +65938 24391 0 0 +65780 24157 0 0 +65553 23949 0 0 +65247 23784 0 0 +64868 23676 0 0 +64420 23640 0 0 +63898 23696 0 0 +63478 23864 0 0 +63166 24123 0 0 +62968 24455 0 0 +62862 24895 0 0 +62826 25478 0 0 +62826 26682 0 0 +62846 27206 0 0 +62904 27580 0 0 +63008 27857 0 0 +63165 28090 0 0 +63384 28274 0 0 +63676 28405 0 0 +64042 28484 0 0 +64466 28509 0 0 +64466 27677 0 0 +64363 27652 0 0 +64299 27576 0 0 +64268 27418 0 0 +64257 27143 0 0 +64257 25021 0 0 +64268 24727 0 0 +64299 24566 0 0 +64364 24496 0 0 +64469 24472 0 0 +64575 24496 0 0 +64636 24566 0 0 +64666 24727 0 0 +64675 25021 0 0 +64675 27189 0 0 +64665 27440 0 0 +64634 27585 0 0 +64572 27654 0 0 +64466 27677 0 0 +64466 28509 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$CZONE_OUTLINE +ZInfo 4E63E17C 0 "" +ZLayer 21 +ZAux 27 E +ZClearance 100 T +ZMinThickness 100 +ZOptions 0 16 F 200 200 +ZSmoothing 0 0 +ZCorner 68032 23725 0 +ZCorner 68008 24158 0 +ZCorner 68181 23932 0 +ZCorner 68388 23770 0 +ZCorner 68630 23673 0 +ZCorner 68907 23640 0 +ZCorner 69242 23684 0 +ZCorner 69509 23814 0 +ZCorner 69701 24010 0 +ZCorner 69810 24251 0 +ZCorner 69861 24603 0 +ZCorner 69877 25131 0 +ZCorner 69877 28425 0 +ZCorner 68447 28425 0 +ZCorner 68447 25170 0 +ZCorner 68439 24780 0 +ZCorner 68415 24579 0 +ZCorner 68355 24499 0 +ZCorner 68238 24472 0 +ZCorner 68114 24503 0 +ZCorner 68047 24595 0 +ZCorner 68017 24819 0 +ZCorner 68008 25248 0 +ZCorner 68008 28425 0 +ZCorner 66577 28425 0 +ZCorner 66577 23725 0 +ZCorner 68032 23725 1 +$POLYSCORNERS +69877 28425 0 0 +69877 25131 0 0 +69861 24603 0 0 +69810 24251 0 0 +69701 24010 0 0 +69509 23814 0 0 +69242 23684 0 0 +68907 23640 0 0 +68630 23673 0 0 +68388 23770 0 0 +68181 23932 0 0 +68008 24158 0 0 +68032 23725 0 0 +66577 23725 0 0 +66577 28425 0 0 +68008 28425 0 0 +68008 25248 0 0 +68017 24819 0 0 +68047 24595 0 0 +68114 24503 0 0 +68238 24472 0 0 +68355 24499 0 0 +68415 24579 0 0 +68439 24780 0 0 +68447 25170 0 0 +68447 28425 1 0 +$endPOLYSCORNERS +$endCZONE_OUTLINE +$EndBOARD From 09c2eee91e619d094ebb79acbd93f16da57ae9f9 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Tue, 13 Oct 2015 07:57:58 +0200 Subject: [PATCH 040/205] Support for Metal language --- lib/linguist/languages.yml | 8 ++ samples/Metal/ITMVisualisationEngine.metal | 99 ++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 samples/Metal/ITMVisualisationEngine.metal diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 420965c4..90a2959c 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2063,6 +2063,14 @@ Mercury: tm_scope: source.mercury ace_mode: prolog +Metal: + type: programming + color: "#8f14e9" + extensions: + - .metal + tm_scope: source.c++ + ace_mode: c_cpp + MiniD: # Legacy type: programming searchable: false diff --git a/samples/Metal/ITMVisualisationEngine.metal b/samples/Metal/ITMVisualisationEngine.metal new file mode 100644 index 00000000..a1372178 --- /dev/null +++ b/samples/Metal/ITMVisualisationEngine.metal @@ -0,0 +1,99 @@ +// Copyright 2014 Isis Innovation Limited and the authors of InfiniTAM + +#include + +#include "../../DeviceAgnostic/ITMSceneReconstructionEngine.h" +#include "../../DeviceAgnostic/ITMVisualisationEngine.h" +#include "ITMVisualisationEngine_Metal.h" + +using namespace metal; + +kernel void genericRaycastVH_device(DEVICEPTR(Vector4f) *pointsRay [[ buffer(0) ]], + const CONSTPTR(ITMVoxel) *voxelData [[ buffer(1) ]], + const CONSTPTR(typename ITMVoxelIndex::IndexData) *voxelIndex [[ buffer(2) ]], + const CONSTPTR(Vector2f) *minmaxdata [[ buffer(3) ]], + const CONSTPTR(CreateICPMaps_Params) *params [[ buffer(4) ]], + uint2 threadIdx [[ thread_position_in_threadgroup ]], + uint2 blockIdx [[ threadgroup_position_in_grid ]], + uint2 blockDim [[ threads_per_threadgroup ]]) +{ + int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y; + + if (x >= params->imgSize.x || y >= params->imgSize.y) return; + + int locId = x + y * params->imgSize.x; + int locId2 = (int)floor((float)x / minmaximg_subsample) + (int)floor((float)y / minmaximg_subsample) * params->imgSize.x; + + castRay(pointsRay[locId], x, y, voxelData, voxelIndex, params->invM, params->invProjParams, + params->voxelSizes.y, params->lightSource.w, minmaxdata[locId2]); +} + +kernel void genericRaycastVGMissingPoints_device(DEVICEPTR(Vector4f) *forwardProjection [[ buffer(0) ]], + const CONSTPTR(int) *fwdProjMissingPoints [[ buffer(1) ]], + const CONSTPTR(ITMVoxel) *voxelData [[ buffer(2) ]], + const CONSTPTR(typename ITMVoxelIndex::IndexData) *voxelIndex [[ buffer(3) ]], + const CONSTPTR(Vector2f) *minmaxdata [[ buffer(4) ]], + const CONSTPTR(CreateICPMaps_Params) *params [[ buffer(5) ]], + uint2 threadIdx [[ thread_position_in_threadgroup ]], + uint2 blockIdx [[ threadgroup_position_in_grid ]], + uint2 blockDim [[ threads_per_threadgroup ]]) +{ + int pointId = threadIdx.x + blockIdx.x * blockDim.x; + + if (pointId >= params->imgSize.z) return; + + int locId = fwdProjMissingPoints[pointId]; + int y = locId / params->imgSize.x, x = locId - y * params->imgSize.x; + int locId2 = (int)floor((float)x / minmaximg_subsample) + (int)floor((float)y / minmaximg_subsample) * params->imgSize.x; + + castRay(forwardProjection[locId], x, y, voxelData, voxelIndex, params->invM, params->invProjParams, + params->voxelSizes.y, params->lightSource.w, minmaxdata[locId2]); +} + +kernel void renderICP_device(const CONSTPTR(Vector4f) *pointsRay [[ buffer(0) ]], + DEVICEPTR(Vector4f) *pointsMap [[ buffer(1) ]], + DEVICEPTR(Vector4f) *normalsMap [[ buffer(2) ]], + DEVICEPTR(Vector4u) *outRendering [[ buffer(3) ]], + const CONSTPTR(CreateICPMaps_Params) *params [[ buffer(4) ]], + uint2 threadIdx [[ thread_position_in_threadgroup ]], + uint2 blockIdx [[ threadgroup_position_in_grid ]], + uint2 blockDim [[ threads_per_threadgroup ]]) +{ + int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y; + + if (x >= params->imgSize.x || y >= params->imgSize.y) return; + + processPixelICP(outRendering, pointsMap, normalsMap, pointsRay, params->imgSize.xy, x, y, params->voxelSizes.x, TO_VECTOR3(params->lightSource)); +} + +kernel void renderForward_device(DEVICEPTR(Vector4u) *outRendering [[ buffer(0) ]], + const CONSTPTR(Vector4f) *pointsRay [[ buffer(1) ]], + const CONSTPTR(CreateICPMaps_Params) *params [[ buffer(2) ]], + uint2 threadIdx [[ thread_position_in_threadgroup ]], + uint2 blockIdx [[ threadgroup_position_in_grid ]], + uint2 blockDim [[ threads_per_threadgroup ]]) +{ + int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y; + + if (x >= params->imgSize.x || y >= params->imgSize.y) return; + + processPixelForwardRender(outRendering, pointsRay, params->imgSize.xy, x, y, params->voxelSizes.x, TO_VECTOR3(params->lightSource)); +} + +kernel void forwardProject_device(DEVICEPTR(Vector4f) *forwardProjection [[ buffer(0) ]], + const CONSTPTR(Vector4f) *pointsRay [[ buffer(1) ]], + const CONSTPTR(CreateICPMaps_Params) *params [[ buffer(2) ]], + uint2 threadIdx [[ thread_position_in_threadgroup ]], + uint2 blockIdx [[ threadgroup_position_in_grid ]], + uint2 blockDim [[ threads_per_threadgroup ]]) +{ + int x = (threadIdx.x + blockIdx.x * blockDim.x), y = (threadIdx.y + blockIdx.y * blockDim.y); + + if (x >= params->imgSize.x || y >= params->imgSize.y) return; + + int locId = x + y * params->imgSize.x; + Vector4f pixel = pointsRay[locId]; + + int locId_new = forwardProjectPixel(pixel * params->voxelSizes.x, params->M, params->projParams, params->imgSize.xy); + if (locId_new >= 0) forwardProjection[locId_new] = pixel; +} \ No newline at end of file From 1f1416a5f7ed42cf752cd67d13cf674a2b42397e Mon Sep 17 00:00:00 2001 From: edendramis Date: Thu, 15 Oct 2015 14:15:27 -0700 Subject: [PATCH 041/205] adding freemarker grammar --- .gitmodules | 3 +++ vendor/grammars/FreeMarker.tmbundle | 1 + 2 files changed, 4 insertions(+) create mode 160000 vendor/grammars/FreeMarker.tmbundle diff --git a/.gitmodules b/.gitmodules index 941dc61a..be2d7b30 100644 --- a/.gitmodules +++ b/.gitmodules @@ -680,3 +680,6 @@ [submodule "vendor/grammars/Stata.tmbundle"] path = vendor/grammars/Stata.tmbundle url = https://github.com/pschumm/Stata.tmbundle +[submodule "vendor/grammars/FreeMarker.tmbundle"] + path = vendor/grammars/FreeMarker.tmbundle + url = https://github.com/freemarker/FreeMarker.tmbundle diff --git a/vendor/grammars/FreeMarker.tmbundle b/vendor/grammars/FreeMarker.tmbundle new file mode 160000 index 00000000..6b7b880c --- /dev/null +++ b/vendor/grammars/FreeMarker.tmbundle @@ -0,0 +1 @@ +Subproject commit 6b7b880c533626b8e943ed686007c06771da3b42 From 11e3251efd66a3611c19ec664a46e022844d7bbf Mon Sep 17 00:00:00 2001 From: edendramis Date: Thu, 15 Oct 2015 14:43:02 -0700 Subject: [PATCH 042/205] adding samples --- samples/FreeMarker/example.ftl | 30 ++++++++++++++++++++++++++++++ samples/FreeMarker/layout.ftl | 12 ++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 samples/FreeMarker/example.ftl create mode 100644 samples/FreeMarker/layout.ftl diff --git a/samples/FreeMarker/example.ftl b/samples/FreeMarker/example.ftl new file mode 100644 index 00000000..c322b851 --- /dev/null +++ b/samples/FreeMarker/example.ftl @@ -0,0 +1,30 @@ +<#import "layout.ftl" as layout> + +<#assign results = [ + { + "title": "Example Result", + "description": "Lorem ipsum dolor sit amet, pede id pellentesque, sollicitudin turpis sed in sed sed, libero dictum." + } + ] /> + +<@layout.page title="FreeMarker Example"> + <#if results?size == 0> + There were no results. + <#else> +
    + <#list results as result> +
  • + ${result.title} +

    ${result.description}

    +
  • + +
+ + + <@currentTime /> + + + +<#macro currentTime> + ${.now?string.full} + diff --git a/samples/FreeMarker/layout.ftl b/samples/FreeMarker/layout.ftl new file mode 100644 index 00000000..cd7f554d --- /dev/null +++ b/samples/FreeMarker/layout.ftl @@ -0,0 +1,12 @@ +<#macro page title> + + + + + ${title} + + + <#nested /> + + + From 0f204767a943fb445694e450d365dfa3fd186a16 Mon Sep 17 00:00:00 2001 From: edendramis Date: Thu, 15 Oct 2015 14:48:20 -0700 Subject: [PATCH 043/205] updating examples --- samples/FreeMarker/example.ftl | 1 + samples/FreeMarker/layout.ftl | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/samples/FreeMarker/example.ftl b/samples/FreeMarker/example.ftl index c322b851..10a6ee95 100644 --- a/samples/FreeMarker/example.ftl +++ b/samples/FreeMarker/example.ftl @@ -21,6 +21,7 @@ + <#-- This is a FreeMarker comment --> <@currentTime /> diff --git a/samples/FreeMarker/layout.ftl b/samples/FreeMarker/layout.ftl index cd7f554d..18512dd6 100644 --- a/samples/FreeMarker/layout.ftl +++ b/samples/FreeMarker/layout.ftl @@ -1,12 +1,32 @@ +<#ftl strip_text=true /> + <#macro page title> - + - ${title} + <@metaTags /> <#nested /> + <@footer /> + + +<#--- + Default meta tags +--> +<#macro metaTags> + <#compress> + + + + + + + +<#macro footer> +

This page is using FreeMarker v${.version}

+ From 9e3cc01715e3349f56c645888a635b005a3e7239 Mon Sep 17 00:00:00 2001 From: edendramis Date: Fri, 16 Oct 2015 09:54:17 -0700 Subject: [PATCH 044/205] adding FreeMarker to grammars.yml --- grammars.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/grammars.yml b/grammars.yml index 4bd66f12..4eee0d23 100644 --- a/grammars.yml +++ b/grammars.yml @@ -42,6 +42,8 @@ vendor/grammars/Docker.tmbundle: - source.dockerfile vendor/grammars/Elm.tmLanguage: - source.elm +vendor/grammars/FreeMarker.tmbundle: +- text.html.ftl vendor/grammars/G-Code/: - source.LS - source.MCPOST From a55a60a161e37795f3490a9885836cefc0c4043b Mon Sep 17 00:00:00 2001 From: Evangelia Dendramis Date: Fri, 16 Oct 2015 18:19:53 -0700 Subject: [PATCH 045/205] removing group and search term --- lib/linguist/languages.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 03b50f2b..d036ac35 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1036,12 +1036,10 @@ Frege: - .fr tm_scope: source.haskell ace_mode: haskell - + FreeMarker: type: programming color: "#0050b2" - group: Java - search_term: ftl aliases: - ftl extensions: From 83f358976e347b63083fc25104a9e2f9dde5f4c3 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 20 Oct 2015 12:33:43 +0100 Subject: [PATCH 046/205] Fixing up some old MemoryBlob references --- lib/linguist/blob.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/linguist/blob.rb b/lib/linguist/blob.rb index 8131d9b8..1be9f0b2 100644 --- a/lib/linguist/blob.rb +++ b/lib/linguist/blob.rb @@ -1,13 +1,13 @@ require 'linguist/blob_helper' module Linguist - # A MemoryBlob is a wrapper around the content of a file to make it quack + # A Blob is a wrapper around the content of a file to make it quack # like a Grit::Blob. It provides the basic interface: `name`, # `data`, `path` and `size`. class Blob include BlobHelper - # Public: Initialize a new MemoryBlob. + # Public: Initialize a new Blob. # # path - A path String (does not necessarily exists on the file system). # content - Content of the file. @@ -22,7 +22,7 @@ module Linguist # # Examples # - # MemoryBlob.new("/path/to/linguist/lib/linguist.rb", "").path + # Blob.new("/path/to/linguist/lib/linguist.rb", "").path # # => "/path/to/linguist/lib/linguist.rb" # # Returns a String From 5d176a781c274bbca36d959652f6e466f2395d21 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 20 Oct 2015 19:24:04 +0100 Subject: [PATCH 047/205] Fixing the build :-\ --- grammars.yml | 1 - lib/linguist/languages.yml | 22 +++++++++---------- .../{index.html.erb => index.html.eex} | 0 vendor/grammars/InnoSetup | 2 +- vendor/grammars/NimLime | 2 +- vendor/grammars/Stylus | 2 +- vendor/grammars/abap.tmbundle | 2 +- vendor/grammars/atom-fsharp | 2 +- vendor/grammars/dart-sublime-bundle | 2 +- vendor/grammars/factor | 2 +- vendor/grammars/haxe-sublime-bundle | 2 +- vendor/grammars/language-babel | 2 +- vendor/grammars/language-clojure | 2 +- vendor/grammars/language-csharp | 2 +- vendor/grammars/language-hy | 2 +- vendor/grammars/language-javascript | 2 +- vendor/grammars/language-python | 2 +- vendor/grammars/language-shellscript | 2 +- vendor/grammars/latex.tmbundle | 2 +- vendor/grammars/nesC.tmbundle | 2 +- vendor/grammars/php.tmbundle | 2 +- vendor/grammars/sublime-rust | 2 +- vendor/grammars/sublime-typescript | 2 +- 23 files changed, 31 insertions(+), 32 deletions(-) rename samples/HTML+EEX/{index.html.erb => index.html.eex} (100%) diff --git a/grammars.yml b/grammars.yml index c2be7632..4eee0d23 100644 --- a/grammars.yml +++ b/grammars.yml @@ -250,7 +250,6 @@ vendor/grammars/elixir-tmbundle: - source.elixir - text.elixir - text.html.elixir -- text.html.eex vendor/grammars/erlang.tmbundle: - source.erlang - text.html.erlang.yaws diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 107dc3d1..c1191dbc 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1029,14 +1029,6 @@ Forth: - .fs ace_mode: forth -Frege: - type: programming - color: "#00cafe" - extensions: - - .fr - tm_scope: source.haskell - ace_mode: haskell - FreeMarker: type: programming color: "#0050b2" @@ -1047,6 +1039,14 @@ FreeMarker: tm_scope: text.html.ftl ace_mode: ftl +Frege: + type: programming + color: "#00cafe" + extensions: + - .fr + tm_scope: source.haskell + ace_mode: haskell + G-code: type: data extensions: @@ -1335,13 +1335,13 @@ HTML+Django: HTML+EEX: type: markup - tm_scope: text.html.eex + tm_scope: text.html.elixir group: HTML aliases: - eex extensions: - .eex - ace_mode: html_eex + ace_mode: text HTML+ERB: type: markup @@ -1352,7 +1352,7 @@ HTML+ERB: extensions: - .erb - .erb.deface - ace_mode: html_ruby + ace_mode: text HTML+PHP: type: markup diff --git a/samples/HTML+EEX/index.html.erb b/samples/HTML+EEX/index.html.eex similarity index 100% rename from samples/HTML+EEX/index.html.erb rename to samples/HTML+EEX/index.html.eex diff --git a/vendor/grammars/InnoSetup b/vendor/grammars/InnoSetup index 9a8fca6c..a7f79fd1 160000 --- a/vendor/grammars/InnoSetup +++ b/vendor/grammars/InnoSetup @@ -1 +1 @@ -Subproject commit 9a8fca6c05a59dcbd90113c06545e45f83a7a075 +Subproject commit a7f79fd1a530adbcfe8f660eb1b9c48dc3bd5ede diff --git a/vendor/grammars/NimLime b/vendor/grammars/NimLime index 50d7344f..51118338 160000 --- a/vendor/grammars/NimLime +++ b/vendor/grammars/NimLime @@ -1 +1 @@ -Subproject commit 50d7344f9b4f50823ac64d14c162982edf8b8056 +Subproject commit 5111833868d63c7a35e6e9f0aa443e0d1832db7a diff --git a/vendor/grammars/Stylus b/vendor/grammars/Stylus index 8b1c77d0..9766d8d9 160000 --- a/vendor/grammars/Stylus +++ b/vendor/grammars/Stylus @@ -1 +1 @@ -Subproject commit 8b1c77d0543d12984ebb872180d942629edc31ac +Subproject commit 9766d8d936a9939dfd11b5d73cb0e9542b2a078f diff --git a/vendor/grammars/abap.tmbundle b/vendor/grammars/abap.tmbundle index e8619c96..8ab33a89 160000 --- a/vendor/grammars/abap.tmbundle +++ b/vendor/grammars/abap.tmbundle @@ -1 +1 @@ -Subproject commit e8619c9692b0ef74e288832660257f6e3477030c +Subproject commit 8ab33a89780139f8ceb37cc412c30cef2f206a49 diff --git a/vendor/grammars/atom-fsharp b/vendor/grammars/atom-fsharp index 053f5dc3..7051d65d 160000 --- a/vendor/grammars/atom-fsharp +++ b/vendor/grammars/atom-fsharp @@ -1 +1 @@ -Subproject commit 053f5dc3abd329369d272afd4cca3114636e0c70 +Subproject commit 7051d65d639ee209533354097a4b31e4f097d37d diff --git a/vendor/grammars/dart-sublime-bundle b/vendor/grammars/dart-sublime-bundle index 2e5295ab..d891fb36 160000 --- a/vendor/grammars/dart-sublime-bundle +++ b/vendor/grammars/dart-sublime-bundle @@ -1 +1 @@ -Subproject commit 2e5295ab32859d12714c8b44516d8a214eb73ecd +Subproject commit d891fb36c98ca0b111a35cba109b05a16b6c4b83 diff --git a/vendor/grammars/factor b/vendor/grammars/factor index 0f387e75..9b5cb445 160000 --- a/vendor/grammars/factor +++ b/vendor/grammars/factor @@ -1 +1 @@ -Subproject commit 0f387e750d4f7a8dca06af95faacdd9482d467d4 +Subproject commit 9b5cb445ee65d70d6b16bd65abb979f932441b93 diff --git a/vendor/grammars/haxe-sublime-bundle b/vendor/grammars/haxe-sublime-bundle index c3b96f1c..94cc8eea 160000 --- a/vendor/grammars/haxe-sublime-bundle +++ b/vendor/grammars/haxe-sublime-bundle @@ -1 +1 @@ -Subproject commit c3b96f1c754ebc91bacc2926412042567fabbb5a +Subproject commit 94cc8eea31127365556ef9bbb1db78ef6bfdd2e5 diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel index b49eb323..44ff68da 160000 --- a/vendor/grammars/language-babel +++ b/vendor/grammars/language-babel @@ -1 +1 @@ -Subproject commit b49eb3238820a00f8034e50b4b632915ce17368d +Subproject commit 44ff68da9ee1df3710513d3b4de21f46ec6d0ed0 diff --git a/vendor/grammars/language-clojure b/vendor/grammars/language-clojure index 6dfdabde..3173abe9 160000 --- a/vendor/grammars/language-clojure +++ b/vendor/grammars/language-clojure @@ -1 +1 @@ -Subproject commit 6dfdabde51699585f1f648bce10012b24befc4a3 +Subproject commit 3173abe9956a597944468fcef7b877b017149d50 diff --git a/vendor/grammars/language-csharp b/vendor/grammars/language-csharp index 4c4dbea3..f635e67e 160000 --- a/vendor/grammars/language-csharp +++ b/vendor/grammars/language-csharp @@ -1 +1 @@ -Subproject commit 4c4dbea32393a32510bb60d95b49633dd09e9e06 +Subproject commit f635e67edef4e2fe68c3526e1ad26ed66f01aa62 diff --git a/vendor/grammars/language-hy b/vendor/grammars/language-hy index f9750744..93d267de 160000 --- a/vendor/grammars/language-hy +++ b/vendor/grammars/language-hy @@ -1 +1 @@ -Subproject commit f9750744ae4b8519314dff7d57abc527b91a0ef2 +Subproject commit 93d267de4cdd8a099f34fb334bae0515a9734cd9 diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript index f7e166b6..9d69b86e 160000 --- a/vendor/grammars/language-javascript +++ b/vendor/grammars/language-javascript @@ -1 +1 @@ -Subproject commit f7e166b65d38069345ff0a8bbe59847a5f43ef4d +Subproject commit 9d69b86e30ac05b300937d14ac7168ccace8d857 diff --git a/vendor/grammars/language-python b/vendor/grammars/language-python index 44e1d183..6d7b52b8 160000 --- a/vendor/grammars/language-python +++ b/vendor/grammars/language-python @@ -1 +1 @@ -Subproject commit 44e1d1836675a9b19928a5b2cfce83613fd5b706 +Subproject commit 6d7b52b8823954c33a698e5d10721cee326c5fa1 diff --git a/vendor/grammars/language-shellscript b/vendor/grammars/language-shellscript index d034fecc..0bbc7eee 160000 --- a/vendor/grammars/language-shellscript +++ b/vendor/grammars/language-shellscript @@ -1 +1 @@ -Subproject commit d034fecce883fe047ef8fd3b5ef2179182815ed3 +Subproject commit 0bbc7eee5af6c591c02e2af8d02fe35927b4f4cb diff --git a/vendor/grammars/latex.tmbundle b/vendor/grammars/latex.tmbundle index 6358337b..d40245e1 160000 --- a/vendor/grammars/latex.tmbundle +++ b/vendor/grammars/latex.tmbundle @@ -1 +1 @@ -Subproject commit 6358337b629fd9c17ac8c92f00e88859e6577d4f +Subproject commit d40245e130abc81e0df5d7cb50f3bec995335b8c diff --git a/vendor/grammars/nesC.tmbundle b/vendor/grammars/nesC.tmbundle index d0d322ce..f58def8c 160000 --- a/vendor/grammars/nesC.tmbundle +++ b/vendor/grammars/nesC.tmbundle @@ -1 +1 @@ -Subproject commit d0d322ceafe3c4d8affc0e8b767fb6ad65c52704 +Subproject commit f58def8c5552dcb3ab6b55632fcad8a54ba2724e diff --git a/vendor/grammars/php.tmbundle b/vendor/grammars/php.tmbundle index baad8758..2ecaa60d 160000 --- a/vendor/grammars/php.tmbundle +++ b/vendor/grammars/php.tmbundle @@ -1 +1 @@ -Subproject commit baad875878c402b7b404a63616531644e538bf0c +Subproject commit 2ecaa60d92b92d4c07f243207ba1d5b2114bb70a diff --git a/vendor/grammars/sublime-rust b/vendor/grammars/sublime-rust index 4fcfd98b..06a278cc 160000 --- a/vendor/grammars/sublime-rust +++ b/vendor/grammars/sublime-rust @@ -1 +1 @@ -Subproject commit 4fcfd98b22f179ed4d1f3dde4a0f21f8c651d4f3 +Subproject commit 06a278ccfaf5e542d26a95d66c734b4407bc4912 diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript index 066599f6..d80e89cb 160000 --- a/vendor/grammars/sublime-typescript +++ b/vendor/grammars/sublime-typescript @@ -1 +1 @@ -Subproject commit 066599f6afba3838c8fb053b6a0efb1308d626ad +Subproject commit d80e89cbfb458279c45f32bb2d821ef72cb3d73d From bf705cbaf2b4f876de7c83601cea3703caaaf916 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Wed, 21 Oct 2015 09:02:56 +0100 Subject: [PATCH 048/205] Grammars update --- vendor/grammars/sublime-typescript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript index d80e89cb..a4c4b9fc 160000 --- a/vendor/grammars/sublime-typescript +++ b/vendor/grammars/sublime-typescript @@ -1 +1 @@ -Subproject commit d80e89cbfb458279c45f32bb2d821ef72cb3d73d +Subproject commit a4c4b9fc79e745319beb36a3047c923aa50e8a7f From 5d08605aef5c7c24e9e7e2e6ce9444de6a636faf Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Wed, 21 Oct 2015 09:04:17 +0100 Subject: [PATCH 049/205] Bumping to version 4.7.0 --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index c5dfb5f9..cbe0d481 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.6.4" + VERSION = "4.7.0" end From dd7e44f957d7074f90c0742f801684dda96e6e63 Mon Sep 17 00:00:00 2001 From: phase Date: Wed, 21 Oct 2015 15:34:25 -0700 Subject: [PATCH 050/205] Change D color to match the website The original yellow color doesn't fit D very well, and it looks an awful lot like the color for JavaScript. This changes it to the color used on the website's sidebar, and nice dark maroon: http://www.colorpicker.com/2e2324 --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index d7f5f24d..a03718a4 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -720,7 +720,7 @@ Cython: D: type: programming - color: "#fcd46d" + color: "#2e2424" extensions: - .d - .di From 3040642f972af4998707038cb3287fac6bbfddd8 Mon Sep 17 00:00:00 2001 From: phase Date: Wed, 21 Oct 2015 16:42:43 -0700 Subject: [PATCH 051/205] Change D color to its logo --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index a03718a4..0f90c3e1 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -720,7 +720,7 @@ Cython: D: type: programming - color: "#2e2424" + color: "#ba595e" extensions: - .d - .di From a13664698fa6d680a535b1b2e4ea232dc04ff173 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Thu, 22 Oct 2015 20:28:40 +0200 Subject: [PATCH 052/205] Django as an alias for HTML+Django --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 0f90c3e1..0558ecdc 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1328,6 +1328,7 @@ HTML+Django: - .mustache - .jinja aliases: + - django - html+django/jinja - html+jinja - htmldjango From 7c404e72d24db44097140072ed265aeee36f3495 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Fri, 23 Oct 2015 10:20:31 +0100 Subject: [PATCH 053/205] Dropping support for Ruby 1.9.3 --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 52540b57..41c187ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,5 @@ before_install: script/travis/before_install rvm: - - 1.9.3 - 2.0.0 - 2.1 - 2.2 From 7b185cc2f3e1062ade8f377b5491bee966d362ad Mon Sep 17 00:00:00 2001 From: Dario Bertini Date: Fri, 23 Oct 2015 20:49:05 +0100 Subject: [PATCH 054/205] Switch to MagicPython for Python sources --- .gitmodules | 3 +++ grammars.yml | 3 ++- vendor/grammars/MagicPython | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) create mode 160000 vendor/grammars/MagicPython diff --git a/.gitmodules b/.gitmodules index be2d7b30..c1975e6e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -683,3 +683,6 @@ [submodule "vendor/grammars/FreeMarker.tmbundle"] path = vendor/grammars/FreeMarker.tmbundle url = https://github.com/freemarker/FreeMarker.tmbundle +[submodule "vendor/grammars/MagicPython"] + path = vendor/grammars/MagicPython + url = git@github.com:MagicStack/MagicPython.git diff --git a/grammars.yml b/grammars.yml index 4eee0d23..19f55efa 100644 --- a/grammars.yml +++ b/grammars.yml @@ -346,8 +346,9 @@ vendor/grammars/language-jsoniq/: - source.xq vendor/grammars/language-ncl: - source.ncl -vendor/grammars/language-python: +vendor/grammars/MagicPython: - source.python +vendor/grammars/language-python: - source.regexp.python - text.python.console - text.python.traceback diff --git a/vendor/grammars/MagicPython b/vendor/grammars/MagicPython new file mode 160000 index 00000000..13bf5348 --- /dev/null +++ b/vendor/grammars/MagicPython @@ -0,0 +1 @@ +Subproject commit 13bf534834036911c57d15c40242e45783aad1ba From 362d300cb021f11fe1c66f69b7f1bb0c246f01b0 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Mon, 26 Oct 2015 09:06:42 +0000 Subject: [PATCH 055/205] Blob not FileBlob --- lib/linguist/blob.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/linguist/blob.rb b/lib/linguist/blob.rb index 1be9f0b2..a11e6074 100644 --- a/lib/linguist/blob.rb +++ b/lib/linguist/blob.rb @@ -12,7 +12,7 @@ module Linguist # path - A path String (does not necessarily exists on the file system). # content - Content of the file. # - # Returns a FileBlob. + # Returns a Blob. def initialize(path, content) @path = path @content = content @@ -58,7 +58,7 @@ module Linguist # Public: Return an array of the file extensions # - # >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions + # >> Linguist::Blob.new("app/views/things/index.html.erb").extensions # => [".html.erb", ".erb"] # # Returns an Array From 1b23e81541c4ee07caac43a3fdf48abbe9f00dba Mon Sep 17 00:00:00 2001 From: redroot Date: Thu, 29 Oct 2015 14:52:34 +0000 Subject: [PATCH 056/205] adding csl as an extension for XML, included sample --- lib/linguist/languages.yml | 1 + samples/XML/sample.csl | 1053 ++++++++++++++++++++++++++++++++++++ 2 files changed, 1054 insertions(+) create mode 100644 samples/XML/sample.csl diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 0558ecdc..458cb2d5 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3645,6 +3645,7 @@ XML: - .ccxml - .clixml - .cproject + - .csl - .csproj - .ct - .dita diff --git a/samples/XML/sample.csl b/samples/XML/sample.csl new file mode 100644 index 00000000..7f26fefc --- /dev/null +++ b/samples/XML/sample.csl @@ -0,0 +1,1053 @@ + + From 741d246581c4cf47a064eeea1f419d7d20ccf1c3 Mon Sep 17 00:00:00 2001 From: Redth Date: Fri, 30 Oct 2015 15:06:38 -0400 Subject: [PATCH 057/205] Add .cake extension for C# This adds the .cake file extension to the C# language. Here is a search in the wild: https://github.com/search?q=extension%3Acake+NOT+coffee&type=Code Cake (C# Make) is a cross platform build automation system with a C# DSL to do things like compiling code, copy files/folders, running unit tests, compress files and build NuGet packages. You can find out out more about cake here: http://cakebuild.net/ --- lib/linguist/languages.yml | 1 + samples/C#/build.cake | 86 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 samples/C#/build.cake diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 0558ecdc..bbf9f0c8 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -392,6 +392,7 @@ C#: aliases: - csharp extensions: + - .cake - .cs - .cshtml - .csx diff --git a/samples/C#/build.cake b/samples/C#/build.cake new file mode 100644 index 00000000..d8075251 --- /dev/null +++ b/samples/C#/build.cake @@ -0,0 +1,86 @@ +/////////////////////////////////////////////////////////////////////////////// +// ARGUMENTS +/////////////////////////////////////////////////////////////////////////////// + +var target = Argument("target", "Default"); +var configuration = Argument("configuration", "Release"); + +/////////////////////////////////////////////////////////////////////////////// +// GLOBAL VARIABLES +/////////////////////////////////////////////////////////////////////////////// + +var solutions = GetFiles("./**/*.sln"); +var solutionPaths = solutions.Select(solution => solution.GetDirectory()); + +/////////////////////////////////////////////////////////////////////////////// +// SETUP / TEARDOWN +/////////////////////////////////////////////////////////////////////////////// + +Setup(() => +{ + // Executed BEFORE the first task. + Information("Running tasks..."); +}); + +Teardown(() => +{ + // Executed AFTER the last task. + Information("Finished running tasks."); +}); + +/////////////////////////////////////////////////////////////////////////////// +// TASK DEFINITIONS +/////////////////////////////////////////////////////////////////////////////// + +Task("Clean") + .Does(() => +{ + // Clean solution directories. + foreach(var path in solutionPaths) + { + Information("Cleaning {0}", path); + CleanDirectories(path + "/**/bin/" + configuration); + CleanDirectories(path + "/**/obj/" + configuration); + } +}); + +Task("Restore") + .Does(() => +{ + // Restore all NuGet packages. + foreach(var solution in solutions) + { + Information("Restoring {0}...", solution); + NuGetRestore(solution); + } +}); + +Task("Build") + .IsDependentOn("Clean") + .IsDependentOn("Restore") + .Does(() => +{ + // Build all solutions. + foreach(var solution in solutions) + { + Information("Building {0}", solution); + MSBuild(solution, settings => + settings.SetPlatformTarget(PlatformTarget.MSIL) + .WithProperty("TreatWarningsAsErrors","true") + .WithTarget("Build") + .SetConfiguration(configuration)); + } +}); + +/////////////////////////////////////////////////////////////////////////////// +// TARGETS +/////////////////////////////////////////////////////////////////////////////// + +Task("Default") + .IsDependentOn("Build"); + +/////////////////////////////////////////////////////////////////////////////// +// EXECUTION +/////////////////////////////////////////////////////////////////////////////// + +RunTarget(target); \ No newline at end of file From 2fddaaf3d7c5cea53a930713f855db1906698dae Mon Sep 17 00:00:00 2001 From: Redth Date: Sat, 31 Oct 2015 12:45:54 -0400 Subject: [PATCH 058/205] Reordered extensions so the primary .cs is first --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index bbf9f0c8..6e08e827 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -392,8 +392,8 @@ C#: aliases: - csharp extensions: - - .cake - .cs + - .cake - .cshtml - .csx From 61a5cab1f29d221abc065d22bd8244df7bac63a3 Mon Sep 17 00:00:00 2001 From: Matias Insaurralde Date: Tue, 3 Nov 2015 00:03:00 -0300 Subject: [PATCH 059/205] adding extension for OpenJSCAD --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 0558ecdc..1005fba9 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1656,6 +1656,7 @@ JavaScript: - .gs - .jake - .jsb + - .jscad - .jsfl - .jsm - .jss From daef16416326201d06501f4574db694c4c70d006 Mon Sep 17 00:00:00 2001 From: Matias Insaurralde Date: Tue, 3 Nov 2015 00:24:15 -0300 Subject: [PATCH 060/205] adding jscad sample file --- samples/JavaScript/logo.jscad | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 samples/JavaScript/logo.jscad diff --git a/samples/JavaScript/logo.jscad b/samples/JavaScript/logo.jscad new file mode 100644 index 00000000..2ada0778 --- /dev/null +++ b/samples/JavaScript/logo.jscad @@ -0,0 +1,19 @@ +// title : OpenJSCAD.org Logo +// author : Rene K. Mueller +// license : MIT License +// revision : 0.003 +// tags : Logo,Intersection,Sphere,Cube +// file : logo.jscad + +function main() { + return union( + difference( + cube({size: 3, center: true}), + sphere({r:2, center: true}) + ), + intersection( + sphere({r: 1.3, center: true}), + cube({size: 2.1, center: true}) + ) + ).translate([0,0,1.5]).scale(10); +} From 996ed8a8b1a8c107de15e576fb784bf9cd32a2ec Mon Sep 17 00:00:00 2001 From: Adam Roben Date: Wed, 4 Nov 2015 13:26:24 -0500 Subject: [PATCH 061/205] Remove mentions of treatment of vendored files in diffs Vendored files are treated just like any other files when diffing on github.com. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 33b976d2..36bcbd50 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,9 @@ $ cat .gitattributes *.rb linguist-language=Java ``` -Checking code you didn't write, such as JavaScript libraries, into your git repo is a common practice, but this often inflates your project's language stats and may even cause your project to be labeled as another language. By default, Linguist treats all of the paths defined in [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml) as vendored and therefore doesn't include them in the language statistics for a repository. Vendored files are also hidden by default in diffs on github.com. +Checking code you didn't write, such as JavaScript libraries, into your git repo is a common practice, but this often inflates your project's language stats and may even cause your project to be labeled as another language. By default, Linguist treats all of the paths defined in [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml) as vendored and therefore doesn't include them in the language statistics for a repository. -Use the `linguist-vendored` attribute to vendor or un-vendor paths. Please note, overriding the vendored (or un-vendored) status of a file only affects the language statistics for the repository and not the behavior in diffs on github.com. +Use the `linguist-vendored` attribute to vendor or un-vendor paths. ``` $ cat .gitattributes From fea8bb21a0a340a559f2ef904d862cc8e83a3ba0 Mon Sep 17 00:00:00 2001 From: Adam Roben Date: Thu, 5 Nov 2015 10:18:44 -0500 Subject: [PATCH 062/205] Use negative lookbehind when tokenizing string literals This can double the speed of tokenizing large RTF files that use \'hh escape sequences. --- lib/linguist/tokenizer.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/linguist/tokenizer.rb b/lib/linguist/tokenizer.rb index 64a82e67..7b618049 100644 --- a/lib/linguist/tokenizer.rb +++ b/lib/linguist/tokenizer.rb @@ -86,13 +86,13 @@ module Linguist if s.peek(1) == "\"" s.getch else - s.skip_until(/[^\\]"/) + s.skip_until(/(? Date: Sun, 8 Nov 2015 06:25:32 -0500 Subject: [PATCH 063/205] Add SuperCollider grammar plus a few minor language support updates including: - recognize `sclang` and `scsynth` interpreters - set `tm_scope: source.supercollider` - reorder extensions so that `.sc` is primary --- .gitmodules | 3 +++ grammars.yml | 2 ++ lib/linguist/languages.yml | 7 +++++-- test/test_language.rb | 8 +++++++- vendor/grammars/language-supercollider | 1 + 5 files changed, 18 insertions(+), 3 deletions(-) create mode 160000 vendor/grammars/language-supercollider diff --git a/.gitmodules b/.gitmodules index e9e9cc5f..b164e010 100644 --- a/.gitmodules +++ b/.gitmodules @@ -85,6 +85,9 @@ [submodule "vendor/grammars/language-shellscript"] path = vendor/grammars/language-shellscript url = https://github.com/atom/language-shellscript +[submodule "vendor/grammars/language-supercollider"] + path = vendor/grammars/language-supercollider + url = https://github.com/supercollider/language-supercollider [submodule "vendor/grammars/language-yaml"] path = vendor/grammars/language-yaml url = https://github.com/atom/language-yaml diff --git a/grammars.yml b/grammars.yml index 0b4525df..dd6fb350 100644 --- a/grammars.yml +++ b/grammars.yml @@ -354,6 +354,8 @@ vendor/grammars/language-python: vendor/grammars/language-shellscript: - source.shell - text.shell-session +vendor/grammars/language-supercollider: +- source.supercollider vendor/grammars/language-xbase: - source.harbour vendor/grammars/language-yaml: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 2ca9be57..1761b85d 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3336,9 +3336,12 @@ SuperCollider: type: programming color: "#46390b" extensions: - - .scd - .sc - tm_scope: none + - .scd + interpreters: + - sclang + - scsynth + tm_scope: source.supercollider ace_mode: text Swift: diff --git a/test/test_language.rb b/test/test_language.rb index 5da3b8c7..5613f235 100644 --- a/test/test_language.rb +++ b/test/test_language.rb @@ -57,6 +57,7 @@ class TestLanguage < Minitest::Test assert_equal Language['Shell'], Language.find_by_alias('sh') assert_equal Language['Shell'], Language.find_by_alias('shell') assert_equal Language['Shell'], Language.find_by_alias('zsh') + assert_equal Language['SuperCollider'], Language.find_by_alias('supercollider') assert_equal Language['TeX'], Language.find_by_alias('tex') assert_equal Language['TypeScript'], Language.find_by_alias('ts') assert_equal Language['VimL'], Language.find_by_alias('vim') @@ -119,6 +120,7 @@ class TestLanguage < Minitest::Test assert_equal 'vim', Language['VimL'].search_term assert_equal 'jsp', Language['Java Server Pages'].search_term assert_equal 'rst', Language['reStructuredText'].search_term + assert_equal 'supercollider', Language['SuperCollider'].search_term end def test_popular @@ -138,6 +140,7 @@ class TestLanguage < Minitest::Test assert_equal :programming, Language['Ruby'].type assert_equal :programming, Language['TypeScript'].type assert_equal :programming, Language['Makefile'].type + assert_equal :programming, Language['SuperCollider'].type end def test_markup @@ -227,7 +230,8 @@ class TestLanguage < Minitest::Test "python" => "Python", "python2" => "Python", "python3" => "Python", - "sbcl" => "Common Lisp" + "sbcl" => "Common Lisp", + "sclang" => "SuperCollider" }.each do |interpreter, language| assert_equal [Language[language]], Language.find_by_interpreter(interpreter) end @@ -339,6 +343,7 @@ class TestLanguage < Minitest::Test assert Language['Perl'].extensions.include?('.pl') assert Language['Python'].extensions.include?('.py') assert Language['Ruby'].extensions.include?('.rb') + assert Language['SuperCollider'].extensions.include?('.scd') end def test_primary_extension @@ -349,6 +354,7 @@ class TestLanguage < Minitest::Test assert_equal '.coffee', Language['CoffeeScript'].primary_extension assert_equal '.t', Language['Turing'].primary_extension assert_equal '.ts', Language['TypeScript'].primary_extension + assert_equal '.sc', Language['SuperCollider'].primary_extension end def test_eql diff --git a/vendor/grammars/language-supercollider b/vendor/grammars/language-supercollider new file mode 160000 index 00000000..2b1da230 --- /dev/null +++ b/vendor/grammars/language-supercollider @@ -0,0 +1 @@ +Subproject commit 2b1da230e3b606a8d841d6ceda36ee1330d96aea From 550b67215c2d62410da4f4daaad2dfe249866cde Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Sun, 8 Nov 2015 06:39:36 -0500 Subject: [PATCH 064/205] Fetch libicu via Travis, switch back to container-based This is a test. I don't understand the details of how the `bundle config build.charlock_holmes` bit works/fails, so the intent here is to get a PR posted for purposes of getting feedback via the full Travis machinery. --- .travis.yml | 7 +++++++ script/travis/before_install | 12 ------------ script/vendor-deb | 13 ------------- 3 files changed, 7 insertions(+), 25 deletions(-) delete mode 100755 script/vendor-deb diff --git a/.travis.yml b/.travis.yml index 41c187ca..80d68e84 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,10 @@ +language: ruby +sudo: false +addons: + apt: + packages: + - libicu-dev + - libicu48 before_install: script/travis/before_install rvm: - 2.0.0 diff --git a/script/travis/before_install b/script/travis/before_install index 516ec956..e83b930f 100755 --- a/script/travis/before_install +++ b/script/travis/before_install @@ -5,18 +5,6 @@ set -ex # Fetch all commits/refs needed to run our tests. git fetch origin master:master v2.0.0:v2.0.0 test/attributes:test/attributes test/master:test/master -sudo apt-get update - -script/vendor-deb libicu48 libicu-dev -if ruby -e 'exit RUBY_VERSION >= "2.0" && RUBY_VERSION < "2.1"'; then - # Workaround for https://bugs.ruby-lang.org/issues/8074. We can't use this - # solution on all versions of Ruby due to - # https://github.com/bundler/bundler/pull/3338. - bundle config build.charlock_holmes --with-icu-include=$(pwd)/vendor/debs/include --with-icu-lib=$(pwd)/vendor/debs/lib -else - bundle config build.charlock_holmes --with-icu-dir=$(pwd)/vendor/debs -fi - # Replace SSH links to submodules by HTTPS links. sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules diff --git a/script/vendor-deb b/script/vendor-deb deleted file mode 100755 index ebad3e76..00000000 --- a/script/vendor-deb +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -set -ex - -cd "$(dirname "$0")/.." - -mkdir -p vendor/apt vendor/debs - -(cd vendor/apt && apt-get --assume-yes download "$@") - -for deb in vendor/apt/*.deb; do - ar p $deb data.tar.gz | tar -vzxC vendor/debs --strip-components=2 -done From 68b553ea55f042a596f83c258e6accf4ba15b004 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 10 Nov 2015 09:57:04 +0000 Subject: [PATCH 065/205] Updating grammars --- grammars.yml | 3 ++- lib/linguist/languages.yml | 2 +- vendor/grammars/Docker.tmbundle | 2 +- vendor/grammars/FreeMarker.tmbundle | 2 +- vendor/grammars/InnoSetup | 2 +- vendor/grammars/NSIS | 2 +- vendor/grammars/NimLime | 2 +- vendor/grammars/Stata.tmbundle | 2 +- vendor/grammars/Sublime-Text-2-OpenEdge-ABL | 2 +- vendor/grammars/atom-fsharp | 2 +- vendor/grammars/factor | 2 +- vendor/grammars/jade-tmbundle | 2 +- vendor/grammars/language-babel | 2 +- vendor/grammars/language-coffee-script | 2 +- vendor/grammars/language-javascript | 2 +- vendor/grammars/language-shellscript | 2 +- vendor/grammars/latex.tmbundle | 2 +- vendor/grammars/processing.tmbundle | 2 +- vendor/grammars/sas.tmbundle | 2 +- vendor/grammars/sublime-pony | 2 +- vendor/grammars/sublime-typescript | 2 +- vendor/grammars/vue-syntax-highlight | 2 +- 22 files changed, 23 insertions(+), 22 deletions(-) diff --git a/grammars.yml b/grammars.yml index dd6fb350..7f9c3f77 100644 --- a/grammars.yml +++ b/grammars.yml @@ -181,6 +181,7 @@ vendor/grammars/assembly.tmbundle: vendor/grammars/atom-fsharp/: - source.fsharp - source.fsharp.fsi +- source.fsharp.fsl - source.fsharp.fsx vendor/grammars/atom-language-purescript/: - source.purescript @@ -301,8 +302,8 @@ vendor/grammars/io.tmbundle: vendor/grammars/ioke-outdated: - source.ioke vendor/grammars/jade-tmbundle: -- source.jade - source.pyjade +- text.jade vendor/grammars/jasmin-sublime: - source.jasmin vendor/grammars/java.tmbundle: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 1761b85d..1cf1d4b2 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1611,7 +1611,7 @@ Jade: type: markup extensions: - .jade - tm_scope: source.jade + tm_scope: text.jade ace_mode: jade Jasmin: diff --git a/vendor/grammars/Docker.tmbundle b/vendor/grammars/Docker.tmbundle index 6bb36d82..08585643 160000 --- a/vendor/grammars/Docker.tmbundle +++ b/vendor/grammars/Docker.tmbundle @@ -1 +1 @@ -Subproject commit 6bb36d82623fbf48999f8181d589fa91aa58bb3e +Subproject commit 08585643c0b84eb6f76ef56fbba7183185e65548 diff --git a/vendor/grammars/FreeMarker.tmbundle b/vendor/grammars/FreeMarker.tmbundle index 6b7b880c..7259485a 160000 --- a/vendor/grammars/FreeMarker.tmbundle +++ b/vendor/grammars/FreeMarker.tmbundle @@ -1 +1 @@ -Subproject commit 6b7b880c533626b8e943ed686007c06771da3b42 +Subproject commit 7259485a01310af4bf63ba4ff37cbba3724ae77f diff --git a/vendor/grammars/InnoSetup b/vendor/grammars/InnoSetup index a7f79fd1..2853a397 160000 --- a/vendor/grammars/InnoSetup +++ b/vendor/grammars/InnoSetup @@ -1 +1 @@ -Subproject commit a7f79fd1a530adbcfe8f660eb1b9c48dc3bd5ede +Subproject commit 2853a397c7afc1368b74278e35d28c14bbc7c469 diff --git a/vendor/grammars/NSIS b/vendor/grammars/NSIS index ea610444..68a4534d 160000 --- a/vendor/grammars/NSIS +++ b/vendor/grammars/NSIS @@ -1 +1 @@ -Subproject commit ea6104445d65ebfd183d6835736f306b1d986b79 +Subproject commit 68a4534dde63a2b3a7b2d100ebb565e0cfebc024 diff --git a/vendor/grammars/NimLime b/vendor/grammars/NimLime index 51118338..7aea8846 160000 --- a/vendor/grammars/NimLime +++ b/vendor/grammars/NimLime @@ -1 +1 @@ -Subproject commit 5111833868d63c7a35e6e9f0aa443e0d1832db7a +Subproject commit 7aea8846e1ee162001393bbb4349388a35379767 diff --git a/vendor/grammars/Stata.tmbundle b/vendor/grammars/Stata.tmbundle index bc1e3634..50685c27 160000 --- a/vendor/grammars/Stata.tmbundle +++ b/vendor/grammars/Stata.tmbundle @@ -1 +1 @@ -Subproject commit bc1e36344d4d7aa0d9c53757639d3f56511565e7 +Subproject commit 50685c273588cf6bd4828cb30432c7152df91c4e diff --git a/vendor/grammars/Sublime-Text-2-OpenEdge-ABL b/vendor/grammars/Sublime-Text-2-OpenEdge-ABL index dd14b342..c8306314 160000 --- a/vendor/grammars/Sublime-Text-2-OpenEdge-ABL +++ b/vendor/grammars/Sublime-Text-2-OpenEdge-ABL @@ -1 +1 @@ -Subproject commit dd14b342cb436cde41752df6a014588110b9c1c0 +Subproject commit c830631431612b1ec2d8f7335205e65540a68115 diff --git a/vendor/grammars/atom-fsharp b/vendor/grammars/atom-fsharp index 7051d65d..18593c09 160000 --- a/vendor/grammars/atom-fsharp +++ b/vendor/grammars/atom-fsharp @@ -1 +1 @@ -Subproject commit 7051d65d639ee209533354097a4b31e4f097d37d +Subproject commit 18593c099dcb532d09e8a35ec4e0834216b21250 diff --git a/vendor/grammars/factor b/vendor/grammars/factor index 9b5cb445..a97f840d 160000 --- a/vendor/grammars/factor +++ b/vendor/grammars/factor @@ -1 +1 @@ -Subproject commit 9b5cb445ee65d70d6b16bd65abb979f932441b93 +Subproject commit a97f840daaaa9e0768b5d1b40ab5d01431c7db64 diff --git a/vendor/grammars/jade-tmbundle b/vendor/grammars/jade-tmbundle index fea35b58..6cde1da6 160000 --- a/vendor/grammars/jade-tmbundle +++ b/vendor/grammars/jade-tmbundle @@ -1 +1 @@ -Subproject commit fea35b58dca320d1d7940948162b7fd3fa9a1b1d +Subproject commit 6cde1da6888730b1b085487d1601929ddf863182 diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel index 44ff68da..1f0e2c25 160000 --- a/vendor/grammars/language-babel +++ b/vendor/grammars/language-babel @@ -1 +1 @@ -Subproject commit 44ff68da9ee1df3710513d3b4de21f46ec6d0ed0 +Subproject commit 1f0e2c25366bf5b404000e75505bb39c8881d8bb diff --git a/vendor/grammars/language-coffee-script b/vendor/grammars/language-coffee-script index 0eeace01..cea48a62 160000 --- a/vendor/grammars/language-coffee-script +++ b/vendor/grammars/language-coffee-script @@ -1 +1 @@ -Subproject commit 0eeace014be887846eab5e3a39581ef4d705dd15 +Subproject commit cea48a62ab0b33de7f28e1e11af189c8acf32ebe diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript index 9d69b86e..91675412 160000 --- a/vendor/grammars/language-javascript +++ b/vendor/grammars/language-javascript @@ -1 +1 @@ -Subproject commit 9d69b86e30ac05b300937d14ac7168ccace8d857 +Subproject commit 9167541232bc330c0d7dd4b0f0de4cecd35c817b diff --git a/vendor/grammars/language-shellscript b/vendor/grammars/language-shellscript index 0bbc7eee..331dbfea 160000 --- a/vendor/grammars/language-shellscript +++ b/vendor/grammars/language-shellscript @@ -1 +1 @@ -Subproject commit 0bbc7eee5af6c591c02e2af8d02fe35927b4f4cb +Subproject commit 331dbfea1f81ed1b82c0d638b08c8fe590a89c37 diff --git a/vendor/grammars/latex.tmbundle b/vendor/grammars/latex.tmbundle index d40245e1..0774651f 160000 --- a/vendor/grammars/latex.tmbundle +++ b/vendor/grammars/latex.tmbundle @@ -1 +1 @@ -Subproject commit d40245e130abc81e0df5d7cb50f3bec995335b8c +Subproject commit 0774651f8704700e3e2cd866f5a2bab8a5a06e53 diff --git a/vendor/grammars/processing.tmbundle b/vendor/grammars/processing.tmbundle index 4070e43b..214b3420 160000 --- a/vendor/grammars/processing.tmbundle +++ b/vendor/grammars/processing.tmbundle @@ -1 +1 @@ -Subproject commit 4070e43b094d49eab0e2f1045bd5ac6ad71e870f +Subproject commit 214b3420f12d65b125e82dc039d580326257f71b diff --git a/vendor/grammars/sas.tmbundle b/vendor/grammars/sas.tmbundle index 43a05b10..30fa23fc 160000 --- a/vendor/grammars/sas.tmbundle +++ b/vendor/grammars/sas.tmbundle @@ -1 +1 @@ -Subproject commit 43a05b10fc76b34946a1188fd2a9c2171dbf3fe4 +Subproject commit 30fa23fc34cf5147bcfd0759a4cbf83cd987337d diff --git a/vendor/grammars/sublime-pony b/vendor/grammars/sublime-pony index 6197c402..2b69dd3e 160000 --- a/vendor/grammars/sublime-pony +++ b/vendor/grammars/sublime-pony @@ -1 +1 @@ -Subproject commit 6197c4028eb04dcb1c443160047e4c84c80d863e +Subproject commit 2b69dd3e475244972c153b113fec87680e794529 diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript index a4c4b9fc..51341e0a 160000 --- a/vendor/grammars/sublime-typescript +++ b/vendor/grammars/sublime-typescript @@ -1 +1 @@ -Subproject commit a4c4b9fc79e745319beb36a3047c923aa50e8a7f +Subproject commit 51341e0ae76e44c80885f70e5149ec62d593f833 diff --git a/vendor/grammars/vue-syntax-highlight b/vendor/grammars/vue-syntax-highlight index 7d35a53e..3b5c4183 160000 --- a/vendor/grammars/vue-syntax-highlight +++ b/vendor/grammars/vue-syntax-highlight @@ -1 +1 @@ -Subproject commit 7d35a53e7e4380f01340ca5f508e9a8f8bc69ef0 +Subproject commit 3b5c4183bf1da404e019d3aad5bcba9d3d270067 From 8db4cc482e3d77ba12725158a64ba91d8c9c1e7d Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Thu, 12 Nov 2015 18:41:59 -0600 Subject: [PATCH 066/205] Grammar update --- vendor/grammars/atom-fsharp | 2 +- vendor/grammars/elixir-tmbundle | 2 +- vendor/grammars/language-babel | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vendor/grammars/atom-fsharp b/vendor/grammars/atom-fsharp index 18593c09..eb5553c3 160000 --- a/vendor/grammars/atom-fsharp +++ b/vendor/grammars/atom-fsharp @@ -1 +1 @@ -Subproject commit 18593c099dcb532d09e8a35ec4e0834216b21250 +Subproject commit eb5553c3b96af24f38c7064acf1a26e74af11a30 diff --git a/vendor/grammars/elixir-tmbundle b/vendor/grammars/elixir-tmbundle index 46514e8f..25bf9332 160000 --- a/vendor/grammars/elixir-tmbundle +++ b/vendor/grammars/elixir-tmbundle @@ -1 +1 @@ -Subproject commit 46514e8f9f30c47f7867fd8d0019c554154ce89c +Subproject commit 25bf933246d306562790114d6fd0bccb78343161 diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel index 1f0e2c25..b5551805 160000 --- a/vendor/grammars/language-babel +++ b/vendor/grammars/language-babel @@ -1 +1 @@ -Subproject commit 1f0e2c25366bf5b404000e75505bb39c8881d8bb +Subproject commit b555180508e89f5bd5259b43380ad86d563df2b1 From 01d05d1d4eba13a5b37762be607973aee31dd4b7 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Thu, 12 Nov 2015 18:43:16 -0600 Subject: [PATCH 067/205] Bumping to v4.7.1 --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index cbe0d481..7a91a24a 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.7.0" + VERSION = "4.7.1" end From 6839516b5c7eb11147b6d75057ce5f4b22ee3453 Mon Sep 17 00:00:00 2001 From: Ingo Blechschmidt Date: Tue, 17 Nov 2015 00:03:21 +0100 Subject: [PATCH 068/205] Only classify `.pkl` files as Pickle data dumps It seems to be the dominant extension at the moment, even though several Python resources use `.p` or `.pickle`. This was discussed in #2655. --- lib/linguist/languages.yml | 2 -- samples/Pickle/{data.p => data.pkl} | 0 ...-l2reg-784-10-30.p => neural-network-ce-l2reg-784-10-30.pkl} | 0 samples/Pickle/{random.p => random.pkl} | 0 samples/Pickle/{save.p => save.pkl} | 0 5 files changed, 2 deletions(-) rename samples/Pickle/{data.p => data.pkl} (100%) rename samples/Pickle/{neural-network-ce-l2reg-784-10-30.p => neural-network-ce-l2reg-784-10-30.pkl} (100%) rename samples/Pickle/{random.p => random.pkl} (100%) rename samples/Pickle/{save.p => save.pkl} (100%) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 45c7e4c8..931e20aa 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2575,8 +2575,6 @@ Perl6: Pickle: type: data extensions: - - .p - - .pickle - .pkl tm_scope: none ace_mode: text diff --git a/samples/Pickle/data.p b/samples/Pickle/data.pkl similarity index 100% rename from samples/Pickle/data.p rename to samples/Pickle/data.pkl diff --git a/samples/Pickle/neural-network-ce-l2reg-784-10-30.p b/samples/Pickle/neural-network-ce-l2reg-784-10-30.pkl similarity index 100% rename from samples/Pickle/neural-network-ce-l2reg-784-10-30.p rename to samples/Pickle/neural-network-ce-l2reg-784-10-30.pkl diff --git a/samples/Pickle/random.p b/samples/Pickle/random.pkl similarity index 100% rename from samples/Pickle/random.p rename to samples/Pickle/random.pkl diff --git a/samples/Pickle/save.p b/samples/Pickle/save.pkl similarity index 100% rename from samples/Pickle/save.p rename to samples/Pickle/save.pkl From 2a06d1aa19f6d0a2580b8ef67dc1e1cea0428156 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Wed, 18 Nov 2015 13:12:06 +0100 Subject: [PATCH 069/205] Add new sample for Formatted. Sample from qingguang/lammps-sph; GPL v2 license. --- lib/linguist/languages.yml | 1 + samples/Formatted/NiAlH_jea.eam.fs | 3608 ++++++++++++++++++++++++++++ 2 files changed, 3609 insertions(+) create mode 100644 samples/Formatted/NiAlH_jea.eam.fs diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 373607db..4fba0ecd 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1012,6 +1012,7 @@ Formatted: type: data extensions: - .for + - .eam.fs tm_scope: none ace_mode: text diff --git a/samples/Formatted/NiAlH_jea.eam.fs b/samples/Formatted/NiAlH_jea.eam.fs new file mode 100644 index 00000000..cad5fcdb --- /dev/null +++ b/samples/Formatted/NiAlH_jea.eam.fs @@ -0,0 +1,3608 @@ +see James E Angelo, Neville R Moody, Michael I Baskes +"Trapping of hydrogen to lattice defects in nickel", Modelling and +Simulation in Materials Science & Engineering, vol. 3, pp. 289-307 (1995) + 3 Ni Al H + 1000 0.1300722995578975E-01 1000 0.5678391959798995E-02 0.5650000000000000E+01 + 28 58.710 3.5200 fcc + 0.0000000000000000E+00 -0.1332662793615358E+00 -0.1452921454581837E+00 -0.1523531912368142E+00 -0.1581862523552362E+00 + -0.1639082041116888E+00 -0.1699426545382059E+00 -0.1764570476376752E+00 -0.1835109199136706E+00 -0.1911112227682255E+00 + -0.1992425242400153E+00 -0.2078735593152208E+00 -0.2169708161705926E+00 -0.2264981576262208E+00 -0.2364198685383210E+00 + -0.2467010212354559E+00 -0.2573089641630046E+00 -0.2682127177172648E+00 -0.2793832876249742E+00 -0.2907936148383499E+00 + -0.3024184814336230E+00 -0.3142343948579320E+00 -0.3262194641112117E+00 -0.3383532759151806E+00 -0.3506164751688710E+00 + -0.3629930849818281E+00 -0.3754632992578539E+00 -0.3880132539605681E+00 -0.4006282340364624E+00 -0.4132944249954278E+00 + -0.4259988342802910E+00 -0.4387292219786865E+00 -0.4514740394367802E+00 -0.4642223746432430E+00 -0.4769639034723383E+00 + -0.4896888460377404E+00 -0.5023882063058194E+00 -0.5150514008208491E+00 -0.5276733170954859E+00 -0.5402439685620584E+00 + -0.5527559057851690E+00 -0.5652019937956556E+00 -0.5775754037468577E+00 -0.5898697374354533E+00 -0.6020783706550734E+00 + -0.6141958187973504E+00 -0.6262163111449786E+00 -0.6381344390125845E+00 -0.6499424015305308E+00 -0.6616382540753616E+00 + -0.6731993263249691E+00 -0.6845796030423443E+00 -0.6957060801011892E+00 -0.7064948085245568E+00 -0.7168695757140675E+00 + -0.7267732527299753E+00 -0.7361710465584164E+00 -0.7450484575868490E+00 -0.7534069422321110E+00 -0.7612592416825148E+00 + -0.7686253227224800E+00 -0.7755292274454266E+00 -0.7819968032841373E+00 -0.7880540868431538E+00 -0.7937266203490037E+00 + -0.7990383766649565E+00 -0.8040117767243267E+00 -0.8086674652146524E+00 -0.8130242928279436E+00 -0.8170993717012625E+00 + -0.8209081734003210E+00 -0.8244646490459413E+00 -0.8277813583284139E+00 -0.8308695990447905E+00 -0.8337395320876144E+00 + -0.8364002989992798E+00 -0.8388601306360481E+00 -0.8411264464017005E+00 -0.8432059440847066E+00 -0.8451046806746021E+00 + -0.8468281447278194E+00 -0.8483813209452364E+00 -0.8497687476559737E+00 -0.8509945678935900E+00 -0.8520625747193371E+00 + -0.8529762514032520E+00 -0.8537388100896948E+00 -0.8543532100632678E+00 -0.8548222073722460E+00 -0.8551483635456201E+00 + -0.8553340719766496E+00 -0.8553815772750362E+00 -0.8552929923971586E+00 -0.8550703138095166E+00 -0.8547151651374190E+00 + -0.8542288599579191E+00 -0.8536141001159478E+00 -0.8528770375410186E+00 -0.8520101609408499E+00 -0.8510194840111716E+00 + -0.8499064644469634E+00 -0.8486725211340236E+00 -0.8473190381844873E+00 -0.8458473685456269E+00 -0.8442588372306652E+00 + -0.8425547442066161E+00 -0.8407363669700096E+00 -0.8388049628370240E+00 -0.8367617709719433E+00 -0.8346080141771175E+00 + -0.8323449004663495E+00 -0.8299736244409459E+00 -0.8274953684882504E+00 -0.8249113038193059E+00 -0.8222225913624328E+00 + -0.8194312028270083E+00 -0.8165381656110142E+00 -0.8135381986589678E+00 -0.8104430318985472E+00 -0.8072486480744487E+00 + -0.8039562298106482E+00 -0.8005669360809051E+00 -0.7970819051712361E+00 -0.7935022573432313E+00 -0.7898290971921718E+00 + -0.7860635135890277E+00 -0.7822065375250205E+00 -0.7782588382932190E+00 -0.7742197532367605E+00 -0.7700870580234671E+00 + -0.7658477859557991E+00 -0.7614923740747592E+00 -0.7569976237158578E+00 -0.7523403043259940E+00 -0.7474924540260339E+00 + -0.7424262490644793E+00 -0.7371152605107092E+00 -0.7315359786377336E+00 -0.7256688371398212E+00 -0.7194997208059100E+00 + -0.7130147649374017E+00 -0.7062107830858579E+00 -0.6990840527339586E+00 -0.6916355099263285E+00 -0.6838688833277935E+00 + -0.6757902321840703E+00 -0.6674074545321318E+00 -0.6587298477273151E+00 -0.6497677278712075E+00 -0.6405321085533657E+00 + -0.6310344355558080E+00 -0.6212863721358168E+00 -0.6112922466782784E+00 -0.6010783652240157E+00 -0.5906465248553197E+00 + -0.5800085678384548E+00 -0.5691757383537599E+00 -0.5581582564186043E+00 -0.5469659281367214E+00 -0.5356081318998811E+00 + -0.5240938131155666E+00 -0.5124314854938561E+00 -0.5006292372993926E+00 -0.4886947412876452E+00 -0.4766352673015746E+00 + -0.4644576967166927E+00 -0.4521685380961173E+00 -0.4397739435565100E+00 -0.4272797254586216E+00 -0.4146913731272406E+00 + -0.4020140693777172E+00 -0.3892527066834290E+00 -0.3764119028647137E+00 -0.3634960162151266E+00 -0.3505091600038455E+00 + -0.3374552163098947E+00 -0.3243378491869073E+00 -0.3111605171690215E+00 -0.2979264851148429E+00 -0.2846388353950218E+00 + -0.2713004784405015E+00 -0.2579141626735364E+00 -0.2444824838465252E+00 -0.2310078938154909E+00 -0.2174927087734169E+00 + -0.2039391169721405E+00 -0.1903491859578246E+00 -0.1767248693464794E+00 -0.1630680131652866E+00 -0.1493803617833507E+00 + -0.1356635634555516E+00 -0.1219191755016809E+00 -0.1081486691423308E+00 -0.9435343401120377E-01 -0.8054492422289172E-01 + -0.6670414857713070E-01 -0.5284236389642416E-01 -0.3896067277847237E-01 -0.2506137114673379E-01 -0.1114505736346416E-01 + 0.2787869992531000E-02 0.1673649714292225E-01 0.3069995798121283E-01 0.4467743152122949E-01 0.5866813997114662E-01 + 0.7267134735307934E-01 0.8668635275736136E-01 0.1007124932111410E+00 0.1147491401988674E+00 0.1287956978815430E+00 + 0.1428516014164529E+00 0.1569163153723068E+00 0.1709893322335105E+00 0.1850701709882827E+00 0.1991583757947666E+00 + 0.2132535147217212E+00 0.2273551785580352E+00 0.2414629796876397E+00 0.2555765510256194E+00 0.2696955450121337E+00 + 0.2838196326609008E+00 0.2979485026581798E+00 0.3120818605100766E+00 0.3262194277345074E+00 0.3403609410961295E+00 + 0.3545061518803436E+00 0.3686548252055175E+00 0.3828067393706931E+00 0.3969616852363487E+00 0.4111194656371424E+00 + 0.4252798948247261E+00 0.4394427979383266E+00 0.4536080105023714E+00 0.4677753779491880E+00 0.4819447551653937E+00 + 0.4961160060612713E+00 0.5102890031615175E+00 0.5244636272329899E+00 0.5386397670398893E+00 0.5528173195811590E+00 + 0.5669961916288884E+00 0.5811763038337503E+00 0.5953575986744184E+00 0.6095400529056221E+00 0.6237236940889446E+00 + 0.6379086197162707E+00 0.6520950167319981E+00 0.6662831791056405E+00 0.6804735214359070E+00 0.6946665872026117E+00 + 0.7088630510277696E+00 0.7230637149920511E+00 0.7372694995930971E+00 0.7514814302896511E+00 0.7657006207512822E+00 + 0.7799282539728765E+00 0.7941655623409360E+00 0.8084138075998624E+00 0.8226742614970703E+00 0.8369481877037046E+00 + 0.8512368254336948E+00 0.8655413750282932E+00 0.8798629856427098E+00 0.8942027450633461E+00 0.9085616716017455E+00 + 0.9229407079527192E+00 0.9373407168612360E+00 0.9517624784199370E+00 0.9662066888041991E+00 0.9806739602523891E+00 + 0.9951648221004206E+00 0.1009679722693299E+01 0.1024219032006336E+01 0.1038783044826459E+01 0.1053371984359273E+01 + 0.1067986006143130E+01 0.1082625202169261E+01 0.1097289605119975E+01 0.1111979192652043E+01 0.1126693891663521E+01 + 0.1141433582496241E+01 0.1156198103032580E+01 0.1170987252656857E+01 0.1185800796057570E+01 0.1200638466853661E+01 + 0.1215499971032784E+01 0.1230384990195972E+01 0.1245293184603845E+01 0.1260224196025355E+01 0.1275177650390923E+01 + 0.1290153160254313E+01 0.1305150327069121E+01 0.1320168743286779E+01 0.1335207994283188E+01 0.1350267660123350E+01 + 0.1365347317171768E+01 0.1380446539557269E+01 0.1395564900502009E+01 0.1410701973522016E+01 0.1425857333509093E+01 + 0.1441030557701353E+01 0.1456221226550525E+01 0.1471428924494518E+01 0.1486653240641253E+01 0.1501893769371186E+01 + 0.1517150110865678E+01 0.1532421871566029E+01 0.1547708664570152E+01 0.1563010109971501E+01 0.1578325835145321E+01 + 0.1593655474987493E+01 0.1608998672109891E+01 0.1624371180506387E+01 0.1639740502114151E+01 0.1655122356345302E+01 + 0.1670516417892671E+01 0.1685922369619611E+01 0.1701339902568634E+01 0.1716768715949499E+01 0.1732208517108212E+01 + 0.1747659021479414E+01 0.1763119952524256E+01 0.1778591041654877E+01 0.1794072028147745E+01 0.1809562659046684E+01 + 0.1825062689057695E+01 0.1840571880435753E+01 0.1856090002865933E+01 0.1871616833338670E+01 0.1887152156020591E+01 + 0.1902695762121880E+01 0.1918247449760493E+01 0.1933807023824201E+01 0.1949374295830467E+01 0.1964949083785456E+01 + 0.1980531212042564E+01 0.1996120511159695E+01 0.2011716817757780E+01 0.2027319974378536E+01 0.2042929829344224E+01 + 0.2058546236616969E+01 0.2074169055660697E+01 0.2089798151303690E+01 0.2105433393602993E+01 0.2121074657710956E+01 + 0.2136721823742874E+01 0.2152374776647946E+01 0.2168033406081115E+01 0.2183697606278244E+01 0.2199367275932566E+01 + 0.2215042318074360E+01 0.2230722639952553E+01 0.2246408152918789E+01 0.2262098772314182E+01 0.2277794417357875E+01 + 0.2293495011038814E+01 0.2309200480010006E+01 0.2324910754483760E+01 0.2340625768131687E+01 0.2356345457985135E+01 + 0.2372069764338704E+01 0.2387798630656611E+01 0.2403532003480336E+01 0.2419269832339658E+01 0.2435012069665014E+01 + 0.2450758670702946E+01 0.2466509593432718E+01 0.2482264798486547E+01 0.2498024249070006E+01 0.2513787910886542E+01 + 0.2529555752062322E+01 0.2545327743074537E+01 0.2561103856680077E+01 0.2576884067847857E+01 0.2592668353691494E+01 + 0.2608456693404804E+01 0.2624249068198495E+01 0.2640045461239012E+01 0.2655845857588801E+01 0.2671650244148466E+01 + 0.2687458609600455E+01 0.2703270944353804E+01 0.2719087240491504E+01 0.2734907491718758E+01 0.2750731693312261E+01 + 0.2766559842071786E+01 0.2782391936272532E+01 0.2798227975619128E+01 0.2814067961200806E+01 0.2829911895447779E+01 + 0.2845759782089161E+01 0.2861611626111980E+01 0.2877467433721947E+01 0.2893327212308449E+01 0.2909190970421690E+01 + 0.2925058717783131E+01 0.2940930465370343E+01 0.2956806225646105E+01 0.2972686013021615E+01 0.2988569844663630E+01 + 0.3004457741744432E+01 0.3020349731207816E+01 0.3036245848084562E+01 0.3052146138327856E+01 0.3068050662093938E+01 + 0.3083959497337403E+01 0.3099872743561932E+01 0.3115790525549542E+01 0.3131712996890727E+01 0.3147640343150343E+01 + 0.3163572784533585E+01 0.3179510577942580E+01 0.3195454018354155E+01 0.3211403439482311E+01 0.3227359213718501E+01 + 0.3243321751378190E+01 0.3259291499296893E+01 0.3275268938843027E+01 0.3291254583421065E+01 0.3307248975552397E+01 + 0.3323252683617341E+01 0.3339266298346260E+01 0.3355290429139160E+01 0.3371325700295216E+01 0.3387372747215409E+01 + 0.3403432212646379E+01 0.3419504743012368E+01 0.3435590984884243E+01 0.3451691581620338E+01 0.3467807170206726E+01 + 0.3483938378319635E+01 0.3500085821623841E+01 0.3516250101317652E+01 0.3532431801926151E+01 0.3548631489345226E+01 + 0.3564849709131778E+01 0.3581086985033565E+01 0.3597344652416893E+01 0.3613622490530517E+01 0.3629920843003930E+01 + 0.3646240132058665E+01 0.3662580753832387E+01 0.3678943078161282E+01 0.3695327448517830E+01 0.3711734182088804E+01 + 0.3728163569978022E+01 0.3744615877522165E+01 0.3761091344705235E+01 0.3777590186658585E+01 0.3794112594236921E+01 + 0.3810658734656357E+01 0.3827228752187168E+01 0.3843822768889325E+01 0.3860440885384449E+01 0.3877083181654072E+01 + 0.3893749717858398E+01 0.3910440535169144E+01 0.3927155656609344E+01 0.3943895087897474E+01 0.3960658818286859E+01 + 0.3977446821402751E+01 0.3994259056066866E+01 0.4011095467111076E+01 0.4027955986175584E+01 0.4044840532489744E+01 + 0.4061749013633730E+01 0.4078681326279053E+01 0.4095637356908441E+01 0.4112616982511369E+01 0.4129620071256468E+01 + 0.4146646483140302E+01 0.4163696070611252E+01 0.4180768679168807E+01 0.4197864147938219E+01 0.4214982310220819E+01 + 0.4232122994020187E+01 0.4249286022544283E+01 0.4266471214683492E+01 0.4283678385466899E+01 0.4300907346494270E+01 + 0.4318157906348262E+01 0.4335429870982637E+01 0.4352723044092500E+01 0.4370037227462390E+01 0.4387372221295607E+01 + 0.4404727824526063E+01 0.4422103835109979E+01 0.4439500050301689E+01 0.4456916266912927E+01 0.4474352281555639E+01 + 0.4491807890868955E+01 0.4509282891733321E+01 0.4526777081468666E+01 0.4544290258021121E+01 0.4561822220135298E+01 + 0.4579372767515736E+01 0.4596941700976757E+01 0.4614528822579842E+01 0.4632133935763207E+01 0.4649756845459109E+01 + 0.4667397358203146E+01 0.4685055282234032E+01 0.4702730427585877E+01 0.4720422606171269E+01 0.4738131631857456E+01 + 0.4755857320535952E+01 0.4773599490184296E+01 0.4791357960922696E+01 0.4809132555063428E+01 0.4826923097156268E+01 + 0.4844729414026645E+01 0.4862551334810888E+01 0.4880388690984844E+01 0.4898241316389871E+01 0.4916109047253045E+01 + 0.4933991722205747E+01 0.4951889182295560E+01 0.4969801270997834E+01 0.4987727834222142E+01 0.5005668720316748E+01 + 0.5023623780069656E+01 0.5041592866707418E+01 0.5059575835892119E+01 0.5077572545715171E+01 0.5095582856689347E+01 + 0.5113606631739316E+01 0.5131643736190284E+01 0.5149694037754543E+01 0.5167757406516841E+01 0.5185833714918900E+01 + 0.5203922837741345E+01 0.5222024652085636E+01 0.5240139037355135E+01 0.5258265875233761E+01 0.5276405049664660E+01 + 0.5294556446828821E+01 0.5312719955121622E+01 0.5330895465129331E+01 0.5349083197331439E+01 0.5367282875848076E+01 + 0.5385494235244209E+01 0.5403717174591350E+01 0.5421951595034059E+01 0.5440197399763505E+01 0.5458454493990288E+01 + 0.5476722784918579E+01 0.5495002181717851E+01 0.5513292595496480E+01 0.5531593939274245E+01 0.5549906127955438E+01 + 0.5568229078301286E+01 0.5586562708902733E+01 0.5604906940153441E+01 0.5623261694222876E+01 0.5641626895028466E+01 + 0.5660002468209782E+01 0.5678388341101183E+01 0.5696784442705152E+01 0.5715190703666806E+01 0.5733607056245972E+01 + 0.5752033434292926E+01 0.5770469773221294E+01 0.5788916009983083E+01 0.5807372083043617E+01 0.5825837932355000E+01 + 0.5844313499333083E+01 0.5862798726831699E+01 0.5881293559118404E+01 0.5899797941851205E+01 0.5918311822053070E+01 + 0.5936835148090665E+01 0.5955367869649308E+01 0.5973909937710687E+01 0.5992461304530181E+01 0.6010993710199870E+01 + 0.6029563495483089E+01 0.6048142443794930E+01 0.6066730512264272E+01 0.6085327659184557E+01 0.6103933843993559E+01 + 0.6122549027251964E+01 0.6141173170624000E+01 0.6159806236856411E+01 0.6178448189759933E+01 0.6197098994189034E+01 + 0.6215758616023336E+01 0.6234427022148239E+01 0.6253104180437035E+01 0.6271790059732240E+01 0.6290484629827574E+01 + 0.6309187861451164E+01 0.6327899726246912E+01 0.6346620196758565E+01 0.6365349246411810E+01 0.6384086849498459E+01 + 0.6402832981160216E+01 0.6421587617372310E+01 0.6440350734927804E+01 0.6459122311422306E+01 0.6477902325238560E+01 + 0.6496690755531631E+01 0.6515487582214305E+01 0.6534292785942100E+01 0.6553106348100002E+01 0.6571928250787252E+01 + 0.6590758476804609E+01 0.6609597009640567E+01 0.6628443833458164E+01 0.6647298933081430E+01 0.6666162293983589E+01 + 0.6685033902273446E+01 0.6703913744683604E+01 0.6722801808558643E+01 0.6741698081842145E+01 0.6760602553065809E+01 + 0.6779515211338037E+01 0.6798436046331943E+01 0.6817365048274937E+01 0.6836302207937280E+01 0.6855247516621816E+01 + 0.6874200966153282E+01 0.6893162548867991E+01 0.6912132257603389E+01 0.6931110085688530E+01 0.6950096026934304E+01 + 0.6969090075623598E+01 0.6988092226501735E+01 0.7007102474767507E+01 0.7026120816064235E+01 0.7045147246470421E+01 + 0.7064181762491003E+01 0.7083224361049062E+01 0.7102275039477362E+01 0.7121333795510111E+01 0.7140400627274076E+01 + 0.7159475533281437E+01 0.7178558512421901E+01 0.7197649563954585E+01 0.7216748687500626E+01 0.7235855883035654E+01 + 0.7254971150883136E+01 0.7274094491705881E+01 0.7293225906500751E+01 0.7312365396590522E+01 0.7331512963616746E+01 + 0.7350668609535120E+01 0.7369832336606407E+01 0.7389004147392185E+01 0.7408184044746747E+01 0.7427372031812411E+01 + 0.7446568112012670E+01 0.7465772289046285E+01 0.7484984566881565E+01 0.7504204949750658E+01 0.7523433442143897E+01 + 0.7542670048804212E+01 0.7561914774721672E+01 0.7581167625127947E+01 0.7600428605492169E+01 0.7619697721514100E+01 + 0.7638974979120491E+01 0.7658260384459254E+01 0.7677553943895177E+01 0.7696855664005213E+01 0.7716165551573454E+01 + 0.7735483613586325E+01 0.7754812044852841E+01 0.7774146430634772E+01 0.7793489013893222E+01 0.7812839802364948E+01 + 0.7832198803967884E+01 0.7851566026796888E+01 0.7870941479120802E+01 0.7890325169377391E+01 0.7909717106169680E+01 + 0.7929117298262355E+01 0.7948525754578284E+01 0.7967942484194026E+01 0.7987367496337072E+01 0.8006800800381754E+01 + 0.8026242405846276E+01 0.8045692322388845E+01 0.8065150559804493E+01 0.8084617128021762E+01 0.8104092037099576E+01 + 0.8123575297224079E+01 0.8143066918705415E+01 0.8162566911974665E+01 0.8182075287581299E+01 0.8201592056189469E+01 + 0.8221117228575778E+01 0.8240650815626054E+01 0.8260192828332890E+01 0.8279743277792548E+01 0.8299302175202868E+01 + 0.8318869531860187E+01 0.8338445359156225E+01 0.8358029668577160E+01 0.8377622471699610E+01 0.8397223780188767E+01 + 0.8416833605796000E+01 0.8436451960357047E+01 0.8456078855787993E+01 0.8475714304085500E+01 0.8495358317322456E+01 + 0.8515010907646797E+01 0.8534672087279333E+01 0.8554341868511301E+01 0.8574020263702693E+01 0.8593707285279649E+01 + 0.8613402945733171E+01 0.8633107257617183E+01 0.8652820233545668E+01 0.8672541886191894E+01 0.8692272228285830E+01 + 0.8712011272612585E+01 0.8731759032010899E+01 0.8751515519370983E+01 0.8771280747633298E+01 0.8791054729785913E+01 + 0.8810837478864300E+01 0.8830629007948218E+01 0.8850429330161134E+01 0.8870238458668837E+01 0.8890056406676365E+01 + 0.8909883187428321E+01 0.8929718814206822E+01 0.8949563300329515E+01 0.8969416659148337E+01 0.8989278904048760E+01 + 0.9009150048447722E+01 0.9029030105792657E+01 0.9048919089560115E+01 0.9068817013254048E+01 0.9088723890405547E+01 + 0.9108639734570488E+01 0.9128564559328495E+01 0.9148498378283008E+01 0.9168441205058130E+01 0.9188393053299251E+01 + 0.9208353936670647E+01 0.9228323868854844E+01 0.9248302863551771E+01 0.9268290934477903E+01 0.9288288095363413E+01 + 0.9308294359953749E+01 0.9328309742007235E+01 0.9348334255293310E+01 0.9368367913593602E+01 0.9388410730698894E+01 + 0.9408462720409801E+01 0.9428523896534983E+01 0.9448594272890006E+01 0.9468673863297340E+01 0.9488762681584802E+01 + 0.9508860741584925E+01 0.9528968057134250E+01 0.9549084642072614E+01 0.9569210510241618E+01 0.9589345675484282E+01 + 0.9609490151644962E+01 0.9629643952567108E+01 0.9649807092094022E+01 0.9669979584066937E+01 0.9690161442325262E+01 + 0.9710352680705284E+01 0.9730553313039422E+01 0.9750763353155946E+01 0.9770982814877840E+01 0.9791211712022829E+01 + 0.9811450058402528E+01 0.9831697867820566E+01 0.9851955154073806E+01 0.9872221930951270E+01 0.9892498212232454E+01 + 0.9912784011688075E+01 0.9933079343078646E+01 0.9953384220154447E+01 0.9973698656654562E+01 0.9994022666306762E+01 + 0.1001435626282665E+02 0.1003470009456882E+02 0.1005505370279354E+02 0.1007541692221616E+02 0.1009578976686720E+02 + 0.1011617225075480E+02 0.1013656438786407E+02 0.1015696619215623E+02 0.1017737767756941E+02 0.1019779885801728E+02 + 0.1021822974738978E+02 0.1023867035955192E+02 0.1025912070834428E+02 0.1027958080758259E+02 0.1030005067105711E+02 + 0.1032053031253292E+02 0.1034101974574955E+02 0.1036151898442014E+02 0.1038202804223235E+02 0.1040254693284723E+02 + 0.1042307566989899E+02 0.1044361426699570E+02 0.1046416273771851E+02 0.1048472109562067E+02 0.1050528935422884E+02 + 0.1052586752704187E+02 0.1054645562753072E+02 0.1056705366913900E+02 0.1058766166528144E+02 0.1060827962934513E+02 + 0.1062890757468810E+02 0.1064950908609077E+02 0.1067015700336870E+02 0.1069081494185409E+02 0.1071148291478914E+02 + 0.1073216093538781E+02 0.1075284901683381E+02 0.1077354717228192E+02 0.1079425541485676E+02 0.1081497375765323E+02 + 0.1083570221373617E+02 0.1085644079614013E+02 0.1087718951786965E+02 0.1089794839189827E+02 0.1091871743116957E+02 + 0.1093949664859596E+02 0.1096028605705928E+02 0.1098108566940994E+02 0.1100189549846826E+02 0.1102271555702228E+02 + 0.1104354585782909E+02 0.1106438641361461E+02 0.1108523723707299E+02 0.1110609834086651E+02 0.1112696973762601E+02 + 0.1114785143995061E+02 0.1116874346040703E+02 0.1118964581153000E+02 0.1121055850582263E+02 0.1123148155575473E+02 + 0.1125241497376490E+02 0.1127335877225852E+02 0.1129431296360895E+02 0.1131527756015691E+02 0.1133625257420954E+02 + 0.1135723801804252E+02 0.1137823390389772E+02 0.1139924024398471E+02 0.1142025705047962E+02 0.1144128433552578E+02 + 0.1146232211123331E+02 0.1148337038967921E+02 0.1150442918290690E+02 0.1152549850292635E+02 0.1154657836171509E+02 + 0.1156766877121638E+02 0.1158876974333961E+02 0.1160988128996192E+02 0.1163100342292520E+02 0.1165213615403900E+02 + 0.1167327949507859E+02 0.1169443345778498E+02 0.1171559805386622E+02 0.1173677329499617E+02 0.1175795919281455E+02 + 0.1177915575892700E+02 0.1180036300490579E+02 0.1182158094228856E+02 0.1184280958257915E+02 0.1186404893724685E+02 + 0.1188529901772762E+02 0.1190655983542237E+02 0.1192783140169806E+02 0.1194911372788769E+02 0.1197040682528970E+02 + 0.1199171070516803E+02 0.1201302537875296E+02 0.1203435085723962E+02 0.1205568715178919E+02 0.1207703427352811E+02 + 0.1209839223354848E+02 0.1211976104290818E+02 0.1214114071263091E+02 0.1216253125370503E+02 0.1218393267708453E+02 + 0.1220534499368958E+02 0.1222676821440496E+02 0.1224820235008141E+02 0.1226964741153520E+02 0.1229110340954733E+02 + 0.1231257035486524E+02 0.1233404825820068E+02 0.1235553713023114E+02 0.1237703698160018E+02 0.1239854782291576E+02 + 0.1242006966475194E+02 0.1244160251764720E+02 0.1246314639210712E+02 0.1248470129860064E+02 0.1250626724756299E+02 + 0.1252784424939512E+02 0.1254943231446288E+02 0.1257103145309731E+02 0.1259264167559508E+02 0.1261426299221796E+02 + 0.1263589541319379E+02 0.1265753894871477E+02 0.1267919360893930E+02 0.1270085940399096E+02 0.1272253634395807E+02 + 0.1274422443889557E+02 0.1276592369882235E+02 0.1278763413372411E+02 0.1280935575355105E+02 0.1283108856821895E+02 + 0.1285283258760953E+02 0.1287458782156935E+02 0.1289635427991064E+02 0.1291813197241135E+02 0.1293992090881460E+02 + 0.1296172109882920E+02 0.1298353255212942E+02 0.1300535527835513E+02 0.1302718928711147E+02 0.1304903458796954E+02 + 0.1307089119046614E+02 0.1309275910410295E+02 0.1311463833834799E+02 0.1313652890263444E+02 0.1315843080636154E+02 + 0.1318034405889441E+02 0.1320226866956276E+02 0.1322420464766316E+02 0.1324615200245751E+02 0.1326811074317337E+02 + 0.1329008087900448E+02 0.1331206241910968E+02 0.1333405537261467E+02 0.1335605974861005E+02 0.1337807555615254E+02 + 0.1340010280426523E+02 0.1342214150193681E+02 0.1344419165812167E+02 0.1346625328174062E+02 0.1348832638168022E+02 + 0.1351041096679353E+02 0.1353250704589885E+02 0.1355461462778115E+02 0.1357673372119115E+02 0.1359886433484638E+02 + 0.1362100647742997E+02 0.1364316015759144E+02 0.1366532538394614E+02 0.1368750216507624E+02 0.1370969050953028E+02 + 0.1373189042582217E+02 0.1375410192243334E+02 0.1377632500781127E+02 0.1379855969036910E+02 0.1382080597848685E+02 + 0.1384306388051198E+02 0.1386533340475719E+02 0.1388761455950183E+02 0.1390990735299232E+02 0.1393221179344152E+02 + 0.1395452788902909E+02 0.1397685564790063E+02 0.1399919507816944E+02 0.1402154618791462E+02 0.1404390898518284E+02 + 0.1406628347798727E+02 0.1408866967430708E+02 0.1411106758208999E+02 0.1413347720924909E+02 0.1415589856366520E+02 + 0.1417833165318584E+02 0.1420077648562560E+02 0.1422323306876623E+02 0.1424570141035628E+02 0.1426818151811159E+02 + 0.1429067339971510E+02 0.1431317706281675E+02 0.1433569251503422E+02 0.1435821976395167E+02 0.1438075881712129E+02 + 0.1440330968206166E+02 0.1442587236626011E+02 0.1444844687717011E+02 0.1447103322221295E+02 0.1449363140877790E+02 + 0.1451624144422053E+02 0.1453886333586524E+02 0.1456149709100336E+02 0.1458414271689378E+02 0.1460680022076286E+02 + 0.1462946960980574E+02 0.1465215089118382E+02 0.1467483217256191E+02 0.1469751345393999E+02 0.1472019473531807E+02 + 0.0000000000000000E+00 0.1353993104251454E-10 0.8388292241576100E-09 0.9249073098372293E-08 0.5030460210239372E-07 + 0.1857568627085415E-06 0.5369197789403567E-06 0.1310591025996369E-05 0.2826805415934704E-05 0.5547382204843158E-05 + 0.1010438933657199E-04 0.1732779196828242E-04 0.2827168149581216E-04 0.4423859602721504E-04 0.6680154505955162E-04 + 0.9782344112589946E-04 0.1394737204414197E-03 0.1942420040555485E-03 0.2649487116051849E-03 0.3547525922860875E-03 + 0.4671551828778767E-03 0.6060022412741116E-03 0.7754822366296253E-03 0.9801220045380374E-03 0.1224779698140599E-02 + 0.1514635184246249E-02 0.1855178047873591E-02 0.2252193379531577E-02 0.2711745527424523E-02 0.3240160001952968E-02 + 0.3844003722708506E-02 0.4530063798923195E-02 0.5305325033301281E-02 0.6176946336577127E-02 0.7152236236230247E-02 + 0.8238627657747143E-02 0.9443652150831976E-02 0.1077491372619769E-01 0.1224006246116400E-01 0.1384676802438050E-01 + 0.1560269326170134E-01 0.1751546797666743E-01 0.1959266303029807E-01 0.2184176487603834E-01 0.2427015063682662E-01 + 0.2688506382240104E-01 0.2969359077621229E-01 0.3270263793270082E-01 0.3591890995727141E-01 0.3934888883309312E-01 + 0.4299881395089809E-01 0.4687466325027261E-01 0.5098213545355013E-01 0.5532663342634311E-01 0.5991324869200370E-01 + 0.6474674712088738E-01 0.6983155580921956E-01 0.7517175115663279E-01 0.8077104814605506E-01 0.8663279082458433E-01 + 0.9275994397927995E-01 0.9915508599743368E-01 0.1058204028968442E+00 0.1127576835079031E+00 0.1199683157858993E+00 + 0.1274532842288529E+00 0.1352131683733934E+00 0.1432481423386811E+00 0.1515579753861312E+00 0.1601420334607315E+00 + 0.1689992816780165E+00 0.1781282877192849E+00 0.1875272260963912E+00 0.1971938832464155E+00 0.2071256634156783E+00 + 0.2173195952919433E+00 0.2277723393431911E+00 0.2384801958210745E+00 0.2494391133870441E+00 0.2606446983191641E+00 + 0.2720922242578070E+00 0.2837766424487163E+00 0.2956925924423432E+00 0.3078344132088888E+00 0.3201961546291090E+00 + 0.3327715893216590E+00 0.3455542247685515E+00 0.3585373157011766E+00 0.3717138767102711E+00 0.3850766950442213E+00 + 0.3986183435611380E+00 0.4123311938012285E+00 0.4262074291471305E+00 0.4402390580410298E+00 0.4544179272285823E+00 + 0.4687357350008659E+00 0.4831840444068136E+00 0.4977542964098284E+00 0.5124378229635098E+00 0.5272258599826819E+00 + 0.5421095601871498E+00 0.5570800057968556E+00 0.5721282210583372E+00 0.5872451845836121E+00 0.6024218414838124E+00 + 0.6176491152810919E+00 0.6329179195834939E+00 0.6482191695086116E+00 0.6635437928430084E+00 0.6788827409254566E+00 + 0.6942269992431367E+00 0.7095675977309721E+00 0.7248956207653083E+00 0.7402022168441228E+00 0.7554786079469059E+00 + 0.7707160985682907E+00 0.7859060844203938E+00 0.8010400607996875E+00 0.8161096306150647E+00 0.8311065120745426E+00 + 0.8460225460288135E+00 0.8608497029705907E+00 0.8755800896893798E+00 0.8902059555819789E+00 0.9047196986196469E+00 + 0.9191138709734521E+00 0.9333811842999254E+00 0.9475145146896305E+00 0.9615069072817952E+00 0.9753515805486259E+00 + 0.9890419302533513E+00 0.1002571533086473E+01 0.1015934149985090E+01 0.1029123729140496E+01 0.1042134408699634E+01 + 0.1054960519166231E+01 0.1067596585507774E+01 0.1080037328974709E+01 0.1092277668638490E+01 0.1104312722655314E+01 + 0.1116137809262549E+01 0.1127748447515049E+01 0.1139140357768670E+01 0.1150309461918440E+01 0.1161251883398932E+01 + 0.1171963946954482E+01 0.1182442178186937E+01 0.1192683302888721E+01 0.1202684246168965E+01 0.1212442131380551E+01 + 0.1221954278855855E+01 0.1231218204459002E+01 0.1240231617962418E+01 0.1248992421255417E+01 0.1257498706392534E+01 + 0.1265748753489242E+01 0.1273741028472617E+01 0.1281474180694483E+01 0.1288947040414400E+01 0.1296158616159860E+01 + 0.1303108091970871E+01 0.1309794824536052E+01 0.1316218340227214E+01 0.1322378332039313E+01 0.1328274656442483E+01 + 0.1333907330152773E+01 0.1339276526828055E+01 0.1344382573695405E+01 0.1349225948116168E+01 0.1353807274094698E+01 + 0.1358127318736686E+01 0.1362186988662762E+01 0.1365987326382977E+01 0.1369529506637536E+01 0.1372814832709058E+01 + 0.1375844732711431E+01 0.1378620755860210E+01 0.1381144568729309E+01 0.1383417951498597E+01 0.1385442794196838E+01 + 0.1387221092944273E+01 0.1388754946198940E+01 0.1390046551010727E+01 0.1391098199286932E+01 0.1391912274073011E+01 + 0.1392491245851972E+01 0.1392837668865793E+01 0.1392954177462024E+01 0.1392843482468616E+01 0.1392508367599889E+01 + 0.1391951685896345E+01 0.1391176356200982E+01 0.1390185359674514E+01 0.1388981736351864E+01 0.1387568581742103E+01 + 0.1385949043473885E+01 0.1384126317988323E+01 0.1382103647281089E+01 0.1379884315695416E+01 0.1377471646767576E+01 + 0.1374869000126249E+01 0.1372079768447110E+01 0.1369107374463862E+01 0.1365955268036790E+01 0.1362626923279866E+01 + 0.1359125835747256E+01 0.1355455519680076E+01 0.1351619505314043E+01 0.1347621336248676E+01 0.1343464566878517E+01 + 0.1339152759886839E+01 0.1334689483802160E+01 0.1330078310617843E+01 0.1325322813474955E+01 0.1320426564408511E+01 + 0.1315393132157122E+01 0.1310226080036051E+01 0.1304928963873535E+01 0.1299505330010257E+01 0.1293958713361729E+01 + 0.1288292635543297E+01 0.1282510603057466E+01 0.1276616105543136E+01 0.1270612614086314E+01 0.1264503579591840E+01 + 0.1258292431215576E+01 0.1251982574856509E+01 0.1245577391708143E+01 0.1239080236868539E+01 0.1232494438008325E+01 + 0.1225823294095955E+01 0.1219070074179471E+01 0.1212238016223985E+01 0.1205330326004104E+01 0.1198350176050432E+01 + 0.1191300704649328E+01 0.1184185014895046E+01 0.1177006173793340E+01 0.1169767211415667E+01 0.1162471120103017E+01 + 0.1155120853718478E+01 0.1147719326947540E+01 0.1140269414645216E+01 0.1132773951228974E+01 0.1125235730116526E+01 + 0.1117657503207466E+01 0.1110041980407784E+01 0.1102391829196240E+01 0.1094709674231619E+01 0.1086998096999836E+01 + 0.1079259635499933E+01 0.1071496783967914E+01 0.1063711992637463E+01 0.1055907667536516E+01 0.1048086170318704E+01 + 0.1040249818128692E+01 0.1032400883500383E+01 0.1024541594287072E+01 0.1016674133622509E+01 0.1008800639911969E+01 + 0.1000923206852306E+01 0.9930438834801176E+00 0.9851646742469989E+00 0.9772875391210279E+00 0.9694143937135093E+00 + 0.9615471094301068E+00 0.9536875136454389E+00 0.9458373899002650E+00 0.9379984781203971E+00 0.9301724748564474E+00 + 0.9223610335436100E+00 0.9145657647805825E+00 0.9067882366268739E+00 0.8990299749176214E+00 0.8912924635951891E+00 + 0.8835771450567167E+00 0.8758854205168844E+00 0.8682186503851309E+00 0.8605781546565948E+00 0.8529652133160540E+00 + 0.8453810667541574E+00 0.8378269161952663E+00 0.8303039241362116E+00 0.8228132147953376E+00 0.8153558745711390E+00 + 0.8079329525099168E+00 0.8005454607817869E+00 0.7931943751644794E+00 0.7858806355343143E+00 0.7786051463638074E+00 + 0.7713687772253328E+00 0.7641723633003079E+00 0.7570167058933844E+00 0.7499025729511121E+00 0.7428306995846062E+00 + 0.7358017885957079E+00 0.7288165110062022E+00 0.7218755065895981E+00 0.7149793844050807E+00 0.7081287233331618E+00 + 0.7013240726126531E+00 0.6945659523785421E+00 0.6878548542003931E+00 0.6811912416209033E+00 0.6745755506942478E+00 + 0.6680081905238785E+00 0.6614895437994238E+00 0.6550199673323996E+00 0.6485997925903795E+00 0.6422293262293763E+00 + 0.6359088506240991E+00 0.6296386243958603E+00 0.6234188829378302E+00 0.6172498389374158E+00 0.6111316828955082E+00 + 0.6050645836423746E+00 0.5990486888499783E+00 0.5930841255405085E+00 0.5871710005909401E+00 0.5813094012334057E+00 + 0.5754993955512363E+00 0.5697410329704640E+00 0.5640343447466610E+00 0.5583793444469337E+00 0.5527760284269526E+00 + 0.5472243763028636E+00 0.5417243514179740E+00 0.5362759013040796E+00 0.5308789581373305E+00 0.5255334391885358E+00 + 0.5202392472678002E+00 0.5149962711634282E+00 0.5098043860749818E+00 0.5046634540404551E+00 0.4995733243574682E+00 + 0.4945338339984403E+00 0.4895448080196743E+00 0.4846060599643165E+00 0.4797173922591353E+00 0.4748785966051021E+00 + 0.4700894543617143E+00 0.4653497369250721E+00 0.4606592060996474E+00 0.4560176144637674E+00 0.4514247057287724E+00 + 0.4468802150918596E+00 0.4423838695826035E+00 0.4379353884031551E+00 0.4335344832621323E+00 0.4291808587022021E+00 + 0.4248742124213836E+00 0.4206142355880688E+00 0.4164006131498095E+00 0.4122330241358657E+00 0.4081111419535712E+00 + 0.4040346346785266E+00 0.4000031653386660E+00 0.3960163921922264E+00 0.3920739689996687E+00 0.3881755452895829E+00 + 0.3843207666186236E+00 0.3805092748255328E+00 0.3767407082792822E+00 0.3730147021214013E+00 0.3693308885025316E+00 + 0.3656888968132757E+00 0.3620883539093817E+00 0.3585288843313358E+00 0.3550101105184098E+00 0.3515316530172374E+00 + 0.3480931306849715E+00 0.3446941608870878E+00 0.3413343596899074E+00 0.3380133420478924E+00 0.3347307219857906E+00 + 0.3314861127756896E+00 0.3282791271090590E+00 0.3251093772638369E+00 0.3219764752666408E+00 0.3188800330501668E+00 + 0.3158196626058555E+00 0.3127949761318864E+00 0.3098055861765790E+00 0.3068511057772733E+00 0.3039311485947566E+00 + 0.3010453290433147E+00 0.2981932624164749E+00 0.2953745650085209E+00 0.2925888542318437E+00 0.2898357487302072E+00 + 0.2871148684879984E+00 0.2844258349355381E+00 0.2817682710505188E+00 0.2791418014556485E+00 0.2765460525125659E+00 + 0.2739806524121053E+00 0.2714452312609780E+00 0.2689394211649400E+00 0.2664628563085241E+00 0.2640151730313972E+00 + 0.2615960099014194E+00 0.2592050077844695E+00 0.2568418099111116E+00 0.2545060619401636E+00 0.2521974120192415E+00 + 0.2499155108423418E+00 0.2476600117045342E+00 0.2454305705538249E+00 0.2432268460402566E+00 0.2410484995623153E+00 + 0.2388951953107000E+00 0.2367666003095238E+00 0.2346623844550057E+00 0.2325822205517195E+00 0.2305257843464541E+00 + 0.2284927545597522E+00 0.2264828129151803E+00 0.2244956441663966E+00 0.2225309361220672E+00 0.2205883796686914E+00 + 0.2186676687913947E+00 0.2167685005927387E+00 0.2148905753096101E+00 0.2130335963282359E+00 0.2111972701973850E+00 + 0.2093813066398013E+00 0.2075854185619259E+00 0.2058093220619543E+00 0.2040527364362842E+00 0.2023153841843948E+00 + 0.2005969910122156E+00 0.1988972858340233E+00 0.1972160007729189E+00 0.1955528711599284E+00 0.1939076355317738E+00 + 0.1922800356273561E+00 0.1906698163829959E+00 0.1890767259264730E+00 0.1875005155699057E+00 0.1859409398015150E+00 + 0.1843977562763068E+00 0.1828707258057186E+00 0.1813596123462640E+00 0.1798641829872162E+00 0.1783842079373634E+00 + 0.1769194605108787E+00 0.1754697171123329E+00 0.1740347572208903E+00 0.1726143633737163E+00 0.1712083211486371E+00 + 0.1698164191460766E+00 0.1684384489703060E+00 0.1670742052100373E+00 0.1657234854183902E+00 0.1643860900922608E+00 + 0.1630618226511230E+00 0.1617504894152905E+00 0.1604518995836656E+00 0.1591658652110027E+00 0.1578922011847117E+00 + 0.1566307252012296E+00 0.1553812577419816E+00 0.1541436220489565E+00 0.1529176440999246E+00 0.1517031525833137E+00 + 0.1504999788727721E+00 0.1493079570014363E+00 0.1481269236359270E+00 0.1469567180500930E+00 0.1457971820985229E+00 + 0.1446481601898438E+00 0.1435094992598286E+00 0.1423810487443264E+00 0.1412626605520352E+00 0.1401541890371375E+00 + 0.1390554909718100E+00 0.1379664255186285E+00 0.1368868542028802E+00 0.1358166408848024E+00 0.1347556517317591E+00 + 0.1337037551903719E+00 0.1326608219586172E+00 0.1316267249579071E+00 0.1306013393051614E+00 0.1295845422848884E+00 + 0.1285762133212826E+00 0.1275762339503552E+00 0.1265844877921041E+00 0.1256008605227379E+00 0.1246252398469633E+00 + 0.1236575154703454E+00 0.1226975790717512E+00 0.1217453242758857E+00 0.1208006466259300E+00 0.1198634435562893E+00 + 0.1189336143654594E+00 0.1180110601890202E+00 0.1170956839727626E+00 0.1161873904459593E+00 0.1152860860947805E+00 + 0.1143916791358692E+00 0.1135040794900743E+00 0.1126231987563555E+00 0.1117489501858582E+00 0.1108812486561707E+00 + 0.1100200106457653E+00 0.1091651542086276E+00 0.1083165989490820E+00 0.1074742659968154E+00 0.1066380779821052E+00 + 0.1058079590112519E+00 0.1049838346422265E+00 0.1041656318605295E+00 0.1033532790552702E+00 0.1025467059954647E+00 + 0.1017458438065610E+00 0.1009506249471885E+00 0.1001609831861390E+00 0.9937685357957692E-01 0.9859817244848566E-01 + 0.9782487735634983E-01 0.9705690708707349E-01 0.9629420162313919E-01 0.9553670212400750E-01 0.9478435090475915E-01 + 0.9403709141497944E-01 0.9329486821788784E-01 0.9255762696971309E-01 0.9182531439931366E-01 0.9109787828804443E-01 + 0.9037526744987140E-01 0.8965743171173354E-01 0.8894432189415159E-01 0.8823588979208480E-01 0.8753208815603555E-01 + 0.8683287067340226E-01 0.8613819195007733E-01 0.8544800749229453E-01 0.8476227368872161E-01 0.8408094779279952E-01 + 0.8340398790532604E-01 0.8273135295728512E-01 0.8206300269292026E-01 0.8139889765304979E-01 0.8073899915862499E-01 + 0.8008326929452908E-01 0.7943167089361686E-01 0.7878416752099129E-01 0.7814072345852002E-01 0.7750130368958605E-01 + 0.7686587388407512E-01 0.7623440038359473E-01 0.7560685018692687E-01 0.7498319093571042E-01 0.7436339090035288E-01 + 0.7374741896616860E-01 0.7313524461974377E-01 0.7252683793552536E-01 0.7192216956263091E-01 0.7132121071188088E-01 + 0.7072393314304767E-01 0.7013030915232332E-01 0.6954031156000041E-01 0.6895391369836718E-01 0.6837108939981353E-01 + 0.6779181298514624E-01 0.6721605925211059E-01 0.6664380346411826E-01 0.6607502133917825E-01 0.6550968903902774E-01 + 0.6494778315846379E-01 0.6438928071487048E-01 0.6383415913794230E-01 0.6328239625959906E-01 0.6273397030409252E-01 + 0.6218885987830131E-01 0.6164704396221248E-01 0.6110850189958664E-01 0.6057321338880634E-01 0.6004115847390429E-01 + 0.5951231753576908E-01 0.5898667128352685E-01 0.5846420074609691E-01 0.5794488726391903E-01 0.5742871248084910E-01 + 0.5691565833622340E-01 0.5640570705708669E-01 0.5589884115058460E-01 0.5539504339651542E-01 0.5489429684004177E-01 + 0.5439658478455860E-01 0.5390189078471544E-01 0.5341019863959112E-01 0.5292149238601910E-01 0.5243575629206128E-01 + 0.5195297485062703E-01 0.5147313277323774E-01 0.5099621498393213E-01 0.5052220661331305E-01 0.5005109299273101E-01 + 0.4958285964860470E-01 0.4911749229687554E-01 0.4865497683759399E-01 0.4819529934963621E-01 0.4773844608554897E-01 + 0.4728440346652141E-01 0.4683315807748007E-01 0.4638469666230777E-01 0.4593900611918208E-01 0.4549607349603369E-01 + 0.4505588598612064E-01 0.4461843092371864E-01 0.4418369577992455E-01 0.4375166815857148E-01 0.4332233579225347E-01 + 0.4289568653845881E-01 0.4247170837580991E-01 0.4205038940040735E-01 0.4163171782227736E-01 0.4121568196192090E-01 + 0.4080227024696274E-01 0.4039147120889799E-01 0.3998327347993617E-01 0.3957766578994016E-01 0.3917463696345855E-01 + 0.3877417591685010E-01 0.3837627165549899E-01 0.3798091327111933E-01 0.3758808993914695E-01 0.3719779091621782E-01 + 0.3681000553773126E-01 0.3642472321549702E-01 0.3604193343546399E-01 0.3566162575553031E-01 0.3528378980343305E-01 + 0.3490841527471608E-01 0.3453549193077510E-01 0.3416500959697864E-01 0.3379695816086406E-01 0.3343132757040658E-01 + 0.3306810783236118E-01 0.3270728901067565E-01 0.3234886122497425E-01 0.3199281464910996E-01 0.3163913950978563E-01 + 0.3128782608524168E-01 0.3093886470401072E-01 0.3059224574373675E-01 0.3024795963005924E-01 0.2990599683556058E-01 + 0.2956634787877624E-01 0.2922900332326631E-01 0.2889395377674870E-01 0.2856118989029233E-01 0.2823070235756949E-01 + 0.2790248191416771E-01 0.2757651933695894E-01 0.2725280544352705E-01 0.2693133109165141E-01 0.2661208717884729E-01 + 0.2629506464196176E-01 0.2598025445682497E-01 0.2566764763795566E-01 0.2535723523832159E-01 0.2504900834915327E-01 + 0.2474295809981158E-01 0.2443907565770799E-01 0.2413735222827780E-01 0.2383777905500606E-01 0.2354034741950517E-01 + 0.2324504864164501E-01 0.2295187407973472E-01 0.2266081513075604E-01 0.2237186323064830E-01 0.2208500985464502E-01 + 0.2180024651766184E-01 0.2151756477473634E-01 0.2123695622151859E-01 0.2095841249481422E-01 0.2068192527317876E-01 + 0.2040748627756411E-01 0.2013508727201714E-01 0.1986472006443057E-01 0.1959637650734679E-01 0.1933004849881481E-01 + 0.1906572798330038E-01 0.1880340695265023E-01 0.1854307744711091E-01 0.1828473155640220E-01 0.1802836142084625E-01 + 0.1777395923255295E-01 0.1752151723666215E-01 0.1727102773264334E-01 0.1702248307565384E-01 0.1677587567795624E-01 + 0.1653119801039607E-01 0.1628844260394024E-01 0.1604760205127793E-01 0.1580866900848456E-01 0.1557163619674996E-01 + 0.1533649640417201E-01 0.1510324248761716E-01 0.1487186737464884E-01 0.1464236406552526E-01 0.1441472563526792E-01 + 0.1418894523580252E-01 0.1396501609817369E-01 0.1374293153483488E-01 0.1352268494201562E-01 0.1330426980216726E-01 + 0.1308767968648953E-01 0.1287290825753935E-01 0.1265994927192371E-01 0.1244879658307933E-01 0.1223944414413996E-01 + 0.1203188601089432E-01 0.1182611634483635E-01 0.1162212941630988E-01 0.1141991960775031E-01 0.1121948141702494E-01 + 0.1102080946087490E-01 0.1082389847846042E-01 0.1062874333501194E-01 0.1043533902558977E-01 0.1024368067895393E-01 + 0.1005376356154735E-01 0.9865583081593922E-02 0.9679134793314684E-02 0.9494414401263529E-02 0.9311417764785166E-02 + 0.9130140902597625E-02 0.8950579997500882E-02 0.8772731401214267E-02 0.8596591639343950E-02 0.8422157416482423E-02 + 0.8249425621441884E-02 0.8078393332622082E-02 0.7909057823514530E-02 0.7741416568343256E-02 0.7575467247842871E-02 + 0.7411207755174127E-02 0.7248636201976184E-02 0.7087750924555473E-02 0.6928550490209059E-02 0.6771033703680868E-02 + 0.6615199613748215E-02 0.6461047519934641E-02 0.6308576979345235E-02 0.6157787813618597E-02 0.6008680115989046E-02 + 0.5861254258451652E-02 0.5715510899020261E-02 0.5571450989068522E-02 0.5429075780740853E-02 0.5288386834419521E-02 + 0.5149386026230897E-02 0.5012075555572173E-02 0.4876457952637328E-02 0.4742536085917297E-02 0.4610313169647435E-02 + 0.4479792771170533E-02 0.4350978818180493E-02 0.4223875605807347E-02 0.4098487803498918E-02 0.3974820461650163E-02 + 0.3852879017924298E-02 0.3732669303204216E-02 0.3614197547105479E-02 0.3497470382973937E-02 0.3382494852283408E-02 + 0.3269278408338597E-02 0.3157828919178777E-02 0.3048154669566634E-02 0.2940264361933685E-02 0.2834167116141327E-02 + 0.2729872467901025E-02 0.2627390365681719E-02 0.2526731165915232E-02 0.2427905626291050E-02 0.2330924896912227E-02 + 0.2235800509061165E-02 0.2142544361300639E-02 0.2051168702609613E-02 0.1961686112225166E-02 0.1874109475832896E-02 + 0.1788451957715710E-02 0.1704726968437611E-02 0.1622948127603452E-02 0.1543129221197582E-02 0.1465284152965789E-02 + 0.1389426889263572E-02 0.1315571396752711E-02 0.1243731572285281E-02 0.1173921164272465E-02 0.1106153684794404E-02 + 0.1040442311668004E-02 0.9767997796547971E-03 0.9152382599604941E-03 0.8557692271559906E-03 0.7984033126378760E-03 + 0.7431501437484684E-03 0.6900181676963877E-03 0.6390144594619438E-03 0.5901445129451447E-03 0.5434120147240581E-03 + 0.4988185999463610E-03 0.4563635900883120E-03 0.4160437125934487E-03 0.3778528027632167E-03 0.3417814887280997E-03 + 0.3078168608981688E-03 0.2759421279962239E-03 0.2461362626341978E-03 0.2183736404266527E-03 0.1926236778641105E-03 + 0.1688504756124491E-03 0.1470124755772384E-03 0.1270621419785909E-03 0.1089456788163143E-03 0.9260279843818645E-04 + 0.7796655839983218E-04 0.6496328632466781E-04 0.5351261488371726E-04 0.4352765109263255E-04 0.3491530554961739E-04 + 0.2757680758595959E-04 0.2140843101578471E-04 0.1630245156608879E-04 0.1214835033531085E-04 0.8834266891203550E-05 + 0.6248690035680286E-05 0.4282353222462611E-05 0.2830275035848309E-05 0.1793853932613698E-05 0.1082893085919590E-05 + 0.6174003285747537E-06 0.3289872539180627E-06 0.1616905202076728E-06 0.7206870776681014E-07 0.2849911999804606E-07 + 0.9712198708650968E-08 0.2742442283547959E-08 0.6076172112450161E-09 0.9772731077597771E-10 0.1017048852958432E-10 + 0.5734341782146348E-12 0.1311491489053561E-13 0.7338688834175233E-16 0.3808514445153469E-19 0.2185032842849075E-24 + 0.4450194794086531E-34 0.4448435176905321E-58 0.1173305758391880E-217 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.1353993104251454E-10 0.8388292241576100E-09 0.9249073098372293E-08 0.5030460210239372E-07 + 0.1857568627085415E-06 0.5369197789403567E-06 0.1310591025996369E-05 0.2826805415934704E-05 0.5547382204843158E-05 + 0.1010438933657199E-04 0.1732779196828242E-04 0.2827168149581216E-04 0.4423859602721504E-04 0.6680154505955162E-04 + 0.9782344112589946E-04 0.1394737204414197E-03 0.1942420040555485E-03 0.2649487116051849E-03 0.3547525922860875E-03 + 0.4671551828778767E-03 0.6060022412741116E-03 0.7754822366296253E-03 0.9801220045380374E-03 0.1224779698140599E-02 + 0.1514635184246249E-02 0.1855178047873591E-02 0.2252193379531577E-02 0.2711745527424523E-02 0.3240160001952968E-02 + 0.3844003722708506E-02 0.4530063798923195E-02 0.5305325033301281E-02 0.6176946336577127E-02 0.7152236236230247E-02 + 0.8238627657747143E-02 0.9443652150831976E-02 0.1077491372619769E-01 0.1224006246116400E-01 0.1384676802438050E-01 + 0.1560269326170134E-01 0.1751546797666743E-01 0.1959266303029807E-01 0.2184176487603834E-01 0.2427015063682662E-01 + 0.2688506382240104E-01 0.2969359077621229E-01 0.3270263793270082E-01 0.3591890995727141E-01 0.3934888883309312E-01 + 0.4299881395089809E-01 0.4687466325027261E-01 0.5098213545355013E-01 0.5532663342634311E-01 0.5991324869200370E-01 + 0.6474674712088738E-01 0.6983155580921956E-01 0.7517175115663279E-01 0.8077104814605506E-01 0.8663279082458433E-01 + 0.9275994397927995E-01 0.9915508599743368E-01 0.1058204028968442E+00 0.1127576835079031E+00 0.1199683157858993E+00 + 0.1274532842288529E+00 0.1352131683733934E+00 0.1432481423386811E+00 0.1515579753861312E+00 0.1601420334607315E+00 + 0.1689992816780165E+00 0.1781282877192849E+00 0.1875272260963912E+00 0.1971938832464155E+00 0.2071256634156783E+00 + 0.2173195952919433E+00 0.2277723393431911E+00 0.2384801958210745E+00 0.2494391133870441E+00 0.2606446983191641E+00 + 0.2720922242578070E+00 0.2837766424487163E+00 0.2956925924423432E+00 0.3078344132088888E+00 0.3201961546291090E+00 + 0.3327715893216590E+00 0.3455542247685515E+00 0.3585373157011766E+00 0.3717138767102711E+00 0.3850766950442213E+00 + 0.3986183435611380E+00 0.4123311938012285E+00 0.4262074291471305E+00 0.4402390580410298E+00 0.4544179272285823E+00 + 0.4687357350008659E+00 0.4831840444068136E+00 0.4977542964098284E+00 0.5124378229635098E+00 0.5272258599826819E+00 + 0.5421095601871498E+00 0.5570800057968556E+00 0.5721282210583372E+00 0.5872451845836121E+00 0.6024218414838124E+00 + 0.6176491152810919E+00 0.6329179195834939E+00 0.6482191695086116E+00 0.6635437928430084E+00 0.6788827409254566E+00 + 0.6942269992431367E+00 0.7095675977309721E+00 0.7248956207653083E+00 0.7402022168441228E+00 0.7554786079469059E+00 + 0.7707160985682907E+00 0.7859060844203938E+00 0.8010400607996875E+00 0.8161096306150647E+00 0.8311065120745426E+00 + 0.8460225460288135E+00 0.8608497029705907E+00 0.8755800896893798E+00 0.8902059555819789E+00 0.9047196986196469E+00 + 0.9191138709734521E+00 0.9333811842999254E+00 0.9475145146896305E+00 0.9615069072817952E+00 0.9753515805486259E+00 + 0.9890419302533513E+00 0.1002571533086473E+01 0.1015934149985090E+01 0.1029123729140496E+01 0.1042134408699634E+01 + 0.1054960519166231E+01 0.1067596585507774E+01 0.1080037328974709E+01 0.1092277668638490E+01 0.1104312722655314E+01 + 0.1116137809262549E+01 0.1127748447515049E+01 0.1139140357768670E+01 0.1150309461918440E+01 0.1161251883398932E+01 + 0.1171963946954482E+01 0.1182442178186937E+01 0.1192683302888721E+01 0.1202684246168965E+01 0.1212442131380551E+01 + 0.1221954278855855E+01 0.1231218204459002E+01 0.1240231617962418E+01 0.1248992421255417E+01 0.1257498706392534E+01 + 0.1265748753489242E+01 0.1273741028472617E+01 0.1281474180694483E+01 0.1288947040414400E+01 0.1296158616159860E+01 + 0.1303108091970871E+01 0.1309794824536052E+01 0.1316218340227214E+01 0.1322378332039313E+01 0.1328274656442483E+01 + 0.1333907330152773E+01 0.1339276526828055E+01 0.1344382573695405E+01 0.1349225948116168E+01 0.1353807274094698E+01 + 0.1358127318736686E+01 0.1362186988662762E+01 0.1365987326382977E+01 0.1369529506637536E+01 0.1372814832709058E+01 + 0.1375844732711431E+01 0.1378620755860210E+01 0.1381144568729309E+01 0.1383417951498597E+01 0.1385442794196838E+01 + 0.1387221092944273E+01 0.1388754946198940E+01 0.1390046551010727E+01 0.1391098199286932E+01 0.1391912274073011E+01 + 0.1392491245851972E+01 0.1392837668865793E+01 0.1392954177462024E+01 0.1392843482468616E+01 0.1392508367599889E+01 + 0.1391951685896345E+01 0.1391176356200982E+01 0.1390185359674514E+01 0.1388981736351864E+01 0.1387568581742103E+01 + 0.1385949043473885E+01 0.1384126317988323E+01 0.1382103647281089E+01 0.1379884315695416E+01 0.1377471646767576E+01 + 0.1374869000126249E+01 0.1372079768447110E+01 0.1369107374463862E+01 0.1365955268036790E+01 0.1362626923279866E+01 + 0.1359125835747256E+01 0.1355455519680076E+01 0.1351619505314043E+01 0.1347621336248676E+01 0.1343464566878517E+01 + 0.1339152759886839E+01 0.1334689483802160E+01 0.1330078310617843E+01 0.1325322813474955E+01 0.1320426564408511E+01 + 0.1315393132157122E+01 0.1310226080036051E+01 0.1304928963873535E+01 0.1299505330010257E+01 0.1293958713361729E+01 + 0.1288292635543297E+01 0.1282510603057466E+01 0.1276616105543136E+01 0.1270612614086314E+01 0.1264503579591840E+01 + 0.1258292431215576E+01 0.1251982574856509E+01 0.1245577391708143E+01 0.1239080236868539E+01 0.1232494438008325E+01 + 0.1225823294095955E+01 0.1219070074179471E+01 0.1212238016223985E+01 0.1205330326004104E+01 0.1198350176050432E+01 + 0.1191300704649328E+01 0.1184185014895046E+01 0.1177006173793340E+01 0.1169767211415667E+01 0.1162471120103017E+01 + 0.1155120853718478E+01 0.1147719326947540E+01 0.1140269414645216E+01 0.1132773951228974E+01 0.1125235730116526E+01 + 0.1117657503207466E+01 0.1110041980407784E+01 0.1102391829196240E+01 0.1094709674231619E+01 0.1086998096999836E+01 + 0.1079259635499933E+01 0.1071496783967914E+01 0.1063711992637463E+01 0.1055907667536516E+01 0.1048086170318704E+01 + 0.1040249818128692E+01 0.1032400883500383E+01 0.1024541594287072E+01 0.1016674133622509E+01 0.1008800639911969E+01 + 0.1000923206852306E+01 0.9930438834801176E+00 0.9851646742469989E+00 0.9772875391210279E+00 0.9694143937135093E+00 + 0.9615471094301068E+00 0.9536875136454389E+00 0.9458373899002650E+00 0.9379984781203971E+00 0.9301724748564474E+00 + 0.9223610335436100E+00 0.9145657647805825E+00 0.9067882366268739E+00 0.8990299749176214E+00 0.8912924635951891E+00 + 0.8835771450567167E+00 0.8758854205168844E+00 0.8682186503851309E+00 0.8605781546565948E+00 0.8529652133160540E+00 + 0.8453810667541574E+00 0.8378269161952663E+00 0.8303039241362116E+00 0.8228132147953376E+00 0.8153558745711390E+00 + 0.8079329525099168E+00 0.8005454607817869E+00 0.7931943751644794E+00 0.7858806355343143E+00 0.7786051463638074E+00 + 0.7713687772253328E+00 0.7641723633003079E+00 0.7570167058933844E+00 0.7499025729511121E+00 0.7428306995846062E+00 + 0.7358017885957079E+00 0.7288165110062022E+00 0.7218755065895981E+00 0.7149793844050807E+00 0.7081287233331618E+00 + 0.7013240726126531E+00 0.6945659523785421E+00 0.6878548542003931E+00 0.6811912416209033E+00 0.6745755506942478E+00 + 0.6680081905238785E+00 0.6614895437994238E+00 0.6550199673323996E+00 0.6485997925903795E+00 0.6422293262293763E+00 + 0.6359088506240991E+00 0.6296386243958603E+00 0.6234188829378302E+00 0.6172498389374158E+00 0.6111316828955082E+00 + 0.6050645836423746E+00 0.5990486888499783E+00 0.5930841255405085E+00 0.5871710005909401E+00 0.5813094012334057E+00 + 0.5754993955512363E+00 0.5697410329704640E+00 0.5640343447466610E+00 0.5583793444469337E+00 0.5527760284269526E+00 + 0.5472243763028636E+00 0.5417243514179740E+00 0.5362759013040796E+00 0.5308789581373305E+00 0.5255334391885358E+00 + 0.5202392472678002E+00 0.5149962711634282E+00 0.5098043860749818E+00 0.5046634540404551E+00 0.4995733243574682E+00 + 0.4945338339984403E+00 0.4895448080196743E+00 0.4846060599643165E+00 0.4797173922591353E+00 0.4748785966051021E+00 + 0.4700894543617143E+00 0.4653497369250721E+00 0.4606592060996474E+00 0.4560176144637674E+00 0.4514247057287724E+00 + 0.4468802150918596E+00 0.4423838695826035E+00 0.4379353884031551E+00 0.4335344832621323E+00 0.4291808587022021E+00 + 0.4248742124213836E+00 0.4206142355880688E+00 0.4164006131498095E+00 0.4122330241358657E+00 0.4081111419535712E+00 + 0.4040346346785266E+00 0.4000031653386660E+00 0.3960163921922264E+00 0.3920739689996687E+00 0.3881755452895829E+00 + 0.3843207666186236E+00 0.3805092748255328E+00 0.3767407082792822E+00 0.3730147021214013E+00 0.3693308885025316E+00 + 0.3656888968132757E+00 0.3620883539093817E+00 0.3585288843313358E+00 0.3550101105184098E+00 0.3515316530172374E+00 + 0.3480931306849715E+00 0.3446941608870878E+00 0.3413343596899074E+00 0.3380133420478924E+00 0.3347307219857906E+00 + 0.3314861127756896E+00 0.3282791271090590E+00 0.3251093772638369E+00 0.3219764752666408E+00 0.3188800330501668E+00 + 0.3158196626058555E+00 0.3127949761318864E+00 0.3098055861765790E+00 0.3068511057772733E+00 0.3039311485947566E+00 + 0.3010453290433147E+00 0.2981932624164749E+00 0.2953745650085209E+00 0.2925888542318437E+00 0.2898357487302072E+00 + 0.2871148684879984E+00 0.2844258349355381E+00 0.2817682710505188E+00 0.2791418014556485E+00 0.2765460525125659E+00 + 0.2739806524121053E+00 0.2714452312609780E+00 0.2689394211649400E+00 0.2664628563085241E+00 0.2640151730313972E+00 + 0.2615960099014194E+00 0.2592050077844695E+00 0.2568418099111116E+00 0.2545060619401636E+00 0.2521974120192415E+00 + 0.2499155108423418E+00 0.2476600117045342E+00 0.2454305705538249E+00 0.2432268460402566E+00 0.2410484995623153E+00 + 0.2388951953107000E+00 0.2367666003095238E+00 0.2346623844550057E+00 0.2325822205517195E+00 0.2305257843464541E+00 + 0.2284927545597522E+00 0.2264828129151803E+00 0.2244956441663966E+00 0.2225309361220672E+00 0.2205883796686914E+00 + 0.2186676687913947E+00 0.2167685005927387E+00 0.2148905753096101E+00 0.2130335963282359E+00 0.2111972701973850E+00 + 0.2093813066398013E+00 0.2075854185619259E+00 0.2058093220619543E+00 0.2040527364362842E+00 0.2023153841843948E+00 + 0.2005969910122156E+00 0.1988972858340233E+00 0.1972160007729189E+00 0.1955528711599284E+00 0.1939076355317738E+00 + 0.1922800356273561E+00 0.1906698163829959E+00 0.1890767259264730E+00 0.1875005155699057E+00 0.1859409398015150E+00 + 0.1843977562763068E+00 0.1828707258057186E+00 0.1813596123462640E+00 0.1798641829872162E+00 0.1783842079373634E+00 + 0.1769194605108787E+00 0.1754697171123329E+00 0.1740347572208903E+00 0.1726143633737163E+00 0.1712083211486371E+00 + 0.1698164191460766E+00 0.1684384489703060E+00 0.1670742052100373E+00 0.1657234854183902E+00 0.1643860900922608E+00 + 0.1630618226511230E+00 0.1617504894152905E+00 0.1604518995836656E+00 0.1591658652110027E+00 0.1578922011847117E+00 + 0.1566307252012296E+00 0.1553812577419816E+00 0.1541436220489565E+00 0.1529176440999246E+00 0.1517031525833137E+00 + 0.1504999788727721E+00 0.1493079570014363E+00 0.1481269236359270E+00 0.1469567180500930E+00 0.1457971820985229E+00 + 0.1446481601898438E+00 0.1435094992598286E+00 0.1423810487443264E+00 0.1412626605520352E+00 0.1401541890371375E+00 + 0.1390554909718100E+00 0.1379664255186285E+00 0.1368868542028802E+00 0.1358166408848024E+00 0.1347556517317591E+00 + 0.1337037551903719E+00 0.1326608219586172E+00 0.1316267249579071E+00 0.1306013393051614E+00 0.1295845422848884E+00 + 0.1285762133212826E+00 0.1275762339503552E+00 0.1265844877921041E+00 0.1256008605227379E+00 0.1246252398469633E+00 + 0.1236575154703454E+00 0.1226975790717512E+00 0.1217453242758857E+00 0.1208006466259300E+00 0.1198634435562893E+00 + 0.1189336143654594E+00 0.1180110601890202E+00 0.1170956839727626E+00 0.1161873904459593E+00 0.1152860860947805E+00 + 0.1143916791358692E+00 0.1135040794900743E+00 0.1126231987563555E+00 0.1117489501858582E+00 0.1108812486561707E+00 + 0.1100200106457653E+00 0.1091651542086276E+00 0.1083165989490820E+00 0.1074742659968154E+00 0.1066380779821052E+00 + 0.1058079590112519E+00 0.1049838346422265E+00 0.1041656318605295E+00 0.1033532790552702E+00 0.1025467059954647E+00 + 0.1017458438065610E+00 0.1009506249471885E+00 0.1001609831861390E+00 0.9937685357957692E-01 0.9859817244848566E-01 + 0.9782487735634983E-01 0.9705690708707349E-01 0.9629420162313919E-01 0.9553670212400750E-01 0.9478435090475915E-01 + 0.9403709141497944E-01 0.9329486821788784E-01 0.9255762696971309E-01 0.9182531439931366E-01 0.9109787828804443E-01 + 0.9037526744987140E-01 0.8965743171173354E-01 0.8894432189415159E-01 0.8823588979208480E-01 0.8753208815603555E-01 + 0.8683287067340226E-01 0.8613819195007733E-01 0.8544800749229453E-01 0.8476227368872161E-01 0.8408094779279952E-01 + 0.8340398790532604E-01 0.8273135295728512E-01 0.8206300269292026E-01 0.8139889765304979E-01 0.8073899915862499E-01 + 0.8008326929452908E-01 0.7943167089361686E-01 0.7878416752099129E-01 0.7814072345852002E-01 0.7750130368958605E-01 + 0.7686587388407512E-01 0.7623440038359473E-01 0.7560685018692687E-01 0.7498319093571042E-01 0.7436339090035288E-01 + 0.7374741896616860E-01 0.7313524461974377E-01 0.7252683793552536E-01 0.7192216956263091E-01 0.7132121071188088E-01 + 0.7072393314304767E-01 0.7013030915232332E-01 0.6954031156000041E-01 0.6895391369836718E-01 0.6837108939981353E-01 + 0.6779181298514624E-01 0.6721605925211059E-01 0.6664380346411826E-01 0.6607502133917825E-01 0.6550968903902774E-01 + 0.6494778315846379E-01 0.6438928071487048E-01 0.6383415913794230E-01 0.6328239625959906E-01 0.6273397030409252E-01 + 0.6218885987830131E-01 0.6164704396221248E-01 0.6110850189958664E-01 0.6057321338880634E-01 0.6004115847390429E-01 + 0.5951231753576908E-01 0.5898667128352685E-01 0.5846420074609691E-01 0.5794488726391903E-01 0.5742871248084910E-01 + 0.5691565833622340E-01 0.5640570705708669E-01 0.5589884115058460E-01 0.5539504339651542E-01 0.5489429684004177E-01 + 0.5439658478455860E-01 0.5390189078471544E-01 0.5341019863959112E-01 0.5292149238601910E-01 0.5243575629206128E-01 + 0.5195297485062703E-01 0.5147313277323774E-01 0.5099621498393213E-01 0.5052220661331305E-01 0.5005109299273101E-01 + 0.4958285964860470E-01 0.4911749229687554E-01 0.4865497683759399E-01 0.4819529934963621E-01 0.4773844608554897E-01 + 0.4728440346652141E-01 0.4683315807748007E-01 0.4638469666230777E-01 0.4593900611918208E-01 0.4549607349603369E-01 + 0.4505588598612064E-01 0.4461843092371864E-01 0.4418369577992455E-01 0.4375166815857148E-01 0.4332233579225347E-01 + 0.4289568653845881E-01 0.4247170837580991E-01 0.4205038940040735E-01 0.4163171782227736E-01 0.4121568196192090E-01 + 0.4080227024696274E-01 0.4039147120889799E-01 0.3998327347993617E-01 0.3957766578994016E-01 0.3917463696345855E-01 + 0.3877417591685010E-01 0.3837627165549899E-01 0.3798091327111933E-01 0.3758808993914695E-01 0.3719779091621782E-01 + 0.3681000553773126E-01 0.3642472321549702E-01 0.3604193343546399E-01 0.3566162575553031E-01 0.3528378980343305E-01 + 0.3490841527471608E-01 0.3453549193077510E-01 0.3416500959697864E-01 0.3379695816086406E-01 0.3343132757040658E-01 + 0.3306810783236118E-01 0.3270728901067565E-01 0.3234886122497425E-01 0.3199281464910996E-01 0.3163913950978563E-01 + 0.3128782608524168E-01 0.3093886470401072E-01 0.3059224574373675E-01 0.3024795963005924E-01 0.2990599683556058E-01 + 0.2956634787877624E-01 0.2922900332326631E-01 0.2889395377674870E-01 0.2856118989029233E-01 0.2823070235756949E-01 + 0.2790248191416771E-01 0.2757651933695894E-01 0.2725280544352705E-01 0.2693133109165141E-01 0.2661208717884729E-01 + 0.2629506464196176E-01 0.2598025445682497E-01 0.2566764763795566E-01 0.2535723523832159E-01 0.2504900834915327E-01 + 0.2474295809981158E-01 0.2443907565770799E-01 0.2413735222827780E-01 0.2383777905500606E-01 0.2354034741950517E-01 + 0.2324504864164501E-01 0.2295187407973472E-01 0.2266081513075604E-01 0.2237186323064830E-01 0.2208500985464502E-01 + 0.2180024651766184E-01 0.2151756477473634E-01 0.2123695622151859E-01 0.2095841249481422E-01 0.2068192527317876E-01 + 0.2040748627756411E-01 0.2013508727201714E-01 0.1986472006443057E-01 0.1959637650734679E-01 0.1933004849881481E-01 + 0.1906572798330038E-01 0.1880340695265023E-01 0.1854307744711091E-01 0.1828473155640220E-01 0.1802836142084625E-01 + 0.1777395923255295E-01 0.1752151723666215E-01 0.1727102773264334E-01 0.1702248307565384E-01 0.1677587567795624E-01 + 0.1653119801039607E-01 0.1628844260394024E-01 0.1604760205127793E-01 0.1580866900848456E-01 0.1557163619674996E-01 + 0.1533649640417201E-01 0.1510324248761716E-01 0.1487186737464884E-01 0.1464236406552526E-01 0.1441472563526792E-01 + 0.1418894523580252E-01 0.1396501609817369E-01 0.1374293153483488E-01 0.1352268494201562E-01 0.1330426980216726E-01 + 0.1308767968648953E-01 0.1287290825753935E-01 0.1265994927192371E-01 0.1244879658307933E-01 0.1223944414413996E-01 + 0.1203188601089432E-01 0.1182611634483635E-01 0.1162212941630988E-01 0.1141991960775031E-01 0.1121948141702494E-01 + 0.1102080946087490E-01 0.1082389847846042E-01 0.1062874333501194E-01 0.1043533902558977E-01 0.1024368067895393E-01 + 0.1005376356154735E-01 0.9865583081593922E-02 0.9679134793314684E-02 0.9494414401263529E-02 0.9311417764785166E-02 + 0.9130140902597625E-02 0.8950579997500882E-02 0.8772731401214267E-02 0.8596591639343950E-02 0.8422157416482423E-02 + 0.8249425621441884E-02 0.8078393332622082E-02 0.7909057823514530E-02 0.7741416568343256E-02 0.7575467247842871E-02 + 0.7411207755174127E-02 0.7248636201976184E-02 0.7087750924555473E-02 0.6928550490209059E-02 0.6771033703680868E-02 + 0.6615199613748215E-02 0.6461047519934641E-02 0.6308576979345235E-02 0.6157787813618597E-02 0.6008680115989046E-02 + 0.5861254258451652E-02 0.5715510899020261E-02 0.5571450989068522E-02 0.5429075780740853E-02 0.5288386834419521E-02 + 0.5149386026230897E-02 0.5012075555572173E-02 0.4876457952637328E-02 0.4742536085917297E-02 0.4610313169647435E-02 + 0.4479792771170533E-02 0.4350978818180493E-02 0.4223875605807347E-02 0.4098487803498918E-02 0.3974820461650163E-02 + 0.3852879017924298E-02 0.3732669303204216E-02 0.3614197547105479E-02 0.3497470382973937E-02 0.3382494852283408E-02 + 0.3269278408338597E-02 0.3157828919178777E-02 0.3048154669566634E-02 0.2940264361933685E-02 0.2834167116141327E-02 + 0.2729872467901025E-02 0.2627390365681719E-02 0.2526731165915232E-02 0.2427905626291050E-02 0.2330924896912227E-02 + 0.2235800509061165E-02 0.2142544361300639E-02 0.2051168702609613E-02 0.1961686112225166E-02 0.1874109475832896E-02 + 0.1788451957715710E-02 0.1704726968437611E-02 0.1622948127603452E-02 0.1543129221197582E-02 0.1465284152965789E-02 + 0.1389426889263572E-02 0.1315571396752711E-02 0.1243731572285281E-02 0.1173921164272465E-02 0.1106153684794404E-02 + 0.1040442311668004E-02 0.9767997796547971E-03 0.9152382599604941E-03 0.8557692271559906E-03 0.7984033126378760E-03 + 0.7431501437484684E-03 0.6900181676963877E-03 0.6390144594619438E-03 0.5901445129451447E-03 0.5434120147240581E-03 + 0.4988185999463610E-03 0.4563635900883120E-03 0.4160437125934487E-03 0.3778528027632167E-03 0.3417814887280997E-03 + 0.3078168608981688E-03 0.2759421279962239E-03 0.2461362626341978E-03 0.2183736404266527E-03 0.1926236778641105E-03 + 0.1688504756124491E-03 0.1470124755772384E-03 0.1270621419785909E-03 0.1089456788163143E-03 0.9260279843818645E-04 + 0.7796655839983218E-04 0.6496328632466781E-04 0.5351261488371726E-04 0.4352765109263255E-04 0.3491530554961739E-04 + 0.2757680758595959E-04 0.2140843101578471E-04 0.1630245156608879E-04 0.1214835033531085E-04 0.8834266891203550E-05 + 0.6248690035680286E-05 0.4282353222462611E-05 0.2830275035848309E-05 0.1793853932613698E-05 0.1082893085919590E-05 + 0.6174003285747537E-06 0.3289872539180627E-06 0.1616905202076728E-06 0.7206870776681014E-07 0.2849911999804606E-07 + 0.9712198708650968E-08 0.2742442283547959E-08 0.6076172112450161E-09 0.9772731077597771E-10 0.1017048852958432E-10 + 0.5734341782146348E-12 0.1311491489053561E-13 0.7338688834175233E-16 0.3808514445153469E-19 0.2185032842849075E-24 + 0.4450194794086531E-34 0.4448435176905321E-58 0.1173305758391880E-217 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.1353993104251454E-10 0.8388292241576100E-09 0.9249073098372293E-08 0.5030460210239372E-07 + 0.1857568627085415E-06 0.5369197789403567E-06 0.1310591025996369E-05 0.2826805415934704E-05 0.5547382204843158E-05 + 0.1010438933657199E-04 0.1732779196828242E-04 0.2827168149581216E-04 0.4423859602721504E-04 0.6680154505955162E-04 + 0.9782344112589946E-04 0.1394737204414197E-03 0.1942420040555485E-03 0.2649487116051849E-03 0.3547525922860875E-03 + 0.4671551828778767E-03 0.6060022412741116E-03 0.7754822366296253E-03 0.9801220045380374E-03 0.1224779698140599E-02 + 0.1514635184246249E-02 0.1855178047873591E-02 0.2252193379531577E-02 0.2711745527424523E-02 0.3240160001952968E-02 + 0.3844003722708506E-02 0.4530063798923195E-02 0.5305325033301281E-02 0.6176946336577127E-02 0.7152236236230247E-02 + 0.8238627657747143E-02 0.9443652150831976E-02 0.1077491372619769E-01 0.1224006246116400E-01 0.1384676802438050E-01 + 0.1560269326170134E-01 0.1751546797666743E-01 0.1959266303029807E-01 0.2184176487603834E-01 0.2427015063682662E-01 + 0.2688506382240104E-01 0.2969359077621229E-01 0.3270263793270082E-01 0.3591890995727141E-01 0.3934888883309312E-01 + 0.4299881395089809E-01 0.4687466325027261E-01 0.5098213545355013E-01 0.5532663342634311E-01 0.5991324869200370E-01 + 0.6474674712088738E-01 0.6983155580921956E-01 0.7517175115663279E-01 0.8077104814605506E-01 0.8663279082458433E-01 + 0.9275994397927995E-01 0.9915508599743368E-01 0.1058204028968442E+00 0.1127576835079031E+00 0.1199683157858993E+00 + 0.1274532842288529E+00 0.1352131683733934E+00 0.1432481423386811E+00 0.1515579753861312E+00 0.1601420334607315E+00 + 0.1689992816780165E+00 0.1781282877192849E+00 0.1875272260963912E+00 0.1971938832464155E+00 0.2071256634156783E+00 + 0.2173195952919433E+00 0.2277723393431911E+00 0.2384801958210745E+00 0.2494391133870441E+00 0.2606446983191641E+00 + 0.2720922242578070E+00 0.2837766424487163E+00 0.2956925924423432E+00 0.3078344132088888E+00 0.3201961546291090E+00 + 0.3327715893216590E+00 0.3455542247685515E+00 0.3585373157011766E+00 0.3717138767102711E+00 0.3850766950442213E+00 + 0.3986183435611380E+00 0.4123311938012285E+00 0.4262074291471305E+00 0.4402390580410298E+00 0.4544179272285823E+00 + 0.4687357350008659E+00 0.4831840444068136E+00 0.4977542964098284E+00 0.5124378229635098E+00 0.5272258599826819E+00 + 0.5421095601871498E+00 0.5570800057968556E+00 0.5721282210583372E+00 0.5872451845836121E+00 0.6024218414838124E+00 + 0.6176491152810919E+00 0.6329179195834939E+00 0.6482191695086116E+00 0.6635437928430084E+00 0.6788827409254566E+00 + 0.6942269992431367E+00 0.7095675977309721E+00 0.7248956207653083E+00 0.7402022168441228E+00 0.7554786079469059E+00 + 0.7707160985682907E+00 0.7859060844203938E+00 0.8010400607996875E+00 0.8161096306150647E+00 0.8311065120745426E+00 + 0.8460225460288135E+00 0.8608497029705907E+00 0.8755800896893798E+00 0.8902059555819789E+00 0.9047196986196469E+00 + 0.9191138709734521E+00 0.9333811842999254E+00 0.9475145146896305E+00 0.9615069072817952E+00 0.9753515805486259E+00 + 0.9890419302533513E+00 0.1002571533086473E+01 0.1015934149985090E+01 0.1029123729140496E+01 0.1042134408699634E+01 + 0.1054960519166231E+01 0.1067596585507774E+01 0.1080037328974709E+01 0.1092277668638490E+01 0.1104312722655314E+01 + 0.1116137809262549E+01 0.1127748447515049E+01 0.1139140357768670E+01 0.1150309461918440E+01 0.1161251883398932E+01 + 0.1171963946954482E+01 0.1182442178186937E+01 0.1192683302888721E+01 0.1202684246168965E+01 0.1212442131380551E+01 + 0.1221954278855855E+01 0.1231218204459002E+01 0.1240231617962418E+01 0.1248992421255417E+01 0.1257498706392534E+01 + 0.1265748753489242E+01 0.1273741028472617E+01 0.1281474180694483E+01 0.1288947040414400E+01 0.1296158616159860E+01 + 0.1303108091970871E+01 0.1309794824536052E+01 0.1316218340227214E+01 0.1322378332039313E+01 0.1328274656442483E+01 + 0.1333907330152773E+01 0.1339276526828055E+01 0.1344382573695405E+01 0.1349225948116168E+01 0.1353807274094698E+01 + 0.1358127318736686E+01 0.1362186988662762E+01 0.1365987326382977E+01 0.1369529506637536E+01 0.1372814832709058E+01 + 0.1375844732711431E+01 0.1378620755860210E+01 0.1381144568729309E+01 0.1383417951498597E+01 0.1385442794196838E+01 + 0.1387221092944273E+01 0.1388754946198940E+01 0.1390046551010727E+01 0.1391098199286932E+01 0.1391912274073011E+01 + 0.1392491245851972E+01 0.1392837668865793E+01 0.1392954177462024E+01 0.1392843482468616E+01 0.1392508367599889E+01 + 0.1391951685896345E+01 0.1391176356200982E+01 0.1390185359674514E+01 0.1388981736351864E+01 0.1387568581742103E+01 + 0.1385949043473885E+01 0.1384126317988323E+01 0.1382103647281089E+01 0.1379884315695416E+01 0.1377471646767576E+01 + 0.1374869000126249E+01 0.1372079768447110E+01 0.1369107374463862E+01 0.1365955268036790E+01 0.1362626923279866E+01 + 0.1359125835747256E+01 0.1355455519680076E+01 0.1351619505314043E+01 0.1347621336248676E+01 0.1343464566878517E+01 + 0.1339152759886839E+01 0.1334689483802160E+01 0.1330078310617843E+01 0.1325322813474955E+01 0.1320426564408511E+01 + 0.1315393132157122E+01 0.1310226080036051E+01 0.1304928963873535E+01 0.1299505330010257E+01 0.1293958713361729E+01 + 0.1288292635543297E+01 0.1282510603057466E+01 0.1276616105543136E+01 0.1270612614086314E+01 0.1264503579591840E+01 + 0.1258292431215576E+01 0.1251982574856509E+01 0.1245577391708143E+01 0.1239080236868539E+01 0.1232494438008325E+01 + 0.1225823294095955E+01 0.1219070074179471E+01 0.1212238016223985E+01 0.1205330326004104E+01 0.1198350176050432E+01 + 0.1191300704649328E+01 0.1184185014895046E+01 0.1177006173793340E+01 0.1169767211415667E+01 0.1162471120103017E+01 + 0.1155120853718478E+01 0.1147719326947540E+01 0.1140269414645216E+01 0.1132773951228974E+01 0.1125235730116526E+01 + 0.1117657503207466E+01 0.1110041980407784E+01 0.1102391829196240E+01 0.1094709674231619E+01 0.1086998096999836E+01 + 0.1079259635499933E+01 0.1071496783967914E+01 0.1063711992637463E+01 0.1055907667536516E+01 0.1048086170318704E+01 + 0.1040249818128692E+01 0.1032400883500383E+01 0.1024541594287072E+01 0.1016674133622509E+01 0.1008800639911969E+01 + 0.1000923206852306E+01 0.9930438834801176E+00 0.9851646742469989E+00 0.9772875391210279E+00 0.9694143937135093E+00 + 0.9615471094301068E+00 0.9536875136454389E+00 0.9458373899002650E+00 0.9379984781203971E+00 0.9301724748564474E+00 + 0.9223610335436100E+00 0.9145657647805825E+00 0.9067882366268739E+00 0.8990299749176214E+00 0.8912924635951891E+00 + 0.8835771450567167E+00 0.8758854205168844E+00 0.8682186503851309E+00 0.8605781546565948E+00 0.8529652133160540E+00 + 0.8453810667541574E+00 0.8378269161952663E+00 0.8303039241362116E+00 0.8228132147953376E+00 0.8153558745711390E+00 + 0.8079329525099168E+00 0.8005454607817869E+00 0.7931943751644794E+00 0.7858806355343143E+00 0.7786051463638074E+00 + 0.7713687772253328E+00 0.7641723633003079E+00 0.7570167058933844E+00 0.7499025729511121E+00 0.7428306995846062E+00 + 0.7358017885957079E+00 0.7288165110062022E+00 0.7218755065895981E+00 0.7149793844050807E+00 0.7081287233331618E+00 + 0.7013240726126531E+00 0.6945659523785421E+00 0.6878548542003931E+00 0.6811912416209033E+00 0.6745755506942478E+00 + 0.6680081905238785E+00 0.6614895437994238E+00 0.6550199673323996E+00 0.6485997925903795E+00 0.6422293262293763E+00 + 0.6359088506240991E+00 0.6296386243958603E+00 0.6234188829378302E+00 0.6172498389374158E+00 0.6111316828955082E+00 + 0.6050645836423746E+00 0.5990486888499783E+00 0.5930841255405085E+00 0.5871710005909401E+00 0.5813094012334057E+00 + 0.5754993955512363E+00 0.5697410329704640E+00 0.5640343447466610E+00 0.5583793444469337E+00 0.5527760284269526E+00 + 0.5472243763028636E+00 0.5417243514179740E+00 0.5362759013040796E+00 0.5308789581373305E+00 0.5255334391885358E+00 + 0.5202392472678002E+00 0.5149962711634282E+00 0.5098043860749818E+00 0.5046634540404551E+00 0.4995733243574682E+00 + 0.4945338339984403E+00 0.4895448080196743E+00 0.4846060599643165E+00 0.4797173922591353E+00 0.4748785966051021E+00 + 0.4700894543617143E+00 0.4653497369250721E+00 0.4606592060996474E+00 0.4560176144637674E+00 0.4514247057287724E+00 + 0.4468802150918596E+00 0.4423838695826035E+00 0.4379353884031551E+00 0.4335344832621323E+00 0.4291808587022021E+00 + 0.4248742124213836E+00 0.4206142355880688E+00 0.4164006131498095E+00 0.4122330241358657E+00 0.4081111419535712E+00 + 0.4040346346785266E+00 0.4000031653386660E+00 0.3960163921922264E+00 0.3920739689996687E+00 0.3881755452895829E+00 + 0.3843207666186236E+00 0.3805092748255328E+00 0.3767407082792822E+00 0.3730147021214013E+00 0.3693308885025316E+00 + 0.3656888968132757E+00 0.3620883539093817E+00 0.3585288843313358E+00 0.3550101105184098E+00 0.3515316530172374E+00 + 0.3480931306849715E+00 0.3446941608870878E+00 0.3413343596899074E+00 0.3380133420478924E+00 0.3347307219857906E+00 + 0.3314861127756896E+00 0.3282791271090590E+00 0.3251093772638369E+00 0.3219764752666408E+00 0.3188800330501668E+00 + 0.3158196626058555E+00 0.3127949761318864E+00 0.3098055861765790E+00 0.3068511057772733E+00 0.3039311485947566E+00 + 0.3010453290433147E+00 0.2981932624164749E+00 0.2953745650085209E+00 0.2925888542318437E+00 0.2898357487302072E+00 + 0.2871148684879984E+00 0.2844258349355381E+00 0.2817682710505188E+00 0.2791418014556485E+00 0.2765460525125659E+00 + 0.2739806524121053E+00 0.2714452312609780E+00 0.2689394211649400E+00 0.2664628563085241E+00 0.2640151730313972E+00 + 0.2615960099014194E+00 0.2592050077844695E+00 0.2568418099111116E+00 0.2545060619401636E+00 0.2521974120192415E+00 + 0.2499155108423418E+00 0.2476600117045342E+00 0.2454305705538249E+00 0.2432268460402566E+00 0.2410484995623153E+00 + 0.2388951953107000E+00 0.2367666003095238E+00 0.2346623844550057E+00 0.2325822205517195E+00 0.2305257843464541E+00 + 0.2284927545597522E+00 0.2264828129151803E+00 0.2244956441663966E+00 0.2225309361220672E+00 0.2205883796686914E+00 + 0.2186676687913947E+00 0.2167685005927387E+00 0.2148905753096101E+00 0.2130335963282359E+00 0.2111972701973850E+00 + 0.2093813066398013E+00 0.2075854185619259E+00 0.2058093220619543E+00 0.2040527364362842E+00 0.2023153841843948E+00 + 0.2005969910122156E+00 0.1988972858340233E+00 0.1972160007729189E+00 0.1955528711599284E+00 0.1939076355317738E+00 + 0.1922800356273561E+00 0.1906698163829959E+00 0.1890767259264730E+00 0.1875005155699057E+00 0.1859409398015150E+00 + 0.1843977562763068E+00 0.1828707258057186E+00 0.1813596123462640E+00 0.1798641829872162E+00 0.1783842079373634E+00 + 0.1769194605108787E+00 0.1754697171123329E+00 0.1740347572208903E+00 0.1726143633737163E+00 0.1712083211486371E+00 + 0.1698164191460766E+00 0.1684384489703060E+00 0.1670742052100373E+00 0.1657234854183902E+00 0.1643860900922608E+00 + 0.1630618226511230E+00 0.1617504894152905E+00 0.1604518995836656E+00 0.1591658652110027E+00 0.1578922011847117E+00 + 0.1566307252012296E+00 0.1553812577419816E+00 0.1541436220489565E+00 0.1529176440999246E+00 0.1517031525833137E+00 + 0.1504999788727721E+00 0.1493079570014363E+00 0.1481269236359270E+00 0.1469567180500930E+00 0.1457971820985229E+00 + 0.1446481601898438E+00 0.1435094992598286E+00 0.1423810487443264E+00 0.1412626605520352E+00 0.1401541890371375E+00 + 0.1390554909718100E+00 0.1379664255186285E+00 0.1368868542028802E+00 0.1358166408848024E+00 0.1347556517317591E+00 + 0.1337037551903719E+00 0.1326608219586172E+00 0.1316267249579071E+00 0.1306013393051614E+00 0.1295845422848884E+00 + 0.1285762133212826E+00 0.1275762339503552E+00 0.1265844877921041E+00 0.1256008605227379E+00 0.1246252398469633E+00 + 0.1236575154703454E+00 0.1226975790717512E+00 0.1217453242758857E+00 0.1208006466259300E+00 0.1198634435562893E+00 + 0.1189336143654594E+00 0.1180110601890202E+00 0.1170956839727626E+00 0.1161873904459593E+00 0.1152860860947805E+00 + 0.1143916791358692E+00 0.1135040794900743E+00 0.1126231987563555E+00 0.1117489501858582E+00 0.1108812486561707E+00 + 0.1100200106457653E+00 0.1091651542086276E+00 0.1083165989490820E+00 0.1074742659968154E+00 0.1066380779821052E+00 + 0.1058079590112519E+00 0.1049838346422265E+00 0.1041656318605295E+00 0.1033532790552702E+00 0.1025467059954647E+00 + 0.1017458438065610E+00 0.1009506249471885E+00 0.1001609831861390E+00 0.9937685357957692E-01 0.9859817244848566E-01 + 0.9782487735634983E-01 0.9705690708707349E-01 0.9629420162313919E-01 0.9553670212400750E-01 0.9478435090475915E-01 + 0.9403709141497944E-01 0.9329486821788784E-01 0.9255762696971309E-01 0.9182531439931366E-01 0.9109787828804443E-01 + 0.9037526744987140E-01 0.8965743171173354E-01 0.8894432189415159E-01 0.8823588979208480E-01 0.8753208815603555E-01 + 0.8683287067340226E-01 0.8613819195007733E-01 0.8544800749229453E-01 0.8476227368872161E-01 0.8408094779279952E-01 + 0.8340398790532604E-01 0.8273135295728512E-01 0.8206300269292026E-01 0.8139889765304979E-01 0.8073899915862499E-01 + 0.8008326929452908E-01 0.7943167089361686E-01 0.7878416752099129E-01 0.7814072345852002E-01 0.7750130368958605E-01 + 0.7686587388407512E-01 0.7623440038359473E-01 0.7560685018692687E-01 0.7498319093571042E-01 0.7436339090035288E-01 + 0.7374741896616860E-01 0.7313524461974377E-01 0.7252683793552536E-01 0.7192216956263091E-01 0.7132121071188088E-01 + 0.7072393314304767E-01 0.7013030915232332E-01 0.6954031156000041E-01 0.6895391369836718E-01 0.6837108939981353E-01 + 0.6779181298514624E-01 0.6721605925211059E-01 0.6664380346411826E-01 0.6607502133917825E-01 0.6550968903902774E-01 + 0.6494778315846379E-01 0.6438928071487048E-01 0.6383415913794230E-01 0.6328239625959906E-01 0.6273397030409252E-01 + 0.6218885987830131E-01 0.6164704396221248E-01 0.6110850189958664E-01 0.6057321338880634E-01 0.6004115847390429E-01 + 0.5951231753576908E-01 0.5898667128352685E-01 0.5846420074609691E-01 0.5794488726391903E-01 0.5742871248084910E-01 + 0.5691565833622340E-01 0.5640570705708669E-01 0.5589884115058460E-01 0.5539504339651542E-01 0.5489429684004177E-01 + 0.5439658478455860E-01 0.5390189078471544E-01 0.5341019863959112E-01 0.5292149238601910E-01 0.5243575629206128E-01 + 0.5195297485062703E-01 0.5147313277323774E-01 0.5099621498393213E-01 0.5052220661331305E-01 0.5005109299273101E-01 + 0.4958285964860470E-01 0.4911749229687554E-01 0.4865497683759399E-01 0.4819529934963621E-01 0.4773844608554897E-01 + 0.4728440346652141E-01 0.4683315807748007E-01 0.4638469666230777E-01 0.4593900611918208E-01 0.4549607349603369E-01 + 0.4505588598612064E-01 0.4461843092371864E-01 0.4418369577992455E-01 0.4375166815857148E-01 0.4332233579225347E-01 + 0.4289568653845881E-01 0.4247170837580991E-01 0.4205038940040735E-01 0.4163171782227736E-01 0.4121568196192090E-01 + 0.4080227024696274E-01 0.4039147120889799E-01 0.3998327347993617E-01 0.3957766578994016E-01 0.3917463696345855E-01 + 0.3877417591685010E-01 0.3837627165549899E-01 0.3798091327111933E-01 0.3758808993914695E-01 0.3719779091621782E-01 + 0.3681000553773126E-01 0.3642472321549702E-01 0.3604193343546399E-01 0.3566162575553031E-01 0.3528378980343305E-01 + 0.3490841527471608E-01 0.3453549193077510E-01 0.3416500959697864E-01 0.3379695816086406E-01 0.3343132757040658E-01 + 0.3306810783236118E-01 0.3270728901067565E-01 0.3234886122497425E-01 0.3199281464910996E-01 0.3163913950978563E-01 + 0.3128782608524168E-01 0.3093886470401072E-01 0.3059224574373675E-01 0.3024795963005924E-01 0.2990599683556058E-01 + 0.2956634787877624E-01 0.2922900332326631E-01 0.2889395377674870E-01 0.2856118989029233E-01 0.2823070235756949E-01 + 0.2790248191416771E-01 0.2757651933695894E-01 0.2725280544352705E-01 0.2693133109165141E-01 0.2661208717884729E-01 + 0.2629506464196176E-01 0.2598025445682497E-01 0.2566764763795566E-01 0.2535723523832159E-01 0.2504900834915327E-01 + 0.2474295809981158E-01 0.2443907565770799E-01 0.2413735222827780E-01 0.2383777905500606E-01 0.2354034741950517E-01 + 0.2324504864164501E-01 0.2295187407973472E-01 0.2266081513075604E-01 0.2237186323064830E-01 0.2208500985464502E-01 + 0.2180024651766184E-01 0.2151756477473634E-01 0.2123695622151859E-01 0.2095841249481422E-01 0.2068192527317876E-01 + 0.2040748627756411E-01 0.2013508727201714E-01 0.1986472006443057E-01 0.1959637650734679E-01 0.1933004849881481E-01 + 0.1906572798330038E-01 0.1880340695265023E-01 0.1854307744711091E-01 0.1828473155640220E-01 0.1802836142084625E-01 + 0.1777395923255295E-01 0.1752151723666215E-01 0.1727102773264334E-01 0.1702248307565384E-01 0.1677587567795624E-01 + 0.1653119801039607E-01 0.1628844260394024E-01 0.1604760205127793E-01 0.1580866900848456E-01 0.1557163619674996E-01 + 0.1533649640417201E-01 0.1510324248761716E-01 0.1487186737464884E-01 0.1464236406552526E-01 0.1441472563526792E-01 + 0.1418894523580252E-01 0.1396501609817369E-01 0.1374293153483488E-01 0.1352268494201562E-01 0.1330426980216726E-01 + 0.1308767968648953E-01 0.1287290825753935E-01 0.1265994927192371E-01 0.1244879658307933E-01 0.1223944414413996E-01 + 0.1203188601089432E-01 0.1182611634483635E-01 0.1162212941630988E-01 0.1141991960775031E-01 0.1121948141702494E-01 + 0.1102080946087490E-01 0.1082389847846042E-01 0.1062874333501194E-01 0.1043533902558977E-01 0.1024368067895393E-01 + 0.1005376356154735E-01 0.9865583081593922E-02 0.9679134793314684E-02 0.9494414401263529E-02 0.9311417764785166E-02 + 0.9130140902597625E-02 0.8950579997500882E-02 0.8772731401214267E-02 0.8596591639343950E-02 0.8422157416482423E-02 + 0.8249425621441884E-02 0.8078393332622082E-02 0.7909057823514530E-02 0.7741416568343256E-02 0.7575467247842871E-02 + 0.7411207755174127E-02 0.7248636201976184E-02 0.7087750924555473E-02 0.6928550490209059E-02 0.6771033703680868E-02 + 0.6615199613748215E-02 0.6461047519934641E-02 0.6308576979345235E-02 0.6157787813618597E-02 0.6008680115989046E-02 + 0.5861254258451652E-02 0.5715510899020261E-02 0.5571450989068522E-02 0.5429075780740853E-02 0.5288386834419521E-02 + 0.5149386026230897E-02 0.5012075555572173E-02 0.4876457952637328E-02 0.4742536085917297E-02 0.4610313169647435E-02 + 0.4479792771170533E-02 0.4350978818180493E-02 0.4223875605807347E-02 0.4098487803498918E-02 0.3974820461650163E-02 + 0.3852879017924298E-02 0.3732669303204216E-02 0.3614197547105479E-02 0.3497470382973937E-02 0.3382494852283408E-02 + 0.3269278408338597E-02 0.3157828919178777E-02 0.3048154669566634E-02 0.2940264361933685E-02 0.2834167116141327E-02 + 0.2729872467901025E-02 0.2627390365681719E-02 0.2526731165915232E-02 0.2427905626291050E-02 0.2330924896912227E-02 + 0.2235800509061165E-02 0.2142544361300639E-02 0.2051168702609613E-02 0.1961686112225166E-02 0.1874109475832896E-02 + 0.1788451957715710E-02 0.1704726968437611E-02 0.1622948127603452E-02 0.1543129221197582E-02 0.1465284152965789E-02 + 0.1389426889263572E-02 0.1315571396752711E-02 0.1243731572285281E-02 0.1173921164272465E-02 0.1106153684794404E-02 + 0.1040442311668004E-02 0.9767997796547971E-03 0.9152382599604941E-03 0.8557692271559906E-03 0.7984033126378760E-03 + 0.7431501437484684E-03 0.6900181676963877E-03 0.6390144594619438E-03 0.5901445129451447E-03 0.5434120147240581E-03 + 0.4988185999463610E-03 0.4563635900883120E-03 0.4160437125934487E-03 0.3778528027632167E-03 0.3417814887280997E-03 + 0.3078168608981688E-03 0.2759421279962239E-03 0.2461362626341978E-03 0.2183736404266527E-03 0.1926236778641105E-03 + 0.1688504756124491E-03 0.1470124755772384E-03 0.1270621419785909E-03 0.1089456788163143E-03 0.9260279843818645E-04 + 0.7796655839983218E-04 0.6496328632466781E-04 0.5351261488371726E-04 0.4352765109263255E-04 0.3491530554961739E-04 + 0.2757680758595959E-04 0.2140843101578471E-04 0.1630245156608879E-04 0.1214835033531085E-04 0.8834266891203550E-05 + 0.6248690035680286E-05 0.4282353222462611E-05 0.2830275035848309E-05 0.1793853932613698E-05 0.1082893085919590E-05 + 0.6174003285747537E-06 0.3289872539180627E-06 0.1616905202076728E-06 0.7206870776681014E-07 0.2849911999804606E-07 + 0.9712198708650968E-08 0.2742442283547959E-08 0.6076172112450161E-09 0.9772731077597771E-10 0.1017048852958432E-10 + 0.5734341782146348E-12 0.1311491489053561E-13 0.7338688834175233E-16 0.3808514445153469E-19 0.2185032842849075E-24 + 0.4450194794086531E-34 0.4448435176905321E-58 0.1173305758391880E-217 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 13 26.982 4.0500 fcc + 0.0000000000000000E+00 -0.9628279509886344E-01 -0.9953365511717502E-01 -0.1085367257834955E+00 -0.1214218487615201E+00 + -0.1368680672855588E+00 -0.1540621427490459E+00 -0.1724823698187966E+00 -0.1917766936082239E+00 -0.2116972667780488E+00 + -0.2320627441427241E+00 -0.2527367403313019E+00 -0.2736137350811652E+00 -0.2946105714789528E+00 -0.3156602493701524E+00 + -0.3367083306444053E+00 -0.3577089488344269E+00 -0.3786243739249987E+00 -0.3994221660811231E+00 -0.4200735094048743E+00 + -0.4404904782781875E+00 -0.4603267076635175E+00 -0.4791342002596235E+00 -0.4966697876448934E+00 -0.5129130363987204E+00 + -0.5279649398751899E+00 -0.5419673801142365E+00 -0.5550615741668476E+00 -0.5673715677751278E+00 -0.5790001198451177E+00 + -0.5900298137753388E+00 -0.6005259461781434E+00 -0.6105396931325852E+00 -0.6201109775165654E+00 -0.6292707959422479E+00 + -0.6380435230284373E+00 -0.6464477036605579E+00 -0.6544979268477449E+00 -0.6622058329958839E+00 -0.6695796004816827E+00 + -0.6766263822113870E+00 -0.6833513422524340E+00 -0.6897586759282083E+00 -0.6958513916294100E+00 -0.7016318963634165E+00 + -0.7071020397392846E+00 -0.7122632455033970E+00 -0.7171166154132189E+00 -0.7216630115090188E+00 -0.7259031214369276E+00 + -0.7298375104167867E+00 -0.7334666626446351E+00 -0.7367910666835507E+00 -0.7398107650409456E+00 -0.7425268555598952E+00 + -0.7449393618108722E+00 -0.7470487599589724E+00 -0.7488555593770301E+00 -0.7503603132693473E+00 -0.7515636266841099E+00 + -0.7524661625108897E+00 -0.7530686459172391E+00 -0.7533718513852463E+00 -0.7533768363262632E+00 -0.7530840012877273E+00 + -0.7524921131814579E+00 -0.7515804606478103E+00 -0.7502792607163535E+00 -0.7484607038243816E+00 -0.7459636916668000E+00 + -0.7426298640002307E+00 -0.7383310820407341E+00 -0.7329796809143272E+00 -0.7265308852606689E+00 -0.7189742772379484E+00 + -0.7103273715872973E+00 -0.7006269201238819E+00 -0.6899214100415596E+00 -0.6782669062893683E+00 -0.6657222644919032E+00 + -0.6523467518594732E+00 -0.6381981822655980E+00 -0.6233317828078055E+00 -0.6077995440370048E+00 -0.5916499059655702E+00 + -0.5749276704151935E+00 -0.5576740608036261E+00 -0.5399269902646231E+00 -0.5217207897977505E+00 -0.5030872174417831E+00 + -0.4840550838961484E+00 -0.4646507036272260E+00 -0.4448981173724120E+00 -0.4248192982742891E+00 -0.4044343519155205E+00 + -0.3837617000246638E+00 -0.3628182478945590E+00 -0.3416195360896790E+00 -0.3201798773328464E+00 -0.2985124796289278E+00 + -0.2766295567505006E+00 -0.2545424272145054E+00 -0.2322616028428013E+00 -0.2097968679392537E+00 -0.1871573500428596E+00 + -0.1643515831380795E+00 -0.1413875641241673E+00 -0.1182728032683014E+00 -0.9501436929434126E-01 -0.7161893009339959E-01 + -0.4809278834346697E-01 -0.2444191370712145E-01 -0.6719720983290323E-03 0.2321164851959434E-01 0.4720381488457415E-01 + 0.7129962756731612E-01 0.9549440222479744E-01 0.1197836527451308E+00 0.1441630239601834E+00 0.1686284833950578E+00 + 0.1931760053643994E+00 0.2178017590483101E+00 0.2425020494231500E+00 0.2672733026214353E+00 0.2921120755096318E+00 + 0.3170150833336578E+00 0.3419794799317026E+00 0.3670036243095800E+00 0.3920881689533946E+00 0.4172368973967129E+00 + 0.4424568644116991E+00 0.4677578158531293E+00 0.4931511605824372E+00 0.5186488234682329E+00 0.5442622221402917E+00 + 0.5700014909585294E+00 0.5958749808858199E+00 0.6218890074764571E+00 0.6480477945330341E+00 0.6743535566999124E+00 + 0.7008066705597229E+00 0.7274058941450217E+00 0.7541486054898794E+00 0.7810310401956295E+00 0.8080485153972305E+00 + 0.8351956330126833E+00 0.8624664590130959E+00 0.8898546780165009E+00 0.9173537241128331E+00 0.9449568897488558E+00 + 0.9726574149554992E+00 0.1000448559348619E+01 0.1028323659291245E+01 0.1056276172451073E+01 0.1084299711777170E+01 + 0.1112388070685622E+01 0.1140535241011345E+01 0.1168735425061202E+01 0.1196983042901978E+01 0.1225272735836553E+01 + 0.1253599366863931E+01 0.1281958018782363E+01 0.1310343990479578E+01 0.1338752791854684E+01 0.1367180137734465E+01 + 0.1395621941077129E+01 0.1424074305699794E+01 0.1452533518717449E+01 0.1480996042842949E+01 0.1509458508665117E+01 + 0.1537917706995331E+01 0.1566370831749105E+01 0.1594814471963946E+01 0.1623246104160209E+01 0.1651663086958648E+01 + 0.1680062903840593E+01 0.1708443156854245E+01 0.1736801560607192E+01 0.1765135936545083E+01 0.1793444207513674E+01 + 0.1821724397566120E+01 0.1849974626590099E+01 0.1878193078402154E+01 0.1906378032515773E+01 0.1934527846644618E+01 + 0.1962640952792409E+01 0.1990715853560963E+01 0.2018751118665230E+01 0.2046745381644585E+01 0.2074697336759590E+01 + 0.2102605736064189E+01 0.2130469386642917E+01 0.2158287148004209E+01 0.2186057929620079E+01 0.2213780688603973E+01 + 0.2241454427518249E+01 0.2269078192303640E+01 0.2296651070323292E+01 0.2324172188515120E+01 0.2351640711701886E+01 + 0.2379055842086045E+01 0.2406416827027384E+01 0.2433722996957316E+01 0.2460973865437883E+01 0.2488169306929864E+01 + 0.2515309789359613E+01 0.2542396607347866E+01 0.2569432057808982E+01 0.2596419519065771E+01 0.2623363422536599E+01 + 0.2650269129601363E+01 0.2677142739909846E+01 0.2703990861443457E+01 0.2730820370008068E+01 0.2757638179775513E+01 + 0.2784451039495457E+01 0.2811265362580523E+01 0.2838087094127737E+01 0.2864921614243932E+01 0.2891773674664324E+01 + 0.2918647364337785E+01 0.2945546099121457E+01 0.2972472630730262E+01 0.2999429070422704E+01 0.3026416923420929E+01 + 0.3053437130653784E+01 0.3080490115009347E+01 0.3107575829842219E+01 0.3134693807981898E+01 0.3161843209919625E+01 + 0.3189022870212173E+01 0.3216231341437487E+01 0.3243466935272163E+01 0.3270727760447288E+01 0.3298011757479649E+01 + 0.3325316730182467E+01 0.3352640374035690E+01 0.3379980301550311E+01 0.3407334064796215E+01 0.3434699175284783E+01 + 0.3462073121407959E+01 0.3489453383638473E+01 0.3516837447692921E+01 0.3544222815852538E+01 0.3571607016626300E+01 + 0.3598987612930495E+01 0.3626362208945728E+01 0.3653728455799938E+01 0.3681084056213634E+01 0.3708426768230866E+01 + 0.3735754408148046E+01 0.3763064852741161E+01 0.3790356040882480E+01 0.3817625974627172E+01 0.3844872719842444E+01 + 0.3872094406443206E+01 0.3899289228291301E+01 0.3926455442808664E+01 0.3953591370348690E+01 0.3980695393365072E+01 + 0.4007765955412338E+01 0.4034801560008381E+01 0.4061800769384807E+01 0.4088762203148616E+01 0.4115684536874605E+01 + 0.4142566500646071E+01 0.4169406877558640E+01 0.4196204502200039E+01 0.4222958259116835E+01 0.4249667081277604E+01 + 0.4276329948540632E+01 0.4302945886132529E+01 0.4329513963143877E+01 0.4356033291046330E+01 0.4382503022235336E+01 + 0.4408922348601389E+01 0.4435290500132353E+01 0.4461606743549172E+01 0.4487870380976208E+01 0.4514080748647457E+01 + 0.4540237215649173E+01 0.4566339182699858E+01 0.4592386080967303E+01 0.4618377370923009E+01 0.4644312541233742E+01 + 0.4670191107689631E+01 0.4696012612168792E+01 0.4721776621637420E+01 0.4747482727184995E+01 0.4773130543093758E+01 + 0.4798719705941583E+01 0.4824249873737505E+01 0.4849720725089056E+01 0.4875131958400324E+01 0.4900483291100185E+01 + 0.4925774458899197E+01 0.4951005215074943E+01 0.4976175329784288E+01 0.5001284589402100E+01 0.5026332801140161E+01 + 0.5051319771276494E+01 0.5076245336511819E+01 0.5101109341973393E+01 0.5125911646062397E+01 0.5150652119931829E+01 + 0.5175330646984699E+01 0.5199947122391546E+01 0.5224501452626964E+01 0.5248993555024179E+01 0.5273423357346785E+01 + 0.5297790805953600E+01 0.5322095829385203E+01 0.5346338394872665E+01 0.5370518467903519E+01 0.5394636022497286E+01 + 0.5418691040867781E+01 0.5442683513098503E+01 0.5466613436830711E+01 0.5490480816963549E+01 0.5514285665365584E+01 + 0.5538028000597862E+01 0.5561707847647368E+01 0.5585325237670777E+01 0.5608880207748139E+01 0.5632372800646136E+01 + 0.5655803064590023E+01 0.5679171053044746E+01 0.5702476824504079E+01 0.5725720442287942E+01 0.5748901974347438E+01 + 0.5772021493077228E+01 0.5795079075135007E+01 0.5818074801267764E+01 0.5841008756144801E+01 0.5863881028196719E+01 + 0.5886691709361872E+01 0.5909440895975128E+01 0.5932128683720454E+01 0.5954755179911128E+01 0.5977320485443878E+01 + 0.5999824709469358E+01 0.6022267962734361E+01 0.6044650358660738E+01 0.6066972013230976E+01 0.6089233044877606E+01 + 0.6111433574377054E+01 0.6133573724746905E+01 0.6155653621147478E+01 0.6177673390786589E+01 0.6199633162827851E+01 + 0.6221533068302496E+01 0.6243373240024188E+01 0.6265153812506977E+01 0.6286874921886278E+01 0.6308536705842656E+01 + 0.6330139303528365E+01 0.6351682855496508E+01 0.6373167503632674E+01 0.6394593391089307E+01 0.6415960662221997E+01 + 0.6437269462528379E+01 0.6458519938589133E+01 0.6479712238010886E+01 0.6500846509371517E+01 0.6521922902167027E+01 + 0.6542941566760541E+01 0.6563902654333011E+01 0.6584806316835689E+01 0.6605652706944284E+01 0.6626441978014737E+01 + 0.6647174088072036E+01 0.6667849577716816E+01 0.6688468412040860E+01 0.6709030746709217E+01 0.6729536737868406E+01 + 0.6749986542110525E+01 0.6770380316439014E+01 0.6790718218235369E+01 0.6811000456475160E+01 0.6831227079554464E+01 + 0.6851398303748420E+01 0.6871514287649720E+01 0.6891575190080648E+01 0.6911581170066203E+01 0.6931532386808209E+01 + 0.6951428999660269E+01 0.6971271168103572E+01 0.6991059051723765E+01 0.7010792810188176E+01 0.7030472603224527E+01 + 0.7050098590599536E+01 0.7069670932099115E+01 0.7089189787508612E+01 0.7108655316594129E+01 0.7128067679084379E+01 + 0.7147427034653132E+01 0.7166733542902411E+01 0.7185987363346015E+01 0.7205188655394117E+01 0.7224337578337899E+01 + 0.7243434291334958E+01 0.7262478953395287E+01 0.7281471723367670E+01 0.7300412759926576E+01 0.7319302221559616E+01 + 0.7338140266555139E+01 0.7356927052990867E+01 0.7375662738722378E+01 0.7394347481372199E+01 0.7412981438319438E+01 + 0.7431564766689641E+01 0.7450097623345021E+01 0.7468580164875283E+01 0.7487012547588363E+01 0.7505394927501915E+01 + 0.7523727460334936E+01 0.7542010301499733E+01 0.7560243606094313E+01 0.7578427528894725E+01 0.7596562224348212E+01 + 0.7614647846566118E+01 0.7632684549317478E+01 0.7650672486022634E+01 0.7668611809747173E+01 0.7686502673196021E+01 + 0.7704345228708073E+01 0.7722139628250660E+01 0.7739886023414384E+01 0.7757584565408455E+01 0.7775235405055646E+01 + 0.7792838692788044E+01 0.7810394578642622E+01 0.7827903212257197E+01 0.7845364742866390E+01 0.7862779319297943E+01 + 0.7880147089969217E+01 0.7897468202883433E+01 0.7914742805626958E+01 0.7931971045365675E+01 0.7949153068842364E+01 + 0.7966289022373804E+01 0.7983379051848088E+01 0.8000423302722167E+01 0.8017421920019366E+01 0.8034375048327233E+01 + 0.8051282831795312E+01 0.8068145414133273E+01 0.8084962938608882E+01 0.8101735548046269E+01 0.8118463384824164E+01 + 0.8135146590874683E+01 0.8151785307681390E+01 0.8168379676278345E+01 0.8184929837248552E+01 0.8201435930723028E+01 + 0.8217898096379580E+01 0.8234316473441851E+01 0.8250691200678498E+01 0.8267022416402313E+01 0.8283310258469461E+01 + 0.8299554864278941E+01 0.8315756370771805E+01 0.8331914914430893E+01 0.8348030631280192E+01 0.8364103656884673E+01 + 0.8380134126349787E+01 0.8396122174321329E+01 0.8412067934985277E+01 0.8427971542067645E+01 0.8443833128834413E+01 + 0.8459652828091619E+01 0.8475430772185273E+01 0.8491167093001646E+01 0.8506861921967246E+01 0.8522515390049147E+01 + 0.8538127627755209E+01 0.8553698765134389E+01 0.8569228931777127E+01 0.8584718256815695E+01 0.8600166868924553E+01 + 0.8615574896321021E+01 0.8630942466765738E+01 0.8646269707563008E+01 0.8661556745561711E+01 0.8676803707155621E+01 + 0.8692010718284379E+01 0.8707177904433900E+01 0.8722305390637324E+01 0.8737393301475592E+01 0.8752441761078339E+01 + 0.8767450893124774E+01 0.8782420820844322E+01 0.8797351667017651E+01 0.8812243553977586E+01 0.8827096603609940E+01 + 0.8841910937354429E+01 0.8856686676205864E+01 0.8871423940714820E+01 0.8886122850988944E+01 0.8900783526693864E+01 + 0.8915406087054141E+01 0.8929990650854535E+01 0.8944537336441012E+01 0.8959046261721827E+01 0.8973517544168701E+01 + 0.8987951300817869E+01 0.9002347648271487E+01 0.9016706702698437E+01 0.9031028579835858E+01 0.9045313394990188E+01 + 0.9059561263038376E+01 0.9073772298429056E+01 0.9087946615184084E+01 0.9102084326899423E+01 0.9116185546746657E+01 + 0.9130250387474085E+01 0.9144278961408215E+01 0.9158271380454892E+01 0.9172227756100682E+01 0.9186148199414212E+01 + 0.9200032821047387E+01 0.9213881731236844E+01 0.9227695039805166E+01 0.9241472856162442E+01 0.9255215289307372E+01 + 0.9268922447828803E+01 0.9282594439906916E+01 0.9296231373314885E+01 0.9309833355419986E+01 0.9323400493185019E+01 + 0.9336932882359978E+01 0.9350430594893881E+01 0.9363893783342821E+01 0.9377322553011272E+01 0.9390717008807609E+01 + 0.9404077255245511E+01 0.9417403396445167E+01 0.9430695536134984E+01 0.9443953777652798E+01 0.9457178223947256E+01 + 0.9470368977579316E+01 0.9483526140723573E+01 0.9496649815169690E+01 0.9509740102323899E+01 0.9522797103210273E+01 + 0.9535822238420437E+01 0.9548812165768359E+01 0.9561769891801452E+01 0.9574694732427433E+01 0.9587586786767478E+01 + 0.9600446153569266E+01 0.9613272931208536E+01 0.9626067217690245E+01 0.9638829110650304E+01 0.9651558707356724E+01 + 0.9664256104711166E+01 0.9676921399250290E+01 0.9689554687147089E+01 0.9702157469174860E+01 0.9714727037387689E+01 + 0.9727264885308301E+01 0.9739771107669302E+01 0.9752245798846879E+01 0.9764689052861872E+01 0.9777100963381457E+01 + 0.9789481623720420E+01 0.9801831126842281E+01 0.9814149565361319E+01 0.9826437031543161E+01 0.9838693617306955E+01 + 0.9850919414226038E+01 0.9863114513529872E+01 0.9875279006105066E+01 0.9887412982496855E+01 0.9899516532910610E+01 + 0.9911589747212901E+01 0.9923632714933214E+01 0.9935645525264956E+01 0.9947628267067159E+01 0.9959581028865557E+01 + 0.9971503898854007E+01 0.9983396964895977E+01 0.9995260314525778E+01 0.1000709403494981E+02 0.1001889821304812E+02 + 0.1003067293537552E+02 0.1004241828816303E+02 0.1005413435731925E+02 0.1006582122843160E+02 0.1007747898676759E+02 + 0.1008910771727630E+02 0.1010070750458943E+02 0.1011227843302306E+02 0.1012382058657841E+02 0.1013533404894347E+02 + 0.1014681890349423E+02 0.1015827523329602E+02 0.1016970312110463E+02 0.1018110264936784E+02 0.1019247390022638E+02 + 0.1020381695551557E+02 0.1021513189676633E+02 0.1022641880520652E+02 0.1023767776176225E+02 0.1024890884705905E+02 + 0.1026011214142316E+02 0.1027128772488293E+02 0.1028243567716970E+02 0.1029355607771946E+02 0.1030464900567390E+02 + 0.1031571453988140E+02 0.1032675275889879E+02 0.1033776374099216E+02 0.1034874756413813E+02 0.1035970430602517E+02 + 0.1037063404405489E+02 0.1038153685534300E+02 0.1039241281672065E+02 0.1040326200473567E+02 0.1041408449565369E+02 + 0.1042488036545932E+02 0.1043564968985735E+02 0.1044639254427403E+02 0.1045710900385802E+02 0.1046779914348181E+02 + 0.1047846303774262E+02 0.1048910076096391E+02 0.1049971238719612E+02 0.1051029799021812E+02 0.1052085764353829E+02 + 0.1053139142039568E+02 0.1054189939376099E+02 0.1055238163633786E+02 0.1056283822056399E+02 0.1057326921861215E+02 + 0.1058367470239147E+02 0.1059405474354847E+02 0.1060440941346801E+02 0.1061473878327465E+02 0.1062504292383371E+02 + 0.1063532190575210E+02 0.1064557579937992E+02 0.1065580467481084E+02 0.1066600860188387E+02 0.1067618765018412E+02 + 0.1068634188904373E+02 0.1069647138754325E+02 0.1070657621451248E+02 0.1071665643853165E+02 0.1072671212793241E+02 + 0.1073674335079890E+02 0.1074675017496875E+02 0.1075673266803417E+02 0.1076669089734308E+02 0.1077662492999989E+02 + 0.1078653483286685E+02 0.1079642067256462E+02 0.1080628251547384E+02 0.1081612042773567E+02 0.1082593447525316E+02 + 0.1083572472369191E+02 0.1084549123848135E+02 0.1085523408481566E+02 0.1086495332765466E+02 0.1087464903172486E+02 + 0.1088432126152055E+02 0.1089397008130446E+02 0.1090359555510911E+02 0.1091319774673763E+02 0.1092277671976472E+02 + 0.1093233253753738E+02 0.1094186526317629E+02 0.1095137495957662E+02 0.1096086168940853E+02 0.1097032555892928E+02 + 0.1097976666590150E+02 0.1098918498743821E+02 0.1099858058553585E+02 0.1100795352196447E+02 0.1101730385826855E+02 + 0.1102663165576839E+02 0.1103593697556089E+02 0.1104521987852084E+02 0.1105448042530153E+02 0.1106371867633628E+02 + 0.1107293247783943E+02 0.1108212631163812E+02 0.1109129802968301E+02 0.1110044769153667E+02 0.1110957535654645E+02 + 0.1111868108384563E+02 0.1112776493235422E+02 0.1113682696078008E+02 0.1114586722761977E+02 0.1115488579115973E+02 + 0.1116388270947705E+02 0.1117285804044050E+02 0.1118181184171143E+02 0.1119074417074485E+02 0.1119965508479030E+02 + 0.1120854464089276E+02 0.1121741289589355E+02 0.1122625990643143E+02 0.1123508572894327E+02 0.1124389041966516E+02 + 0.1125267403463331E+02 0.1126143662968485E+02 0.1127017826045877E+02 0.1127889898239682E+02 0.1128759885074458E+02 + 0.1129627792055189E+02 0.1130493624667420E+02 0.1131357388377320E+02 0.1132219088631773E+02 0.1133078730858470E+02 + 0.1133936320465983E+02 0.1134791862843856E+02 0.1135645363362708E+02 0.1136496827374269E+02 0.1137346260211521E+02 + 0.1138193667188745E+02 0.1139039053601605E+02 0.1139882424727257E+02 0.1140723785824395E+02 0.1141563142133352E+02 + 0.1142400498876172E+02 0.1143235861256712E+02 0.1144069234460682E+02 0.1144900623655768E+02 0.1145730033991675E+02 + 0.1146557470600226E+02 0.1147382938595421E+02 0.1148206443073531E+02 0.1149027989113191E+02 0.1149847581775414E+02 + 0.1150665226103736E+02 0.1151480927124249E+02 0.1152294689845698E+02 0.1153106519259537E+02 0.1153916420340013E+02 + 0.1154724398044246E+02 0.1155530457312277E+02 0.1156334603067165E+02 0.1157136840215052E+02 0.1157937173645239E+02 + 0.1158735608230234E+02 0.1159532148825857E+02 0.1160326800271278E+02 0.1161119567389111E+02 0.1161910454985465E+02 + 0.1162699467850026E+02 0.1163486610756115E+02 0.1164271888460782E+02 0.1165055305704804E+02 0.1165836867212856E+02 + 0.1166616577693494E+02 0.1167394441839248E+02 0.1168170464326700E+02 0.1168944649816522E+02 0.1169717002953568E+02 + 0.1170487528366932E+02 0.1171256230670009E+02 0.1172023114460535E+02 0.1172788184320704E+02 0.1173551444817181E+02 + 0.1174312900501185E+02 0.1175072555908556E+02 0.1175830415559807E+02 0.1176586483960187E+02 0.1177340765599744E+02 + 0.1178093264953387E+02 0.1178843986480948E+02 0.1179592934627236E+02 0.1180340113822094E+02 0.1181085528480470E+02 + 0.1181829166269570E+02 0.1182570985953448E+02 0.1183311348562248E+02 0.1184049703658763E+02 0.1184786329267578E+02 + 0.1185521227437533E+02 0.1186254400205932E+02 0.1186985849598701E+02 0.1187715577630568E+02 0.1188443611784194E+02 + 0.1189169878246886E+02 0.1189894457481569E+02 0.1190617328225404E+02 0.1191338494670332E+02 0.1192057960986771E+02 + 0.1192775731323726E+02 0.1193491809808902E+02 0.1194206200548831E+02 0.1194918907628982E+02 0.1195629935113887E+02 + 0.1196339287047247E+02 0.1197046967452045E+02 0.1197752980330694E+02 0.1198457329665118E+02 0.1199160019416887E+02 + 0.1199861053527344E+02 0.1200560435917693E+02 0.1201258170489155E+02 0.1201954261123063E+02 0.1202648711680959E+02 + 0.1203341526004761E+02 0.1204032707916849E+02 0.1204722261220184E+02 0.1205410189698429E+02 0.1206096497116060E+02 + 0.1206781187218495E+02 0.1207464559802799E+02 0.1208146027002577E+02 0.1208825888009797E+02 0.1209504146494779E+02 + 0.1210180806109399E+02 0.1210855896537541E+02 0.1211529410378007E+02 0.1212201340030601E+02 0.1212871689296240E+02 + 0.1213540461963384E+02 0.1214207661808061E+02 0.1214873292593939E+02 0.1215537358072345E+02 0.1216199861982349E+02 + 0.1216860808050769E+02 0.1217520199992239E+02 0.1218178041509279E+02 0.1218834336292295E+02 0.1219489088019657E+02 + 0.1220142300357730E+02 0.1220793976960926E+02 0.1221444121471769E+02 0.1222092737520902E+02 0.1222739828727144E+02 + 0.1223385398697564E+02 0.1224029451027501E+02 0.1224671989300593E+02 0.1225313017088853E+02 0.1225952537952718E+02 + 0.1226590555441035E+02 0.1227227073091185E+02 0.1227862094429078E+02 0.1228495622969180E+02 0.1229127662214604E+02 + 0.1229758215657148E+02 0.1230387286777276E+02 0.1231014879044237E+02 0.1231640995916075E+02 0.1232265640839672E+02 + 0.1232888817250763E+02 0.1233510528574038E+02 0.1234130778223132E+02 0.1234749569600697E+02 0.1235366906098424E+02 + 0.1235982791097082E+02 0.1236597227966591E+02 0.1237210220066028E+02 0.1237821770743661E+02 0.1238431883337027E+02 + 0.1239040561172962E+02 0.1239647807567605E+02 0.1240253625826483E+02 0.1240858019244517E+02 0.1241460991106090E+02 + 0.1242062544685069E+02 0.1242662683244833E+02 0.1243261410038329E+02 0.1243858728308130E+02 0.1244454641286415E+02 + 0.1245049152195065E+02 0.1245642264245671E+02 0.1246233980639583E+02 0.1246824304567928E+02 0.1247413239211681E+02 + 0.1248000787741680E+02 0.1248586953318652E+02 0.1249171739093289E+02 0.1249755148206230E+02 0.1250337183788155E+02 + 0.1250917848959775E+02 0.1251497146831911E+02 0.1252075080505461E+02 0.1252651653071523E+02 0.1253226867611377E+02 + 0.1253800727196519E+02 0.1254373234888717E+02 0.1254944393740030E+02 0.1255514206792864E+02 0.1256082677079984E+02 + 0.1256649807624557E+02 0.1257215601440174E+02 0.1257780061530919E+02 0.1258343190891375E+02 0.1258904992506636E+02 + 0.1259465469352414E+02 0.1260024624394981E+02 0.1260582460591276E+02 0.1261138980888892E+02 0.1261694188226133E+02 + 0.1262248085532045E+02 0.1262800675726433E+02 0.1263351961719898E+02 0.1263901946413904E+02 0.1264450285631671E+02 + 0.1264997675865174E+02 0.1265543773449255E+02 0.1266088581249014E+02 0.1266632102120516E+02 0.1267174338910899E+02 + 0.1267715294458313E+02 0.1268254971592008E+02 0.1268793373132342E+02 0.1269330501890832E+02 0.1269866360670164E+02 + 0.1270400952264229E+02 0.1270934279458158E+02 0.1271466345028335E+02 0.1271997151742474E+02 0.1272526702359572E+02 + 0.1273054999630008E+02 0.1273582044112639E+02 0.1274107829127974E+02 0.1274632368547512E+02 0.1275155665077283E+02 + 0.1275677721414707E+02 0.1276198540248610E+02 0.1276718124259236E+02 0.1277236476118314E+02 0.1277753598489035E+02 + 0.1278269494026117E+02 0.1278784165375827E+02 0.1279297615176009E+02 0.1279809846056095E+02 0.1280320860637152E+02 + 0.1280830661531907E+02 0.1281339251344765E+02 0.1281846632671840E+02 0.1282352808100990E+02 0.1282857780211833E+02 + 0.1283361551575781E+02 0.1283864124756066E+02 0.1284365502307763E+02 0.1284865686777834E+02 0.1285364680705105E+02 + 0.1285862486620364E+02 0.1286359107046338E+02 0.1286854544497717E+02 0.1287348801481206E+02 0.1287841880495558E+02 + 0.1288333784031538E+02 0.1288824514572031E+02 0.1289314074592015E+02 0.1289802466558600E+02 0.1290289692931037E+02 + 0.1290775756160805E+02 0.1291260658691528E+02 0.1291744402959128E+02 0.1292226991391726E+02 0.1292708426409754E+02 + 0.1293188710425972E+02 0.1293667845845432E+02 0.1294145835065556E+02 0.1294622680476155E+02 0.1295098384459444E+02 + 0.1295572949390062E+02 0.1296046377635092E+02 0.1296518671554123E+02 0.1296989833499209E+02 0.1297459865814951E+02 + 0.1297928770838488E+02 0.1298396550899552E+02 0.1298863208320455E+02 0.1299328745416105E+02 0.1299793164494091E+02 + 0.1300256467854653E+02 0.1300718657790715E+02 0.1301179736587904E+02 0.1301639706524610E+02 0.1302098569871943E+02 + 0.1302556328893826E+02 0.1303012985846953E+02 0.1303468542980876E+02 0.1303923002537965E+02 0.1304376366753469E+02 + 0.1304828637855533E+02 0.1305279818065219E+02 0.1305729909596507E+02 0.1306178914656352E+02 0.1306626835444681E+02 + 0.1307073674154426E+02 0.1307519432971517E+02 0.1307964114074970E+02 0.1308407719636832E+02 0.1308850251822266E+02 + 0.1309291712789514E+02 0.1309732104689959E+02 0.1310172496590404E+02 0.1310612888490850E+02 0.1311053280391295E+02 + 0.0000000000000000E+00 0.2350503764662797E-10 0.1452741565148498E-08 0.1598024605657181E-07 0.8670887247915710E-07 + 0.3194268290355064E-06 0.9210999532108705E-06 0.2243032243257230E-05 0.4826533736759059E-05 0.9449280963997414E-05 + 0.1717086310497067E-04 0.2937628005930804E-04 0.4781640004850213E-04 0.7464459701436190E-04 0.1124489746320072E-03 + 0.1642797466831127E-03 0.2336714851009560E-03 0.3246600692852489E-03 0.4417942752036344E-03 0.5901420321021944E-03 + 0.7752914499470295E-03 0.1003346783485080E-02 0.1280919550391384E-02 0.1615115062592291E-02 0.2013514662642524E-02 + 0.2484153982012019E-02 0.3035497556237696E-02 0.3676410143962806E-02 0.4416125103690986E-02 0.5264210184320288E-02 + 0.6230531083824742E-02 0.7325213125386473E-02 0.8558601392363368E-02 0.9941219653166928E-02 0.1148372839483666E-01 + 0.1319688227020127E-01 0.1509148724834461E-01 0.1717835774193908E-01 0.1946827396813322E-01 0.2197193978231332E-01 + 0.2469994120640449E-01 0.2766270585561205E-01 0.3087046344978465E-01 0.3433320757803945E-01 0.3806065886804223E-01 + 0.4206222969448004E-01 0.4634699054488188E-01 0.5092363814510472E-01 0.5580046543156136E-01 0.6098533344267084E-01 + 0.6648564518809444E-01 0.7230832154110638E-01 0.7845977918695805E-01 0.8494591064833676E-01 0.9177206639800155E-01 + 0.9894303905839608E-01 0.1064630496784886E+00 0.1143357360692630E+00 0.1225641431711653E+00 0.1311507154193881E+00 + 0.1400972910661206E+00 0.1494050984128002E+00 0.1590747538999337E+00 0.1691062619971989E+00 0.1794990168322592E+00 + 0.1902518054930074E+00 0.2013628129347618E+00 0.2128296284212524E+00 0.2246492534260200E+00 0.2368181109190946E+00 + 0.2493320559624748E+00 0.2621863875369867E+00 0.2753758615225286E+00 0.2888947047534727E+00 0.3027366300710904E+00 + 0.3168948522952475E+00 0.3313621050382702E+00 0.3461306582847914E+00 0.3611923366625136E+00 0.3765385383301647E+00 + 0.3921602544104397E+00 0.4080480888974157E+00 0.4241922789697600E+00 0.4405827156430124E+00 0.4572089646963136E+00 + 0.4740602878111100E+00 0.4911256638616449E+00 0.5083938102993529E+00 0.5258532045756759E+00 0.5434921055502246E+00 + 0.5612985748336912E+00 0.5792604980173683E+00 0.5973656057436424E+00 0.6156014945742982E+00 0.6339556476159732E+00 + 0.6524154548645443E+00 0.6709682332326954E+00 0.6896012462273114E+00 0.7083017232457365E+00 0.7270568784622643E+00 + 0.7458539292785299E+00 0.7646801143137046E+00 0.7835227109126022E+00 0.8023690521519213E+00 0.8212065433269309E+00 + 0.8400226779029110E+00 0.8588050529176166E+00 0.8775413838228915E+00 0.8962195187553934E+00 0.9148274522281129E+00 + 0.9333533382360560E+00 0.9517855027710543E+00 0.9701124557421923E+00 0.9883229022998167E+00 0.1006405753562465E+01 + 0.1024350136747383E+01 0.1042145404706545E+01 0.1059781144871260E+01 0.1077247187609600E+01 0.1094533614001869E+01 + 0.1111630763040373E+01 0.1128529238260637E+01 0.1145219913812065E+01 0.1161693939976847E+01 0.1177942748146633E+01 + 0.1193958055267189E+01 0.1209731867761823E+01 0.1225256484945006E+01 0.1240524501938026E+01 0.1255528812099049E+01 + 0.1270262608980346E+01 0.1284719387825761E+01 0.1298892946621899E+01 0.1312777386716678E+01 0.1326367113019209E+01 + 0.1339656833795096E+01 0.1352641560071424E+01 0.1365316604665792E+01 0.1377677580853886E+01 0.1389720400690019E+01 + 0.1401441272995214E+01 0.1412836701027270E+01 0.1423903479847286E+01 0.1434638693397013E+01 0.1445039711301291E+01 + 0.1455104185409776E+01 0.1464830046091919E+01 0.1474215498299109E+01 0.1483259017407622E+01 0.1491959344855860E+01 + 0.1500315483589179E+01 0.1508326693325296E+01 0.1515992485653126E+01 0.1523312618977543E+01 0.1530287093322397E+01 + 0.1536916145003750E+01 0.1543200241185077E+01 0.1549140074325868E+01 0.1554736556534737E+01 0.1559990813837915E+01 + 0.1564904180373601E+01 0.1569478192522416E+01 0.1573714582983838E+01 0.1577615274808202E+01 0.1581182375393509E+01 + 0.1584418170455991E+01 0.1587325117983052E+01 0.1589905842176854E+01 0.1592163127396545E+01 0.1594099912106772E+01 + 0.1595719282839819E+01 0.1597024468178396E+01 0.1598018832765788E+01 0.1598705871349761E+01 0.1599089202866354E+01 + 0.1599172564569312E+01 0.1598959806210704E+01 0.1598454884277914E+01 0.1597661856291940E+01 0.1596584875171653E+01 + 0.1595228183668366E+01 0.1593596108874842E+01 0.1591693056812536E+01 0.1589523507100701E+01 0.1587092007710641E+01 + 0.1584403169808198E+01 0.1581461662687349E+01 0.1578272208797470E+01 0.1574839578866685E+01 0.1571168587123450E+01 + 0.1567264086618331E+01 0.1563130964647693E+01 0.1558774138280876E+01 0.1554198549992189E+01 0.1549409163398889E+01 + 0.1544410959106127E+01 0.1539208930659677E+01 0.1533808080607080E+01 0.1528213416667707E+01 0.1522429948012042E+01 + 0.1516462681650386E+01 0.1510316618931021E+01 0.1503996752147732E+01 0.1497508061256460E+01 0.1490855510700755E+01 + 0.1484044046345540E+01 0.1477078592518635E+01 0.1469964049159342E+01 0.1462705289073315E+01 0.1455307155292826E+01 + 0.1447774458541496E+01 0.1440111974802394E+01 0.1432324442988392E+01 0.1424416562713602E+01 0.1416392992164560E+01 + 0.1408258346069873E+01 0.1400017193766902E+01 0.1391674057364033E+01 0.1383233409997026E+01 0.1374699674177898E+01 + 0.1366077220234727E+01 0.1357370364840755E+01 0.1348583369631108E+01 0.1339720439905439E+01 0.1330785723414737E+01 + 0.1321783309230582E+01 0.1312717226695031E+01 0.1303591444449351E+01 0.1294409869539786E+01 0.1285176346598528E+01 + 0.1275894657098056E+01 0.1266568518676988E+01 0.1257201584535619E+01 0.1247797442899263E+01 0.1238359616547584E+01 + 0.1228891562408019E+01 0.1219396671211496E+01 0.1209878267208578E+01 0.1200339607944202E+01 0.1190783884089205E+01 + 0.1181214219326823E+01 0.1171633670292365E+01 0.1162045226564264E+01 0.1152451810704780E+01 0.1142856278348570E+01 + 0.1133261418337408E+01 0.1123669952899346E+01 0.1114084537870646E+01 0.1104507762958775E+01 0.1094942152044870E+01 + 0.1085390163524009E+01 0.1075854190681740E+01 0.1066336562105254E+01 0.1056839542127690E+01 0.1047365331304049E+01 + 0.1037916066917227E+01 0.1028493823512701E+01 0.1019100613460447E+01 0.1009738387542688E+01 0.1000409035566070E+01 + 0.9911143869969610E+00 0.9818562116185301E+00 0.9726362202083267E+00 0.9634560652350970E+00 0.9543173415736288E+00 + 0.9452215872364120E+00 0.9361702841209427E+00 0.9271648587715566E+00 0.9182066831546644E+00 0.9092970754463097E+00 + 0.9004373008310244E+00 0.8916285723109384E+00 0.8828720515241635E+00 0.8741688495714935E+00 0.8655200278504954E+00 + 0.8569265988960664E+00 0.8483895272266132E+00 0.8399097301949807E+00 0.8314880788433289E+00 0.8231253987611650E+00 + 0.8148224709457564E+00 0.8065800326641964E+00 0.7983987783164219E+00 0.7902793602984723E+00 0.7822223898653531E+00 + 0.7742284379928720E+00 0.7662980362378170E+00 0.7584316775959118E+00 0.7506298173569868E+00 0.7428928739568187E+00 + 0.7352212298251275E+00 0.7276152322292518E+00 0.7200751941130188E+00 0.7126013949303633E+00 0.7051940814732806E+00 + 0.6978534686936988E+00 0.6905797405188852E+00 0.6833730506600221E+00 0.6762335234136188E+00 0.6691612544554096E+00 + 0.6621563116264519E+00 0.6552187357111161E+00 0.6483485412067125E+00 0.6415457170844840E+00 0.6348102275417313E+00 + 0.6281420127448483E+00 0.6215409895630656E+00 0.6150070522926947E+00 0.6085400733717113E+00 0.6021399040845107E+00 + 0.5958063752566826E+00 0.5895392979396676E+00 0.5833384640851877E+00 0.5772036472093250E+00 0.5711346030461549E+00 + 0.5651310701908592E+00 0.5591927707322315E+00 0.5533194108745153E+00 0.5475106815485299E+00 0.5417662590120353E+00 + 0.5360858054393003E+00 0.5304689694998603E+00 0.5249153869264497E+00 0.5194246810720941E+00 0.5139964634563777E+00 + 0.5086303343008993E+00 0.5033258830539155E+00 0.4980826889042317E+00 0.4929003212843441E+00 0.4877783403628898E+00 + 0.4827162975264554E+00 0.4777137358507827E+00 0.4727701905614446E+00 0.4678851894840552E+00 0.4630582534840750E+00 + 0.4582888968962981E+00 0.4535766279440972E+00 0.4489209491485098E+00 0.4443213577272558E+00 0.4397773459837845E+00 + 0.4352884016864413E+00 0.4308540084378585E+00 0.4264736460346724E+00 0.4221467908176804E+00 0.4178729160125361E+00 + 0.4136514920611062E+00 0.4094819869436024E+00 0.4053638664915989E+00 0.4012965946920645E+00 0.3972796339825281E+00 + 0.3933124455374964E+00 0.3893944895462572E+00 0.3855252254821869E+00 0.3817041123636960E+00 0.3779306090069412E+00 + 0.3742041742704262E+00 0.3705242672916375E+00 0.3668903477158274E+00 0.3633018759170965E+00 0.3597583132118892E+00 + 0.3562591220650529E+00 0.3528037662885790E+00 0.3493917112331675E+00 0.3460224239727477E+00 0.3426953734820877E+00 + 0.3394100308076194E+00 0.3361658692316251E+00 0.3329623644299036E+00 0.3297989946230563E+00 0.3266752407215223E+00 + 0.3235905864644950E+00 0.3205445185528428E+00 0.3175365267761750E+00 0.3145661041341699E+00 0.3116327469522978E+00 + 0.3087359549920661E+00 0.3058752315559112E+00 0.3030500835868565E+00 0.3002600217630693E+00 0.2975045605874296E+00 + 0.2947832184722352E+00 0.2920955178191660E+00 0.2894409850946181E+00 0.2868191509005325E+00 0.2842295500408273E+00 + 0.2816717215835535E+00 0.2791452089188812E+00 0.2766495598130334E+00 0.2741843264582723E+00 0.2717490655190478E+00 + 0.2693433381744174E+00 0.2669667101568407E+00 0.2646187517874495E+00 0.2622990380079024E+00 0.2600071484089175E+00 + 0.2577426672555859E+00 0.2555051835095635E+00 0.2532942908482358E+00 0.2511095876809479E+00 0.2489506771623981E+00 + 0.2468171672032794E+00 0.2447086704782614E+00 0.2426248044314016E+00 0.2405651912790701E+00 0.2385294580104723E+00 + 0.2365172363858518E+00 0.2345281629324596E+00 0.2325618789383613E+00 0.2306180304441682E+00 0.2286962682327625E+00 + 0.2267962478170977E+00 0.2249176294261405E+00 0.2230600779890333E+00 0.2212232631175415E+00 0.2194068590868594E+00 + 0.2176105448148379E+00 0.2158340038397009E+00 0.2140769242963177E+00 0.2123389988910903E+00 0.2106199248755169E+00 + 0.2089194040184958E+00 0.2072371425774233E+00 0.2055728512681448E+00 0.2039262452338156E+00 0.2022970440127238E+00 + 0.2006849715051299E+00 0.1990897559391716E+00 0.1975111298358903E+00 0.1959488299734197E+00 0.1944025973503926E+00 + 0.1928721771486053E+00 0.1913573186949898E+00 0.1898577754229339E+00 0.1883733048329959E+00 0.1869036684530497E+00 + 0.1854486317979078E+00 0.1840079643284546E+00 0.1825814394103312E+00 0.1811688342722097E+00 0.1797699299636905E+00 + 0.1783845113128567E+00 0.1770123668835237E+00 0.1756532889322104E+00 0.1743070733648679E+00 0.1729735196933954E+00 + 0.1716524309919727E+00 0.1703436138532354E+00 0.1690468783443259E+00 0.1677620379628421E+00 0.1664889095927099E+00 + 0.1652273134600088E+00 0.1639770730887696E+00 0.1627380152567701E+00 0.1615099699513493E+00 0.1602927703252654E+00 + 0.1590862526526123E+00 0.1578902562848216E+00 0.1567046236067624E+00 0.1555291999929633E+00 0.1543638337639696E+00 + 0.1532083761428563E+00 0.1520626812119101E+00 0.1509266058694993E+00 0.1498000097871428E+00 0.1486827553667961E+00 + 0.1475747076983654E+00 0.1464757345174640E+00 0.1453857061634240E+00 0.1443044955375730E+00 0.1432319780617891E+00 + 0.1421680316373446E+00 0.1411125366040483E+00 0.1400653756996955E+00 0.1390264340198362E+00 0.1379955989778688E+00 + 0.1369727602654673E+00 0.1359578098133525E+00 0.1349506417524104E+00 0.1339511523751675E+00 0.1329592400976282E+00 + 0.1319748054214808E+00 0.1309977508966756E+00 0.1300279810843844E+00 0.1290654025203415E+00 0.1281099236785748E+00 + 0.1271614549355259E+00 0.1262199085345698E+00 0.1252851985509296E+00 0.1243572408569959E+00 0.1234359530880505E+00 + 0.1225212546083961E+00 0.1216130664778956E+00 0.1207113114189237E+00 0.1198159137837281E+00 0.1189267995222068E+00 + 0.1180438961500998E+00 0.1171671327175942E+00 0.1162964397783483E+00 0.1154317493589289E+00 0.1145729949286663E+00 + 0.1137201113699259E+00 0.1128730349487938E+00 0.1120317032861783E+00 0.1111960553293266E+00 0.1103660313237529E+00 + 0.1095415727855802E+00 0.1087226224742927E+00 0.1079091243658972E+00 0.1071010236264925E+00 0.1062982665862460E+00 + 0.1055008007137718E+00 0.1047085745909144E+00 0.1039215378879289E+00 0.1031396413390617E+00 0.1023628367185243E+00 + 0.1015910768168619E+00 0.1008243154177097E+00 0.1000625072749386E+00 0.9930560809018427E-01 0.9855357449075822E-01 + 0.9780636400793745E-01 0.9706393505562982E-01 0.9632624690941162E-01 0.9559325968593356E-01 0.9486493432269383E-01 + 0.9414123255817297E-01 0.9342211691232764E-01 0.9270755066744044E-01 0.9199749784932158E-01 0.9129192320885827E-01 + 0.9059079220391024E-01 0.8989407098154546E-01 0.8920172636061409E-01 0.8851372581465511E-01 0.8783003745513447E-01 + 0.8715063001500779E-01 0.8647547283260665E-01 0.8580453583584287E-01 0.8513778952672810E-01 0.8447520496620298E-01 + 0.8381675375927530E-01 0.8316240804045885E-01 0.8251214045951316E-01 0.8186592416747822E-01 0.8122373280299988E-01 + 0.8058554047894315E-01 0.7995132176928955E-01 0.7932105169631275E-01 0.7869470571803144E-01 0.7807225971593283E-01 + 0.7745368998296467E-01 0.7683897321179178E-01 0.7622808648331135E-01 0.7562100725542614E-01 0.7501771335206921E-01 + 0.7441818295247755E-01 0.7382239458071076E-01 0.7323032709541087E-01 0.7264195967979867E-01 0.7205727183190487E-01 + 0.7147624335502985E-01 0.7089885434843042E-01 0.7032508519822850E-01 0.6975491656853922E-01 0.6918832939281314E-01 + 0.6862530486539103E-01 0.6806582443326617E-01 0.6750986978805110E-01 0.6695742285814540E-01 0.6640846580110123E-01 + 0.6586298099618196E-01 0.6532095103711212E-01 0.6478235872501446E-01 0.6424718706153042E-01 0.6371541924212147E-01 + 0.6318703864954746E-01 0.6266202884751911E-01 0.6214037357452046E-01 0.6162205673779986E-01 0.6110706240752450E-01 + 0.6059537481109686E-01 0.6008697832762830E-01 0.5958185748256901E-01 0.5907999694248869E-01 0.5858138151000727E-01 + 0.5808599611887154E-01 0.5759382582917469E-01 0.5710485582271634E-01 0.5661907139850073E-01 0.5613645796836825E-01 + 0.5565700105276017E-01 0.5518068627661225E-01 0.5470749936537444E-01 0.5423742614115482E-01 0.5377045251898517E-01 + 0.5330656450320408E-01 0.5284574818395761E-01 0.5238798973381230E-01 0.5193327540447994E-01 0.5148159152365149E-01 + 0.5103292449193595E-01 0.5058726077990446E-01 0.5014458692523559E-01 0.4970488952995948E-01 0.4926815525779950E-01 + 0.4883437083160901E-01 0.4840352303089959E-01 0.4797559868946120E-01 0.4755058469306943E-01 0.4712846797727979E-01 + 0.4670923552530574E-01 0.4629287436597942E-01 0.4587937157179187E-01 0.4546871425701189E-01 0.4506088957588125E-01 + 0.4465588472088415E-01 0.4425368692108926E-01 0.4385428344056262E-01 0.4345766157684944E-01 0.4306380865952269E-01 + 0.4267271204879778E-01 0.4228435913421057E-01 0.4189873733335742E-01 0.4151583409069603E-01 0.4113563687640473E-01 + 0.4075813318529899E-01 0.4038331053580396E-01 0.4001115646898086E-01 0.3964165854760631E-01 0.3927480435530239E-01 + 0.3891058149571723E-01 0.3854897759175296E-01 0.3818998028484157E-01 0.3783357723426573E-01 0.3747975611652434E-01 + 0.3712850462474054E-01 0.3677981046811218E-01 0.3643366137140177E-01 0.3609004507446641E-01 0.3574894933182556E-01 + 0.3541036191226535E-01 0.3507427059847887E-01 0.3474066318674111E-01 0.3440952748661676E-01 0.3408085132070126E-01 + 0.3375462252439219E-01 0.3343082894569176E-01 0.3310945844503797E-01 0.3279049889516447E-01 0.3247393818098731E-01 + 0.3215976419951815E-01 0.3184796485980308E-01 0.3153852808288556E-01 0.3123144180179359E-01 0.3092669396154863E-01 + 0.3062427251919747E-01 0.3032416544386438E-01 0.3002636071682391E-01 0.2973084633159302E-01 0.2943761029404197E-01 + 0.2914664062252300E-01 0.2885792534801624E-01 0.2857145251429220E-01 0.2828721017808998E-01 0.2800518640931039E-01 + 0.2772536929122391E-01 0.2744774692069189E-01 0.2717230740840119E-01 0.2689903887911129E-01 0.2662792947191326E-01 + 0.2635896734050006E-01 0.2609214065344760E-01 0.2582743759450599E-01 0.2556484636290022E-01 0.2530435517364029E-01 + 0.2504595225783962E-01 0.2478962586304191E-01 0.2453536425355501E-01 0.2428315571079263E-01 0.2403298853362201E-01 + 0.2378485103871834E-01 0.2353873156092471E-01 0.2329461845361733E-01 0.2305250008907579E-01 0.2281236485885801E-01 + 0.2257420117417889E-01 0.2233799746629312E-01 0.2210374218688127E-01 0.2187142380843883E-01 0.2164103082466791E-01 + 0.2141255175087165E-01 0.2118597512435002E-01 0.2096128950479806E-01 0.2073848347470486E-01 0.2051754563975416E-01 + 0.2029846462922549E-01 0.2008122909639606E-01 0.1986582771894261E-01 0.1965224919934375E-01 0.1944048226528158E-01 + 0.1923051567004319E-01 0.1902233819292149E-01 0.1881593863961467E-01 0.1861130584262509E-01 0.1840842866165638E-01 + 0.1820729598400922E-01 0.1800789672497538E-01 0.1781021982822961E-01 0.1761425426621972E-01 0.1741998904055397E-01 + 0.1722741318238660E-01 0.1703651575280017E-01 0.1684728584318532E-01 0.1665971257561794E-01 0.1647378510323276E-01 + 0.1628949261059417E-01 0.1610682431406360E-01 0.1592576946216329E-01 0.1574631733593689E-01 0.1556845724930608E-01 + 0.1539217854942354E-01 0.1521747061702217E-01 0.1504432286676001E-01 0.1487272474756165E-01 0.1470266574295493E-01 + 0.1453413537140393E-01 0.1436712318663735E-01 0.1420161877797267E-01 0.1403761177063589E-01 0.1387509182607664E-01 + 0.1371404864227910E-01 0.1355447195406791E-01 0.1339635153340976E-01 0.1323967718971016E-01 0.1308443877010535E-01 + 0.1293062615974990E-01 0.1277822928209887E-01 0.1262723809918580E-01 0.1247764261189538E-01 0.1232943286023138E-01 + 0.1218259892357987E-01 0.1203713092096717E-01 0.1189301901131328E-01 0.1175025339368011E-01 0.1160882430751480E-01 + 0.1146872203288826E-01 0.1132993689072848E-01 0.1119245924304928E-01 0.1105627949317382E-01 0.1092138808595317E-01 + 0.1078777550798031E-01 0.1065543228779879E-01 0.1052434899610681E-01 0.1039451624595617E-01 0.1026592469294671E-01 + 0.1013856503541558E-01 0.1001242801462182E-01 0.9887504414926333E-02 0.9763785063966725E-02 0.9641260832827890E-02 + 0.9519922636207538E-02 0.9399761432577210E-02 0.9280768224338752E-02 0.9162934057976000E-02 0.9046250024202221E-02 + 0.8930707258102832E-02 0.8816296939273676E-02 0.8703010291955119E-02 0.8590838585161509E-02 0.8479773132806546E-02 + 0.8369805293824308E-02 0.8260926472285997E-02 0.8153128117512804E-02 0.8046401724184376E-02 0.7940738832443478E-02 + 0.7836131027996606E-02 0.7732569942210602E-02 0.7630047252205678E-02 0.7528554680944333E-02 0.7428083997316856E-02 + 0.7328627016223001E-02 0.7230175598650108E-02 0.7132721651747814E-02 0.7036257128899153E-02 0.6940774029788536E-02 + 0.6846264400466227E-02 0.6752720333409701E-02 0.6660133967581916E-02 0.6568497488486375E-02 0.6477803128219479E-02 + 0.6388043165519663E-02 0.6299209925814047E-02 0.6211295781262146E-02 0.6124293150797016E-02 0.6038194500163917E-02 + 0.5952992341956366E-02 0.5868679235650055E-02 0.5785247787634298E-02 0.5702690651241371E-02 0.5621000526773856E-02 + 0.5540170161529816E-02 0.5460192349826328E-02 0.5381059933021076E-02 0.5302765799532243E-02 0.5225302884857029E-02 + 0.5148664171588471E-02 0.5072842689431090E-02 0.4997831515215207E-02 0.4923623772910095E-02 0.4850212633636272E-02 + 0.4777591315676702E-02 0.4705753084487369E-02 0.4634691252707118E-02 0.4564399180166933E-02 0.4494870273898941E-02 + 0.4426097988144961E-02 0.4358075824365064E-02 0.4290797331245945E-02 0.4224256104709619E-02 0.4158445787922197E-02 + 0.4093360071303100E-02 0.4028992692534918E-02 0.3965337436573796E-02 0.3902388135660784E-02 0.3840138669334105E-02 + 0.3778582964442547E-02 0.3717714995160261E-02 0.3657528783002880E-02 0.3598018396845369E-02 0.3539177952941635E-02 + 0.3481001614946027E-02 0.3423483593937147E-02 0.3366618148443765E-02 0.3310399584473416E-02 0.3254822255543565E-02 + 0.3199880562715664E-02 0.3145568954632342E-02 0.3091881927557716E-02 0.3038814025421337E-02 0.2986359839865667E-02 + 0.2934514010297470E-02 0.2883271223943334E-02 0.2832626215909399E-02 0.2782573769245732E-02 0.2733108715015361E-02 + 0.2684225932368273E-02 0.2635920348620736E-02 0.2588186939339922E-02 0.2541020728434335E-02 0.2494416788250113E-02 + 0.2448370239673485E-02 0.2402876252239763E-02 0.2357930044248895E-02 0.2313526882888074E-02 0.2269662084361452E-02 + 0.2226331014027437E-02 0.2183529086543647E-02 0.2141251766019886E-02 0.2099494566179429E-02 0.2058253050528833E-02 + 0.2017522832536582E-02 0.1977299575820819E-02 0.1937578994346416E-02 0.1898356852631761E-02 0.1859628965965341E-02 + 0.1821391200632576E-02 0.1783639474153031E-02 0.1746369755528287E-02 0.1709578065500809E-02 0.1673260476823867E-02 + 0.1637413114542927E-02 0.1602032156288575E-02 0.1567113832581223E-02 0.1532654427147850E-02 0.1498650277250755E-02 + 0.1465097774028671E-02 0.1431993362850165E-02 0.1399333543679485E-02 0.1367114871454921E-02 0.1335333956479567E-02 + 0.1303987464824598E-02 0.1273072118744786E-02 0.1242584697106271E-02 0.1212522035826240E-02 0.1182881028324278E-02 + 0.1153658625985074E-02 0.1124851838631879E-02 0.1096457735010339E-02 0.1068473443281882E-02 0.1040896151525936E-02 + 0.1013723108250083E-02 0.9869516229069582E-03 0.9605790664167954E-03 0.9346028716940452E-03 0.9090205341765010E-03 + 0.8838296123550832E-03 0.8590277283020786E-03 0.8346125681955534E-03 0.8105818828371373E-03 0.7869334881601800E-03 + 0.7636652657249203E-03 0.7407751631967363E-03 0.7182611948033279E-03 0.6961214417659799E-03 0.6743540526996259E-03 + 0.6529572439758464E-03 0.6319293000421489E-03 0.6112685736903467E-03 0.5909734862658870E-03 0.5710425278092155E-03 + 0.5514742571193334E-03 0.5322673017285347E-03 0.5134203577763651E-03 0.4949321897694443E-03 0.4768016302125221E-03 + 0.4590275790946831E-03 0.4416090032129194E-03 0.4245449353136761E-03 0.4078344730309316E-03 0.3914767775974666E-03 + 0.3754710723036193E-03 0.3598166406754878E-03 0.3445128243419585E-03 0.3295590205570407E-03 0.3149546793411112E-03 + 0.3006993002013562E-03 0.2867924283882840E-03 0.2732336506415988E-03 0.2600225903747107E-03 0.2471589022432513E-03 + 0.2346422660385661E-03 0.2224723798427698E-03 0.2106489523774314E-03 0.1991716944731751E-03 0.1880403095829506E-03 + 0.1772544832569928E-03 0.1668138714930798E-03 0.1567180878715900E-03 0.1469666893810824E-03 0.1375591608372710E-03 + 0.1284948977961454E-03 0.1197731878613226E-03 0.1113931902866863E-03 0.1033539137784803E-03 0.9565419240704367E-04 + 0.8829265954769630E-04 0.8126771978413778E-04 0.7457751872672617E-04 0.6821991072362678E-04 0.6219242447627770E-04 + 0.5649222661344906E-04 0.5111608333233986E-04 0.4606032028242377E-04 0.4132078095054316E-04 0.3689278390632745E-04 + 0.3277107938782920E-04 0.2894980585093507E-04 0.2542244727468145E-04 0.2218179221009314E-04 0.1921989578338595E-04 + 0.1652804611495441E-04 0.1409673689099332E-04 0.1191564811913617E-04 0.9973637403230573E-05 0.8258744369264157E-05 + 0.6758211140689631E-05 0.5458521963065276E-05 0.4345465168603044E-05 0.3404220589992921E-05 0.2619475202729796E-05 + 0.1975569103509067E-05 0.1456672814492850E-05 0.1046995232007964E-05 0.7310192213004316E-06 0.4937588492987344E-06 + 0.3210285891032542E-06 0.1997107219284094E-06 0.1180030350752796E-06 0.6562550627018659E-07 0.3396305969110393E-07 + 0.1612304561662313E-07 0.6892228656363058E-08 0.2589636663001748E-08 0.8280887390551865E-09 0.2156614040605737E-09 + 0.4301139703498805E-10 0.6010118005039632E-11 0.5149083260942099E-12 0.2193180426472887E-13 0.3274661750280784E-15 + 0.9138109562588437E-18 0.1354704193168576E-21 0.5668023630192864E-28 0.1003507143230543E-40 0.5696705688614969E-79 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.2350503764662797E-10 0.1452741565148498E-08 0.1598024605657181E-07 0.8670887247915710E-07 + 0.3194268290355064E-06 0.9210999532108705E-06 0.2243032243257230E-05 0.4826533736759059E-05 0.9449280963997414E-05 + 0.1717086310497067E-04 0.2937628005930804E-04 0.4781640004850213E-04 0.7464459701436190E-04 0.1124489746320072E-03 + 0.1642797466831127E-03 0.2336714851009560E-03 0.3246600692852489E-03 0.4417942752036344E-03 0.5901420321021944E-03 + 0.7752914499470295E-03 0.1003346783485080E-02 0.1280919550391384E-02 0.1615115062592291E-02 0.2013514662642524E-02 + 0.2484153982012019E-02 0.3035497556237696E-02 0.3676410143962806E-02 0.4416125103690986E-02 0.5264210184320288E-02 + 0.6230531083824742E-02 0.7325213125386473E-02 0.8558601392363368E-02 0.9941219653166928E-02 0.1148372839483666E-01 + 0.1319688227020127E-01 0.1509148724834461E-01 0.1717835774193908E-01 0.1946827396813322E-01 0.2197193978231332E-01 + 0.2469994120640449E-01 0.2766270585561205E-01 0.3087046344978465E-01 0.3433320757803945E-01 0.3806065886804223E-01 + 0.4206222969448004E-01 0.4634699054488188E-01 0.5092363814510472E-01 0.5580046543156136E-01 0.6098533344267084E-01 + 0.6648564518809444E-01 0.7230832154110638E-01 0.7845977918695805E-01 0.8494591064833676E-01 0.9177206639800155E-01 + 0.9894303905839608E-01 0.1064630496784886E+00 0.1143357360692630E+00 0.1225641431711653E+00 0.1311507154193881E+00 + 0.1400972910661206E+00 0.1494050984128002E+00 0.1590747538999337E+00 0.1691062619971989E+00 0.1794990168322592E+00 + 0.1902518054930074E+00 0.2013628129347618E+00 0.2128296284212524E+00 0.2246492534260200E+00 0.2368181109190946E+00 + 0.2493320559624748E+00 0.2621863875369867E+00 0.2753758615225286E+00 0.2888947047534727E+00 0.3027366300710904E+00 + 0.3168948522952475E+00 0.3313621050382702E+00 0.3461306582847914E+00 0.3611923366625136E+00 0.3765385383301647E+00 + 0.3921602544104397E+00 0.4080480888974157E+00 0.4241922789697600E+00 0.4405827156430124E+00 0.4572089646963136E+00 + 0.4740602878111100E+00 0.4911256638616449E+00 0.5083938102993529E+00 0.5258532045756759E+00 0.5434921055502246E+00 + 0.5612985748336912E+00 0.5792604980173683E+00 0.5973656057436424E+00 0.6156014945742982E+00 0.6339556476159732E+00 + 0.6524154548645443E+00 0.6709682332326954E+00 0.6896012462273114E+00 0.7083017232457365E+00 0.7270568784622643E+00 + 0.7458539292785299E+00 0.7646801143137046E+00 0.7835227109126022E+00 0.8023690521519213E+00 0.8212065433269309E+00 + 0.8400226779029110E+00 0.8588050529176166E+00 0.8775413838228915E+00 0.8962195187553934E+00 0.9148274522281129E+00 + 0.9333533382360560E+00 0.9517855027710543E+00 0.9701124557421923E+00 0.9883229022998167E+00 0.1006405753562465E+01 + 0.1024350136747383E+01 0.1042145404706545E+01 0.1059781144871260E+01 0.1077247187609600E+01 0.1094533614001869E+01 + 0.1111630763040373E+01 0.1128529238260637E+01 0.1145219913812065E+01 0.1161693939976847E+01 0.1177942748146633E+01 + 0.1193958055267189E+01 0.1209731867761823E+01 0.1225256484945006E+01 0.1240524501938026E+01 0.1255528812099049E+01 + 0.1270262608980346E+01 0.1284719387825761E+01 0.1298892946621899E+01 0.1312777386716678E+01 0.1326367113019209E+01 + 0.1339656833795096E+01 0.1352641560071424E+01 0.1365316604665792E+01 0.1377677580853886E+01 0.1389720400690019E+01 + 0.1401441272995214E+01 0.1412836701027270E+01 0.1423903479847286E+01 0.1434638693397013E+01 0.1445039711301291E+01 + 0.1455104185409776E+01 0.1464830046091919E+01 0.1474215498299109E+01 0.1483259017407622E+01 0.1491959344855860E+01 + 0.1500315483589179E+01 0.1508326693325296E+01 0.1515992485653126E+01 0.1523312618977543E+01 0.1530287093322397E+01 + 0.1536916145003750E+01 0.1543200241185077E+01 0.1549140074325868E+01 0.1554736556534737E+01 0.1559990813837915E+01 + 0.1564904180373601E+01 0.1569478192522416E+01 0.1573714582983838E+01 0.1577615274808202E+01 0.1581182375393509E+01 + 0.1584418170455991E+01 0.1587325117983052E+01 0.1589905842176854E+01 0.1592163127396545E+01 0.1594099912106772E+01 + 0.1595719282839819E+01 0.1597024468178396E+01 0.1598018832765788E+01 0.1598705871349761E+01 0.1599089202866354E+01 + 0.1599172564569312E+01 0.1598959806210704E+01 0.1598454884277914E+01 0.1597661856291940E+01 0.1596584875171653E+01 + 0.1595228183668366E+01 0.1593596108874842E+01 0.1591693056812536E+01 0.1589523507100701E+01 0.1587092007710641E+01 + 0.1584403169808198E+01 0.1581461662687349E+01 0.1578272208797470E+01 0.1574839578866685E+01 0.1571168587123450E+01 + 0.1567264086618331E+01 0.1563130964647693E+01 0.1558774138280876E+01 0.1554198549992189E+01 0.1549409163398889E+01 + 0.1544410959106127E+01 0.1539208930659677E+01 0.1533808080607080E+01 0.1528213416667707E+01 0.1522429948012042E+01 + 0.1516462681650386E+01 0.1510316618931021E+01 0.1503996752147732E+01 0.1497508061256460E+01 0.1490855510700755E+01 + 0.1484044046345540E+01 0.1477078592518635E+01 0.1469964049159342E+01 0.1462705289073315E+01 0.1455307155292826E+01 + 0.1447774458541496E+01 0.1440111974802394E+01 0.1432324442988392E+01 0.1424416562713602E+01 0.1416392992164560E+01 + 0.1408258346069873E+01 0.1400017193766902E+01 0.1391674057364033E+01 0.1383233409997026E+01 0.1374699674177898E+01 + 0.1366077220234727E+01 0.1357370364840755E+01 0.1348583369631108E+01 0.1339720439905439E+01 0.1330785723414737E+01 + 0.1321783309230582E+01 0.1312717226695031E+01 0.1303591444449351E+01 0.1294409869539786E+01 0.1285176346598528E+01 + 0.1275894657098056E+01 0.1266568518676988E+01 0.1257201584535619E+01 0.1247797442899263E+01 0.1238359616547584E+01 + 0.1228891562408019E+01 0.1219396671211496E+01 0.1209878267208578E+01 0.1200339607944202E+01 0.1190783884089205E+01 + 0.1181214219326823E+01 0.1171633670292365E+01 0.1162045226564264E+01 0.1152451810704780E+01 0.1142856278348570E+01 + 0.1133261418337408E+01 0.1123669952899346E+01 0.1114084537870646E+01 0.1104507762958775E+01 0.1094942152044870E+01 + 0.1085390163524009E+01 0.1075854190681740E+01 0.1066336562105254E+01 0.1056839542127690E+01 0.1047365331304049E+01 + 0.1037916066917227E+01 0.1028493823512701E+01 0.1019100613460447E+01 0.1009738387542688E+01 0.1000409035566070E+01 + 0.9911143869969610E+00 0.9818562116185301E+00 0.9726362202083267E+00 0.9634560652350970E+00 0.9543173415736288E+00 + 0.9452215872364120E+00 0.9361702841209427E+00 0.9271648587715566E+00 0.9182066831546644E+00 0.9092970754463097E+00 + 0.9004373008310244E+00 0.8916285723109384E+00 0.8828720515241635E+00 0.8741688495714935E+00 0.8655200278504954E+00 + 0.8569265988960664E+00 0.8483895272266132E+00 0.8399097301949807E+00 0.8314880788433289E+00 0.8231253987611650E+00 + 0.8148224709457564E+00 0.8065800326641964E+00 0.7983987783164219E+00 0.7902793602984723E+00 0.7822223898653531E+00 + 0.7742284379928720E+00 0.7662980362378170E+00 0.7584316775959118E+00 0.7506298173569868E+00 0.7428928739568187E+00 + 0.7352212298251275E+00 0.7276152322292518E+00 0.7200751941130188E+00 0.7126013949303633E+00 0.7051940814732806E+00 + 0.6978534686936988E+00 0.6905797405188852E+00 0.6833730506600221E+00 0.6762335234136188E+00 0.6691612544554096E+00 + 0.6621563116264519E+00 0.6552187357111161E+00 0.6483485412067125E+00 0.6415457170844840E+00 0.6348102275417313E+00 + 0.6281420127448483E+00 0.6215409895630656E+00 0.6150070522926947E+00 0.6085400733717113E+00 0.6021399040845107E+00 + 0.5958063752566826E+00 0.5895392979396676E+00 0.5833384640851877E+00 0.5772036472093250E+00 0.5711346030461549E+00 + 0.5651310701908592E+00 0.5591927707322315E+00 0.5533194108745153E+00 0.5475106815485299E+00 0.5417662590120353E+00 + 0.5360858054393003E+00 0.5304689694998603E+00 0.5249153869264497E+00 0.5194246810720941E+00 0.5139964634563777E+00 + 0.5086303343008993E+00 0.5033258830539155E+00 0.4980826889042317E+00 0.4929003212843441E+00 0.4877783403628898E+00 + 0.4827162975264554E+00 0.4777137358507827E+00 0.4727701905614446E+00 0.4678851894840552E+00 0.4630582534840750E+00 + 0.4582888968962981E+00 0.4535766279440972E+00 0.4489209491485098E+00 0.4443213577272558E+00 0.4397773459837845E+00 + 0.4352884016864413E+00 0.4308540084378585E+00 0.4264736460346724E+00 0.4221467908176804E+00 0.4178729160125361E+00 + 0.4136514920611062E+00 0.4094819869436024E+00 0.4053638664915989E+00 0.4012965946920645E+00 0.3972796339825281E+00 + 0.3933124455374964E+00 0.3893944895462572E+00 0.3855252254821869E+00 0.3817041123636960E+00 0.3779306090069412E+00 + 0.3742041742704262E+00 0.3705242672916375E+00 0.3668903477158274E+00 0.3633018759170965E+00 0.3597583132118892E+00 + 0.3562591220650529E+00 0.3528037662885790E+00 0.3493917112331675E+00 0.3460224239727477E+00 0.3426953734820877E+00 + 0.3394100308076194E+00 0.3361658692316251E+00 0.3329623644299036E+00 0.3297989946230563E+00 0.3266752407215223E+00 + 0.3235905864644950E+00 0.3205445185528428E+00 0.3175365267761750E+00 0.3145661041341699E+00 0.3116327469522978E+00 + 0.3087359549920661E+00 0.3058752315559112E+00 0.3030500835868565E+00 0.3002600217630693E+00 0.2975045605874296E+00 + 0.2947832184722352E+00 0.2920955178191660E+00 0.2894409850946181E+00 0.2868191509005325E+00 0.2842295500408273E+00 + 0.2816717215835535E+00 0.2791452089188812E+00 0.2766495598130334E+00 0.2741843264582723E+00 0.2717490655190478E+00 + 0.2693433381744174E+00 0.2669667101568407E+00 0.2646187517874495E+00 0.2622990380079024E+00 0.2600071484089175E+00 + 0.2577426672555859E+00 0.2555051835095635E+00 0.2532942908482358E+00 0.2511095876809479E+00 0.2489506771623981E+00 + 0.2468171672032794E+00 0.2447086704782614E+00 0.2426248044314016E+00 0.2405651912790701E+00 0.2385294580104723E+00 + 0.2365172363858518E+00 0.2345281629324596E+00 0.2325618789383613E+00 0.2306180304441682E+00 0.2286962682327625E+00 + 0.2267962478170977E+00 0.2249176294261405E+00 0.2230600779890333E+00 0.2212232631175415E+00 0.2194068590868594E+00 + 0.2176105448148379E+00 0.2158340038397009E+00 0.2140769242963177E+00 0.2123389988910903E+00 0.2106199248755169E+00 + 0.2089194040184958E+00 0.2072371425774233E+00 0.2055728512681448E+00 0.2039262452338156E+00 0.2022970440127238E+00 + 0.2006849715051299E+00 0.1990897559391716E+00 0.1975111298358903E+00 0.1959488299734197E+00 0.1944025973503926E+00 + 0.1928721771486053E+00 0.1913573186949898E+00 0.1898577754229339E+00 0.1883733048329959E+00 0.1869036684530497E+00 + 0.1854486317979078E+00 0.1840079643284546E+00 0.1825814394103312E+00 0.1811688342722097E+00 0.1797699299636905E+00 + 0.1783845113128567E+00 0.1770123668835237E+00 0.1756532889322104E+00 0.1743070733648679E+00 0.1729735196933954E+00 + 0.1716524309919727E+00 0.1703436138532354E+00 0.1690468783443259E+00 0.1677620379628421E+00 0.1664889095927099E+00 + 0.1652273134600088E+00 0.1639770730887696E+00 0.1627380152567701E+00 0.1615099699513493E+00 0.1602927703252654E+00 + 0.1590862526526123E+00 0.1578902562848216E+00 0.1567046236067624E+00 0.1555291999929633E+00 0.1543638337639696E+00 + 0.1532083761428563E+00 0.1520626812119101E+00 0.1509266058694993E+00 0.1498000097871428E+00 0.1486827553667961E+00 + 0.1475747076983654E+00 0.1464757345174640E+00 0.1453857061634240E+00 0.1443044955375730E+00 0.1432319780617891E+00 + 0.1421680316373446E+00 0.1411125366040483E+00 0.1400653756996955E+00 0.1390264340198362E+00 0.1379955989778688E+00 + 0.1369727602654673E+00 0.1359578098133525E+00 0.1349506417524104E+00 0.1339511523751675E+00 0.1329592400976282E+00 + 0.1319748054214808E+00 0.1309977508966756E+00 0.1300279810843844E+00 0.1290654025203415E+00 0.1281099236785748E+00 + 0.1271614549355259E+00 0.1262199085345698E+00 0.1252851985509296E+00 0.1243572408569959E+00 0.1234359530880505E+00 + 0.1225212546083961E+00 0.1216130664778956E+00 0.1207113114189237E+00 0.1198159137837281E+00 0.1189267995222068E+00 + 0.1180438961500998E+00 0.1171671327175942E+00 0.1162964397783483E+00 0.1154317493589289E+00 0.1145729949286663E+00 + 0.1137201113699259E+00 0.1128730349487938E+00 0.1120317032861783E+00 0.1111960553293266E+00 0.1103660313237529E+00 + 0.1095415727855802E+00 0.1087226224742927E+00 0.1079091243658972E+00 0.1071010236264925E+00 0.1062982665862460E+00 + 0.1055008007137718E+00 0.1047085745909144E+00 0.1039215378879289E+00 0.1031396413390617E+00 0.1023628367185243E+00 + 0.1015910768168619E+00 0.1008243154177097E+00 0.1000625072749386E+00 0.9930560809018427E-01 0.9855357449075822E-01 + 0.9780636400793745E-01 0.9706393505562982E-01 0.9632624690941162E-01 0.9559325968593356E-01 0.9486493432269383E-01 + 0.9414123255817297E-01 0.9342211691232764E-01 0.9270755066744044E-01 0.9199749784932158E-01 0.9129192320885827E-01 + 0.9059079220391024E-01 0.8989407098154546E-01 0.8920172636061409E-01 0.8851372581465511E-01 0.8783003745513447E-01 + 0.8715063001500779E-01 0.8647547283260665E-01 0.8580453583584287E-01 0.8513778952672810E-01 0.8447520496620298E-01 + 0.8381675375927530E-01 0.8316240804045885E-01 0.8251214045951316E-01 0.8186592416747822E-01 0.8122373280299988E-01 + 0.8058554047894315E-01 0.7995132176928955E-01 0.7932105169631275E-01 0.7869470571803144E-01 0.7807225971593283E-01 + 0.7745368998296467E-01 0.7683897321179178E-01 0.7622808648331135E-01 0.7562100725542614E-01 0.7501771335206921E-01 + 0.7441818295247755E-01 0.7382239458071076E-01 0.7323032709541087E-01 0.7264195967979867E-01 0.7205727183190487E-01 + 0.7147624335502985E-01 0.7089885434843042E-01 0.7032508519822850E-01 0.6975491656853922E-01 0.6918832939281314E-01 + 0.6862530486539103E-01 0.6806582443326617E-01 0.6750986978805110E-01 0.6695742285814540E-01 0.6640846580110123E-01 + 0.6586298099618196E-01 0.6532095103711212E-01 0.6478235872501446E-01 0.6424718706153042E-01 0.6371541924212147E-01 + 0.6318703864954746E-01 0.6266202884751911E-01 0.6214037357452046E-01 0.6162205673779986E-01 0.6110706240752450E-01 + 0.6059537481109686E-01 0.6008697832762830E-01 0.5958185748256901E-01 0.5907999694248869E-01 0.5858138151000727E-01 + 0.5808599611887154E-01 0.5759382582917469E-01 0.5710485582271634E-01 0.5661907139850073E-01 0.5613645796836825E-01 + 0.5565700105276017E-01 0.5518068627661225E-01 0.5470749936537444E-01 0.5423742614115482E-01 0.5377045251898517E-01 + 0.5330656450320408E-01 0.5284574818395761E-01 0.5238798973381230E-01 0.5193327540447994E-01 0.5148159152365149E-01 + 0.5103292449193595E-01 0.5058726077990446E-01 0.5014458692523559E-01 0.4970488952995948E-01 0.4926815525779950E-01 + 0.4883437083160901E-01 0.4840352303089959E-01 0.4797559868946120E-01 0.4755058469306943E-01 0.4712846797727979E-01 + 0.4670923552530574E-01 0.4629287436597942E-01 0.4587937157179187E-01 0.4546871425701189E-01 0.4506088957588125E-01 + 0.4465588472088415E-01 0.4425368692108926E-01 0.4385428344056262E-01 0.4345766157684944E-01 0.4306380865952269E-01 + 0.4267271204879778E-01 0.4228435913421057E-01 0.4189873733335742E-01 0.4151583409069603E-01 0.4113563687640473E-01 + 0.4075813318529899E-01 0.4038331053580396E-01 0.4001115646898086E-01 0.3964165854760631E-01 0.3927480435530239E-01 + 0.3891058149571723E-01 0.3854897759175296E-01 0.3818998028484157E-01 0.3783357723426573E-01 0.3747975611652434E-01 + 0.3712850462474054E-01 0.3677981046811218E-01 0.3643366137140177E-01 0.3609004507446641E-01 0.3574894933182556E-01 + 0.3541036191226535E-01 0.3507427059847887E-01 0.3474066318674111E-01 0.3440952748661676E-01 0.3408085132070126E-01 + 0.3375462252439219E-01 0.3343082894569176E-01 0.3310945844503797E-01 0.3279049889516447E-01 0.3247393818098731E-01 + 0.3215976419951815E-01 0.3184796485980308E-01 0.3153852808288556E-01 0.3123144180179359E-01 0.3092669396154863E-01 + 0.3062427251919747E-01 0.3032416544386438E-01 0.3002636071682391E-01 0.2973084633159302E-01 0.2943761029404197E-01 + 0.2914664062252300E-01 0.2885792534801624E-01 0.2857145251429220E-01 0.2828721017808998E-01 0.2800518640931039E-01 + 0.2772536929122391E-01 0.2744774692069189E-01 0.2717230740840119E-01 0.2689903887911129E-01 0.2662792947191326E-01 + 0.2635896734050006E-01 0.2609214065344760E-01 0.2582743759450599E-01 0.2556484636290022E-01 0.2530435517364029E-01 + 0.2504595225783962E-01 0.2478962586304191E-01 0.2453536425355501E-01 0.2428315571079263E-01 0.2403298853362201E-01 + 0.2378485103871834E-01 0.2353873156092471E-01 0.2329461845361733E-01 0.2305250008907579E-01 0.2281236485885801E-01 + 0.2257420117417889E-01 0.2233799746629312E-01 0.2210374218688127E-01 0.2187142380843883E-01 0.2164103082466791E-01 + 0.2141255175087165E-01 0.2118597512435002E-01 0.2096128950479806E-01 0.2073848347470486E-01 0.2051754563975416E-01 + 0.2029846462922549E-01 0.2008122909639606E-01 0.1986582771894261E-01 0.1965224919934375E-01 0.1944048226528158E-01 + 0.1923051567004319E-01 0.1902233819292149E-01 0.1881593863961467E-01 0.1861130584262509E-01 0.1840842866165638E-01 + 0.1820729598400922E-01 0.1800789672497538E-01 0.1781021982822961E-01 0.1761425426621972E-01 0.1741998904055397E-01 + 0.1722741318238660E-01 0.1703651575280017E-01 0.1684728584318532E-01 0.1665971257561794E-01 0.1647378510323276E-01 + 0.1628949261059417E-01 0.1610682431406360E-01 0.1592576946216329E-01 0.1574631733593689E-01 0.1556845724930608E-01 + 0.1539217854942354E-01 0.1521747061702217E-01 0.1504432286676001E-01 0.1487272474756165E-01 0.1470266574295493E-01 + 0.1453413537140393E-01 0.1436712318663735E-01 0.1420161877797267E-01 0.1403761177063589E-01 0.1387509182607664E-01 + 0.1371404864227910E-01 0.1355447195406791E-01 0.1339635153340976E-01 0.1323967718971016E-01 0.1308443877010535E-01 + 0.1293062615974990E-01 0.1277822928209887E-01 0.1262723809918580E-01 0.1247764261189538E-01 0.1232943286023138E-01 + 0.1218259892357987E-01 0.1203713092096717E-01 0.1189301901131328E-01 0.1175025339368011E-01 0.1160882430751480E-01 + 0.1146872203288826E-01 0.1132993689072848E-01 0.1119245924304928E-01 0.1105627949317382E-01 0.1092138808595317E-01 + 0.1078777550798031E-01 0.1065543228779879E-01 0.1052434899610681E-01 0.1039451624595617E-01 0.1026592469294671E-01 + 0.1013856503541558E-01 0.1001242801462182E-01 0.9887504414926333E-02 0.9763785063966725E-02 0.9641260832827890E-02 + 0.9519922636207538E-02 0.9399761432577210E-02 0.9280768224338752E-02 0.9162934057976000E-02 0.9046250024202221E-02 + 0.8930707258102832E-02 0.8816296939273676E-02 0.8703010291955119E-02 0.8590838585161509E-02 0.8479773132806546E-02 + 0.8369805293824308E-02 0.8260926472285997E-02 0.8153128117512804E-02 0.8046401724184376E-02 0.7940738832443478E-02 + 0.7836131027996606E-02 0.7732569942210602E-02 0.7630047252205678E-02 0.7528554680944333E-02 0.7428083997316856E-02 + 0.7328627016223001E-02 0.7230175598650108E-02 0.7132721651747814E-02 0.7036257128899153E-02 0.6940774029788536E-02 + 0.6846264400466227E-02 0.6752720333409701E-02 0.6660133967581916E-02 0.6568497488486375E-02 0.6477803128219479E-02 + 0.6388043165519663E-02 0.6299209925814047E-02 0.6211295781262146E-02 0.6124293150797016E-02 0.6038194500163917E-02 + 0.5952992341956366E-02 0.5868679235650055E-02 0.5785247787634298E-02 0.5702690651241371E-02 0.5621000526773856E-02 + 0.5540170161529816E-02 0.5460192349826328E-02 0.5381059933021076E-02 0.5302765799532243E-02 0.5225302884857029E-02 + 0.5148664171588471E-02 0.5072842689431090E-02 0.4997831515215207E-02 0.4923623772910095E-02 0.4850212633636272E-02 + 0.4777591315676702E-02 0.4705753084487369E-02 0.4634691252707118E-02 0.4564399180166933E-02 0.4494870273898941E-02 + 0.4426097988144961E-02 0.4358075824365064E-02 0.4290797331245945E-02 0.4224256104709619E-02 0.4158445787922197E-02 + 0.4093360071303100E-02 0.4028992692534918E-02 0.3965337436573796E-02 0.3902388135660784E-02 0.3840138669334105E-02 + 0.3778582964442547E-02 0.3717714995160261E-02 0.3657528783002880E-02 0.3598018396845369E-02 0.3539177952941635E-02 + 0.3481001614946027E-02 0.3423483593937147E-02 0.3366618148443765E-02 0.3310399584473416E-02 0.3254822255543565E-02 + 0.3199880562715664E-02 0.3145568954632342E-02 0.3091881927557716E-02 0.3038814025421337E-02 0.2986359839865667E-02 + 0.2934514010297470E-02 0.2883271223943334E-02 0.2832626215909399E-02 0.2782573769245732E-02 0.2733108715015361E-02 + 0.2684225932368273E-02 0.2635920348620736E-02 0.2588186939339922E-02 0.2541020728434335E-02 0.2494416788250113E-02 + 0.2448370239673485E-02 0.2402876252239763E-02 0.2357930044248895E-02 0.2313526882888074E-02 0.2269662084361452E-02 + 0.2226331014027437E-02 0.2183529086543647E-02 0.2141251766019886E-02 0.2099494566179429E-02 0.2058253050528833E-02 + 0.2017522832536582E-02 0.1977299575820819E-02 0.1937578994346416E-02 0.1898356852631761E-02 0.1859628965965341E-02 + 0.1821391200632576E-02 0.1783639474153031E-02 0.1746369755528287E-02 0.1709578065500809E-02 0.1673260476823867E-02 + 0.1637413114542927E-02 0.1602032156288575E-02 0.1567113832581223E-02 0.1532654427147850E-02 0.1498650277250755E-02 + 0.1465097774028671E-02 0.1431993362850165E-02 0.1399333543679485E-02 0.1367114871454921E-02 0.1335333956479567E-02 + 0.1303987464824598E-02 0.1273072118744786E-02 0.1242584697106271E-02 0.1212522035826240E-02 0.1182881028324278E-02 + 0.1153658625985074E-02 0.1124851838631879E-02 0.1096457735010339E-02 0.1068473443281882E-02 0.1040896151525936E-02 + 0.1013723108250083E-02 0.9869516229069582E-03 0.9605790664167954E-03 0.9346028716940452E-03 0.9090205341765010E-03 + 0.8838296123550832E-03 0.8590277283020786E-03 0.8346125681955534E-03 0.8105818828371373E-03 0.7869334881601800E-03 + 0.7636652657249203E-03 0.7407751631967363E-03 0.7182611948033279E-03 0.6961214417659799E-03 0.6743540526996259E-03 + 0.6529572439758464E-03 0.6319293000421489E-03 0.6112685736903467E-03 0.5909734862658870E-03 0.5710425278092155E-03 + 0.5514742571193334E-03 0.5322673017285347E-03 0.5134203577763651E-03 0.4949321897694443E-03 0.4768016302125221E-03 + 0.4590275790946831E-03 0.4416090032129194E-03 0.4245449353136761E-03 0.4078344730309316E-03 0.3914767775974666E-03 + 0.3754710723036193E-03 0.3598166406754878E-03 0.3445128243419585E-03 0.3295590205570407E-03 0.3149546793411112E-03 + 0.3006993002013562E-03 0.2867924283882840E-03 0.2732336506415988E-03 0.2600225903747107E-03 0.2471589022432513E-03 + 0.2346422660385661E-03 0.2224723798427698E-03 0.2106489523774314E-03 0.1991716944731751E-03 0.1880403095829506E-03 + 0.1772544832569928E-03 0.1668138714930798E-03 0.1567180878715900E-03 0.1469666893810824E-03 0.1375591608372710E-03 + 0.1284948977961454E-03 0.1197731878613226E-03 0.1113931902866863E-03 0.1033539137784803E-03 0.9565419240704367E-04 + 0.8829265954769630E-04 0.8126771978413778E-04 0.7457751872672617E-04 0.6821991072362678E-04 0.6219242447627770E-04 + 0.5649222661344906E-04 0.5111608333233986E-04 0.4606032028242377E-04 0.4132078095054316E-04 0.3689278390632745E-04 + 0.3277107938782920E-04 0.2894980585093507E-04 0.2542244727468145E-04 0.2218179221009314E-04 0.1921989578338595E-04 + 0.1652804611495441E-04 0.1409673689099332E-04 0.1191564811913617E-04 0.9973637403230573E-05 0.8258744369264157E-05 + 0.6758211140689631E-05 0.5458521963065276E-05 0.4345465168603044E-05 0.3404220589992921E-05 0.2619475202729796E-05 + 0.1975569103509067E-05 0.1456672814492850E-05 0.1046995232007964E-05 0.7310192213004316E-06 0.4937588492987344E-06 + 0.3210285891032542E-06 0.1997107219284094E-06 0.1180030350752796E-06 0.6562550627018659E-07 0.3396305969110393E-07 + 0.1612304561662313E-07 0.6892228656363058E-08 0.2589636663001748E-08 0.8280887390551865E-09 0.2156614040605737E-09 + 0.4301139703498805E-10 0.6010118005039632E-11 0.5149083260942099E-12 0.2193180426472887E-13 0.3274661750280784E-15 + 0.9138109562588437E-18 0.1354704193168576E-21 0.5668023630192864E-28 0.1003507143230543E-40 0.5696705688614969E-79 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.2350503764662797E-10 0.1452741565148498E-08 0.1598024605657181E-07 0.8670887247915710E-07 + 0.3194268290355064E-06 0.9210999532108705E-06 0.2243032243257230E-05 0.4826533736759059E-05 0.9449280963997414E-05 + 0.1717086310497067E-04 0.2937628005930804E-04 0.4781640004850213E-04 0.7464459701436190E-04 0.1124489746320072E-03 + 0.1642797466831127E-03 0.2336714851009560E-03 0.3246600692852489E-03 0.4417942752036344E-03 0.5901420321021944E-03 + 0.7752914499470295E-03 0.1003346783485080E-02 0.1280919550391384E-02 0.1615115062592291E-02 0.2013514662642524E-02 + 0.2484153982012019E-02 0.3035497556237696E-02 0.3676410143962806E-02 0.4416125103690986E-02 0.5264210184320288E-02 + 0.6230531083824742E-02 0.7325213125386473E-02 0.8558601392363368E-02 0.9941219653166928E-02 0.1148372839483666E-01 + 0.1319688227020127E-01 0.1509148724834461E-01 0.1717835774193908E-01 0.1946827396813322E-01 0.2197193978231332E-01 + 0.2469994120640449E-01 0.2766270585561205E-01 0.3087046344978465E-01 0.3433320757803945E-01 0.3806065886804223E-01 + 0.4206222969448004E-01 0.4634699054488188E-01 0.5092363814510472E-01 0.5580046543156136E-01 0.6098533344267084E-01 + 0.6648564518809444E-01 0.7230832154110638E-01 0.7845977918695805E-01 0.8494591064833676E-01 0.9177206639800155E-01 + 0.9894303905839608E-01 0.1064630496784886E+00 0.1143357360692630E+00 0.1225641431711653E+00 0.1311507154193881E+00 + 0.1400972910661206E+00 0.1494050984128002E+00 0.1590747538999337E+00 0.1691062619971989E+00 0.1794990168322592E+00 + 0.1902518054930074E+00 0.2013628129347618E+00 0.2128296284212524E+00 0.2246492534260200E+00 0.2368181109190946E+00 + 0.2493320559624748E+00 0.2621863875369867E+00 0.2753758615225286E+00 0.2888947047534727E+00 0.3027366300710904E+00 + 0.3168948522952475E+00 0.3313621050382702E+00 0.3461306582847914E+00 0.3611923366625136E+00 0.3765385383301647E+00 + 0.3921602544104397E+00 0.4080480888974157E+00 0.4241922789697600E+00 0.4405827156430124E+00 0.4572089646963136E+00 + 0.4740602878111100E+00 0.4911256638616449E+00 0.5083938102993529E+00 0.5258532045756759E+00 0.5434921055502246E+00 + 0.5612985748336912E+00 0.5792604980173683E+00 0.5973656057436424E+00 0.6156014945742982E+00 0.6339556476159732E+00 + 0.6524154548645443E+00 0.6709682332326954E+00 0.6896012462273114E+00 0.7083017232457365E+00 0.7270568784622643E+00 + 0.7458539292785299E+00 0.7646801143137046E+00 0.7835227109126022E+00 0.8023690521519213E+00 0.8212065433269309E+00 + 0.8400226779029110E+00 0.8588050529176166E+00 0.8775413838228915E+00 0.8962195187553934E+00 0.9148274522281129E+00 + 0.9333533382360560E+00 0.9517855027710543E+00 0.9701124557421923E+00 0.9883229022998167E+00 0.1006405753562465E+01 + 0.1024350136747383E+01 0.1042145404706545E+01 0.1059781144871260E+01 0.1077247187609600E+01 0.1094533614001869E+01 + 0.1111630763040373E+01 0.1128529238260637E+01 0.1145219913812065E+01 0.1161693939976847E+01 0.1177942748146633E+01 + 0.1193958055267189E+01 0.1209731867761823E+01 0.1225256484945006E+01 0.1240524501938026E+01 0.1255528812099049E+01 + 0.1270262608980346E+01 0.1284719387825761E+01 0.1298892946621899E+01 0.1312777386716678E+01 0.1326367113019209E+01 + 0.1339656833795096E+01 0.1352641560071424E+01 0.1365316604665792E+01 0.1377677580853886E+01 0.1389720400690019E+01 + 0.1401441272995214E+01 0.1412836701027270E+01 0.1423903479847286E+01 0.1434638693397013E+01 0.1445039711301291E+01 + 0.1455104185409776E+01 0.1464830046091919E+01 0.1474215498299109E+01 0.1483259017407622E+01 0.1491959344855860E+01 + 0.1500315483589179E+01 0.1508326693325296E+01 0.1515992485653126E+01 0.1523312618977543E+01 0.1530287093322397E+01 + 0.1536916145003750E+01 0.1543200241185077E+01 0.1549140074325868E+01 0.1554736556534737E+01 0.1559990813837915E+01 + 0.1564904180373601E+01 0.1569478192522416E+01 0.1573714582983838E+01 0.1577615274808202E+01 0.1581182375393509E+01 + 0.1584418170455991E+01 0.1587325117983052E+01 0.1589905842176854E+01 0.1592163127396545E+01 0.1594099912106772E+01 + 0.1595719282839819E+01 0.1597024468178396E+01 0.1598018832765788E+01 0.1598705871349761E+01 0.1599089202866354E+01 + 0.1599172564569312E+01 0.1598959806210704E+01 0.1598454884277914E+01 0.1597661856291940E+01 0.1596584875171653E+01 + 0.1595228183668366E+01 0.1593596108874842E+01 0.1591693056812536E+01 0.1589523507100701E+01 0.1587092007710641E+01 + 0.1584403169808198E+01 0.1581461662687349E+01 0.1578272208797470E+01 0.1574839578866685E+01 0.1571168587123450E+01 + 0.1567264086618331E+01 0.1563130964647693E+01 0.1558774138280876E+01 0.1554198549992189E+01 0.1549409163398889E+01 + 0.1544410959106127E+01 0.1539208930659677E+01 0.1533808080607080E+01 0.1528213416667707E+01 0.1522429948012042E+01 + 0.1516462681650386E+01 0.1510316618931021E+01 0.1503996752147732E+01 0.1497508061256460E+01 0.1490855510700755E+01 + 0.1484044046345540E+01 0.1477078592518635E+01 0.1469964049159342E+01 0.1462705289073315E+01 0.1455307155292826E+01 + 0.1447774458541496E+01 0.1440111974802394E+01 0.1432324442988392E+01 0.1424416562713602E+01 0.1416392992164560E+01 + 0.1408258346069873E+01 0.1400017193766902E+01 0.1391674057364033E+01 0.1383233409997026E+01 0.1374699674177898E+01 + 0.1366077220234727E+01 0.1357370364840755E+01 0.1348583369631108E+01 0.1339720439905439E+01 0.1330785723414737E+01 + 0.1321783309230582E+01 0.1312717226695031E+01 0.1303591444449351E+01 0.1294409869539786E+01 0.1285176346598528E+01 + 0.1275894657098056E+01 0.1266568518676988E+01 0.1257201584535619E+01 0.1247797442899263E+01 0.1238359616547584E+01 + 0.1228891562408019E+01 0.1219396671211496E+01 0.1209878267208578E+01 0.1200339607944202E+01 0.1190783884089205E+01 + 0.1181214219326823E+01 0.1171633670292365E+01 0.1162045226564264E+01 0.1152451810704780E+01 0.1142856278348570E+01 + 0.1133261418337408E+01 0.1123669952899346E+01 0.1114084537870646E+01 0.1104507762958775E+01 0.1094942152044870E+01 + 0.1085390163524009E+01 0.1075854190681740E+01 0.1066336562105254E+01 0.1056839542127690E+01 0.1047365331304049E+01 + 0.1037916066917227E+01 0.1028493823512701E+01 0.1019100613460447E+01 0.1009738387542688E+01 0.1000409035566070E+01 + 0.9911143869969610E+00 0.9818562116185301E+00 0.9726362202083267E+00 0.9634560652350970E+00 0.9543173415736288E+00 + 0.9452215872364120E+00 0.9361702841209427E+00 0.9271648587715566E+00 0.9182066831546644E+00 0.9092970754463097E+00 + 0.9004373008310244E+00 0.8916285723109384E+00 0.8828720515241635E+00 0.8741688495714935E+00 0.8655200278504954E+00 + 0.8569265988960664E+00 0.8483895272266132E+00 0.8399097301949807E+00 0.8314880788433289E+00 0.8231253987611650E+00 + 0.8148224709457564E+00 0.8065800326641964E+00 0.7983987783164219E+00 0.7902793602984723E+00 0.7822223898653531E+00 + 0.7742284379928720E+00 0.7662980362378170E+00 0.7584316775959118E+00 0.7506298173569868E+00 0.7428928739568187E+00 + 0.7352212298251275E+00 0.7276152322292518E+00 0.7200751941130188E+00 0.7126013949303633E+00 0.7051940814732806E+00 + 0.6978534686936988E+00 0.6905797405188852E+00 0.6833730506600221E+00 0.6762335234136188E+00 0.6691612544554096E+00 + 0.6621563116264519E+00 0.6552187357111161E+00 0.6483485412067125E+00 0.6415457170844840E+00 0.6348102275417313E+00 + 0.6281420127448483E+00 0.6215409895630656E+00 0.6150070522926947E+00 0.6085400733717113E+00 0.6021399040845107E+00 + 0.5958063752566826E+00 0.5895392979396676E+00 0.5833384640851877E+00 0.5772036472093250E+00 0.5711346030461549E+00 + 0.5651310701908592E+00 0.5591927707322315E+00 0.5533194108745153E+00 0.5475106815485299E+00 0.5417662590120353E+00 + 0.5360858054393003E+00 0.5304689694998603E+00 0.5249153869264497E+00 0.5194246810720941E+00 0.5139964634563777E+00 + 0.5086303343008993E+00 0.5033258830539155E+00 0.4980826889042317E+00 0.4929003212843441E+00 0.4877783403628898E+00 + 0.4827162975264554E+00 0.4777137358507827E+00 0.4727701905614446E+00 0.4678851894840552E+00 0.4630582534840750E+00 + 0.4582888968962981E+00 0.4535766279440972E+00 0.4489209491485098E+00 0.4443213577272558E+00 0.4397773459837845E+00 + 0.4352884016864413E+00 0.4308540084378585E+00 0.4264736460346724E+00 0.4221467908176804E+00 0.4178729160125361E+00 + 0.4136514920611062E+00 0.4094819869436024E+00 0.4053638664915989E+00 0.4012965946920645E+00 0.3972796339825281E+00 + 0.3933124455374964E+00 0.3893944895462572E+00 0.3855252254821869E+00 0.3817041123636960E+00 0.3779306090069412E+00 + 0.3742041742704262E+00 0.3705242672916375E+00 0.3668903477158274E+00 0.3633018759170965E+00 0.3597583132118892E+00 + 0.3562591220650529E+00 0.3528037662885790E+00 0.3493917112331675E+00 0.3460224239727477E+00 0.3426953734820877E+00 + 0.3394100308076194E+00 0.3361658692316251E+00 0.3329623644299036E+00 0.3297989946230563E+00 0.3266752407215223E+00 + 0.3235905864644950E+00 0.3205445185528428E+00 0.3175365267761750E+00 0.3145661041341699E+00 0.3116327469522978E+00 + 0.3087359549920661E+00 0.3058752315559112E+00 0.3030500835868565E+00 0.3002600217630693E+00 0.2975045605874296E+00 + 0.2947832184722352E+00 0.2920955178191660E+00 0.2894409850946181E+00 0.2868191509005325E+00 0.2842295500408273E+00 + 0.2816717215835535E+00 0.2791452089188812E+00 0.2766495598130334E+00 0.2741843264582723E+00 0.2717490655190478E+00 + 0.2693433381744174E+00 0.2669667101568407E+00 0.2646187517874495E+00 0.2622990380079024E+00 0.2600071484089175E+00 + 0.2577426672555859E+00 0.2555051835095635E+00 0.2532942908482358E+00 0.2511095876809479E+00 0.2489506771623981E+00 + 0.2468171672032794E+00 0.2447086704782614E+00 0.2426248044314016E+00 0.2405651912790701E+00 0.2385294580104723E+00 + 0.2365172363858518E+00 0.2345281629324596E+00 0.2325618789383613E+00 0.2306180304441682E+00 0.2286962682327625E+00 + 0.2267962478170977E+00 0.2249176294261405E+00 0.2230600779890333E+00 0.2212232631175415E+00 0.2194068590868594E+00 + 0.2176105448148379E+00 0.2158340038397009E+00 0.2140769242963177E+00 0.2123389988910903E+00 0.2106199248755169E+00 + 0.2089194040184958E+00 0.2072371425774233E+00 0.2055728512681448E+00 0.2039262452338156E+00 0.2022970440127238E+00 + 0.2006849715051299E+00 0.1990897559391716E+00 0.1975111298358903E+00 0.1959488299734197E+00 0.1944025973503926E+00 + 0.1928721771486053E+00 0.1913573186949898E+00 0.1898577754229339E+00 0.1883733048329959E+00 0.1869036684530497E+00 + 0.1854486317979078E+00 0.1840079643284546E+00 0.1825814394103312E+00 0.1811688342722097E+00 0.1797699299636905E+00 + 0.1783845113128567E+00 0.1770123668835237E+00 0.1756532889322104E+00 0.1743070733648679E+00 0.1729735196933954E+00 + 0.1716524309919727E+00 0.1703436138532354E+00 0.1690468783443259E+00 0.1677620379628421E+00 0.1664889095927099E+00 + 0.1652273134600088E+00 0.1639770730887696E+00 0.1627380152567701E+00 0.1615099699513493E+00 0.1602927703252654E+00 + 0.1590862526526123E+00 0.1578902562848216E+00 0.1567046236067624E+00 0.1555291999929633E+00 0.1543638337639696E+00 + 0.1532083761428563E+00 0.1520626812119101E+00 0.1509266058694993E+00 0.1498000097871428E+00 0.1486827553667961E+00 + 0.1475747076983654E+00 0.1464757345174640E+00 0.1453857061634240E+00 0.1443044955375730E+00 0.1432319780617891E+00 + 0.1421680316373446E+00 0.1411125366040483E+00 0.1400653756996955E+00 0.1390264340198362E+00 0.1379955989778688E+00 + 0.1369727602654673E+00 0.1359578098133525E+00 0.1349506417524104E+00 0.1339511523751675E+00 0.1329592400976282E+00 + 0.1319748054214808E+00 0.1309977508966756E+00 0.1300279810843844E+00 0.1290654025203415E+00 0.1281099236785748E+00 + 0.1271614549355259E+00 0.1262199085345698E+00 0.1252851985509296E+00 0.1243572408569959E+00 0.1234359530880505E+00 + 0.1225212546083961E+00 0.1216130664778956E+00 0.1207113114189237E+00 0.1198159137837281E+00 0.1189267995222068E+00 + 0.1180438961500998E+00 0.1171671327175942E+00 0.1162964397783483E+00 0.1154317493589289E+00 0.1145729949286663E+00 + 0.1137201113699259E+00 0.1128730349487938E+00 0.1120317032861783E+00 0.1111960553293266E+00 0.1103660313237529E+00 + 0.1095415727855802E+00 0.1087226224742927E+00 0.1079091243658972E+00 0.1071010236264925E+00 0.1062982665862460E+00 + 0.1055008007137718E+00 0.1047085745909144E+00 0.1039215378879289E+00 0.1031396413390617E+00 0.1023628367185243E+00 + 0.1015910768168619E+00 0.1008243154177097E+00 0.1000625072749386E+00 0.9930560809018427E-01 0.9855357449075822E-01 + 0.9780636400793745E-01 0.9706393505562982E-01 0.9632624690941162E-01 0.9559325968593356E-01 0.9486493432269383E-01 + 0.9414123255817297E-01 0.9342211691232764E-01 0.9270755066744044E-01 0.9199749784932158E-01 0.9129192320885827E-01 + 0.9059079220391024E-01 0.8989407098154546E-01 0.8920172636061409E-01 0.8851372581465511E-01 0.8783003745513447E-01 + 0.8715063001500779E-01 0.8647547283260665E-01 0.8580453583584287E-01 0.8513778952672810E-01 0.8447520496620298E-01 + 0.8381675375927530E-01 0.8316240804045885E-01 0.8251214045951316E-01 0.8186592416747822E-01 0.8122373280299988E-01 + 0.8058554047894315E-01 0.7995132176928955E-01 0.7932105169631275E-01 0.7869470571803144E-01 0.7807225971593283E-01 + 0.7745368998296467E-01 0.7683897321179178E-01 0.7622808648331135E-01 0.7562100725542614E-01 0.7501771335206921E-01 + 0.7441818295247755E-01 0.7382239458071076E-01 0.7323032709541087E-01 0.7264195967979867E-01 0.7205727183190487E-01 + 0.7147624335502985E-01 0.7089885434843042E-01 0.7032508519822850E-01 0.6975491656853922E-01 0.6918832939281314E-01 + 0.6862530486539103E-01 0.6806582443326617E-01 0.6750986978805110E-01 0.6695742285814540E-01 0.6640846580110123E-01 + 0.6586298099618196E-01 0.6532095103711212E-01 0.6478235872501446E-01 0.6424718706153042E-01 0.6371541924212147E-01 + 0.6318703864954746E-01 0.6266202884751911E-01 0.6214037357452046E-01 0.6162205673779986E-01 0.6110706240752450E-01 + 0.6059537481109686E-01 0.6008697832762830E-01 0.5958185748256901E-01 0.5907999694248869E-01 0.5858138151000727E-01 + 0.5808599611887154E-01 0.5759382582917469E-01 0.5710485582271634E-01 0.5661907139850073E-01 0.5613645796836825E-01 + 0.5565700105276017E-01 0.5518068627661225E-01 0.5470749936537444E-01 0.5423742614115482E-01 0.5377045251898517E-01 + 0.5330656450320408E-01 0.5284574818395761E-01 0.5238798973381230E-01 0.5193327540447994E-01 0.5148159152365149E-01 + 0.5103292449193595E-01 0.5058726077990446E-01 0.5014458692523559E-01 0.4970488952995948E-01 0.4926815525779950E-01 + 0.4883437083160901E-01 0.4840352303089959E-01 0.4797559868946120E-01 0.4755058469306943E-01 0.4712846797727979E-01 + 0.4670923552530574E-01 0.4629287436597942E-01 0.4587937157179187E-01 0.4546871425701189E-01 0.4506088957588125E-01 + 0.4465588472088415E-01 0.4425368692108926E-01 0.4385428344056262E-01 0.4345766157684944E-01 0.4306380865952269E-01 + 0.4267271204879778E-01 0.4228435913421057E-01 0.4189873733335742E-01 0.4151583409069603E-01 0.4113563687640473E-01 + 0.4075813318529899E-01 0.4038331053580396E-01 0.4001115646898086E-01 0.3964165854760631E-01 0.3927480435530239E-01 + 0.3891058149571723E-01 0.3854897759175296E-01 0.3818998028484157E-01 0.3783357723426573E-01 0.3747975611652434E-01 + 0.3712850462474054E-01 0.3677981046811218E-01 0.3643366137140177E-01 0.3609004507446641E-01 0.3574894933182556E-01 + 0.3541036191226535E-01 0.3507427059847887E-01 0.3474066318674111E-01 0.3440952748661676E-01 0.3408085132070126E-01 + 0.3375462252439219E-01 0.3343082894569176E-01 0.3310945844503797E-01 0.3279049889516447E-01 0.3247393818098731E-01 + 0.3215976419951815E-01 0.3184796485980308E-01 0.3153852808288556E-01 0.3123144180179359E-01 0.3092669396154863E-01 + 0.3062427251919747E-01 0.3032416544386438E-01 0.3002636071682391E-01 0.2973084633159302E-01 0.2943761029404197E-01 + 0.2914664062252300E-01 0.2885792534801624E-01 0.2857145251429220E-01 0.2828721017808998E-01 0.2800518640931039E-01 + 0.2772536929122391E-01 0.2744774692069189E-01 0.2717230740840119E-01 0.2689903887911129E-01 0.2662792947191326E-01 + 0.2635896734050006E-01 0.2609214065344760E-01 0.2582743759450599E-01 0.2556484636290022E-01 0.2530435517364029E-01 + 0.2504595225783962E-01 0.2478962586304191E-01 0.2453536425355501E-01 0.2428315571079263E-01 0.2403298853362201E-01 + 0.2378485103871834E-01 0.2353873156092471E-01 0.2329461845361733E-01 0.2305250008907579E-01 0.2281236485885801E-01 + 0.2257420117417889E-01 0.2233799746629312E-01 0.2210374218688127E-01 0.2187142380843883E-01 0.2164103082466791E-01 + 0.2141255175087165E-01 0.2118597512435002E-01 0.2096128950479806E-01 0.2073848347470486E-01 0.2051754563975416E-01 + 0.2029846462922549E-01 0.2008122909639606E-01 0.1986582771894261E-01 0.1965224919934375E-01 0.1944048226528158E-01 + 0.1923051567004319E-01 0.1902233819292149E-01 0.1881593863961467E-01 0.1861130584262509E-01 0.1840842866165638E-01 + 0.1820729598400922E-01 0.1800789672497538E-01 0.1781021982822961E-01 0.1761425426621972E-01 0.1741998904055397E-01 + 0.1722741318238660E-01 0.1703651575280017E-01 0.1684728584318532E-01 0.1665971257561794E-01 0.1647378510323276E-01 + 0.1628949261059417E-01 0.1610682431406360E-01 0.1592576946216329E-01 0.1574631733593689E-01 0.1556845724930608E-01 + 0.1539217854942354E-01 0.1521747061702217E-01 0.1504432286676001E-01 0.1487272474756165E-01 0.1470266574295493E-01 + 0.1453413537140393E-01 0.1436712318663735E-01 0.1420161877797267E-01 0.1403761177063589E-01 0.1387509182607664E-01 + 0.1371404864227910E-01 0.1355447195406791E-01 0.1339635153340976E-01 0.1323967718971016E-01 0.1308443877010535E-01 + 0.1293062615974990E-01 0.1277822928209887E-01 0.1262723809918580E-01 0.1247764261189538E-01 0.1232943286023138E-01 + 0.1218259892357987E-01 0.1203713092096717E-01 0.1189301901131328E-01 0.1175025339368011E-01 0.1160882430751480E-01 + 0.1146872203288826E-01 0.1132993689072848E-01 0.1119245924304928E-01 0.1105627949317382E-01 0.1092138808595317E-01 + 0.1078777550798031E-01 0.1065543228779879E-01 0.1052434899610681E-01 0.1039451624595617E-01 0.1026592469294671E-01 + 0.1013856503541558E-01 0.1001242801462182E-01 0.9887504414926333E-02 0.9763785063966725E-02 0.9641260832827890E-02 + 0.9519922636207538E-02 0.9399761432577210E-02 0.9280768224338752E-02 0.9162934057976000E-02 0.9046250024202221E-02 + 0.8930707258102832E-02 0.8816296939273676E-02 0.8703010291955119E-02 0.8590838585161509E-02 0.8479773132806546E-02 + 0.8369805293824308E-02 0.8260926472285997E-02 0.8153128117512804E-02 0.8046401724184376E-02 0.7940738832443478E-02 + 0.7836131027996606E-02 0.7732569942210602E-02 0.7630047252205678E-02 0.7528554680944333E-02 0.7428083997316856E-02 + 0.7328627016223001E-02 0.7230175598650108E-02 0.7132721651747814E-02 0.7036257128899153E-02 0.6940774029788536E-02 + 0.6846264400466227E-02 0.6752720333409701E-02 0.6660133967581916E-02 0.6568497488486375E-02 0.6477803128219479E-02 + 0.6388043165519663E-02 0.6299209925814047E-02 0.6211295781262146E-02 0.6124293150797016E-02 0.6038194500163917E-02 + 0.5952992341956366E-02 0.5868679235650055E-02 0.5785247787634298E-02 0.5702690651241371E-02 0.5621000526773856E-02 + 0.5540170161529816E-02 0.5460192349826328E-02 0.5381059933021076E-02 0.5302765799532243E-02 0.5225302884857029E-02 + 0.5148664171588471E-02 0.5072842689431090E-02 0.4997831515215207E-02 0.4923623772910095E-02 0.4850212633636272E-02 + 0.4777591315676702E-02 0.4705753084487369E-02 0.4634691252707118E-02 0.4564399180166933E-02 0.4494870273898941E-02 + 0.4426097988144961E-02 0.4358075824365064E-02 0.4290797331245945E-02 0.4224256104709619E-02 0.4158445787922197E-02 + 0.4093360071303100E-02 0.4028992692534918E-02 0.3965337436573796E-02 0.3902388135660784E-02 0.3840138669334105E-02 + 0.3778582964442547E-02 0.3717714995160261E-02 0.3657528783002880E-02 0.3598018396845369E-02 0.3539177952941635E-02 + 0.3481001614946027E-02 0.3423483593937147E-02 0.3366618148443765E-02 0.3310399584473416E-02 0.3254822255543565E-02 + 0.3199880562715664E-02 0.3145568954632342E-02 0.3091881927557716E-02 0.3038814025421337E-02 0.2986359839865667E-02 + 0.2934514010297470E-02 0.2883271223943334E-02 0.2832626215909399E-02 0.2782573769245732E-02 0.2733108715015361E-02 + 0.2684225932368273E-02 0.2635920348620736E-02 0.2588186939339922E-02 0.2541020728434335E-02 0.2494416788250113E-02 + 0.2448370239673485E-02 0.2402876252239763E-02 0.2357930044248895E-02 0.2313526882888074E-02 0.2269662084361452E-02 + 0.2226331014027437E-02 0.2183529086543647E-02 0.2141251766019886E-02 0.2099494566179429E-02 0.2058253050528833E-02 + 0.2017522832536582E-02 0.1977299575820819E-02 0.1937578994346416E-02 0.1898356852631761E-02 0.1859628965965341E-02 + 0.1821391200632576E-02 0.1783639474153031E-02 0.1746369755528287E-02 0.1709578065500809E-02 0.1673260476823867E-02 + 0.1637413114542927E-02 0.1602032156288575E-02 0.1567113832581223E-02 0.1532654427147850E-02 0.1498650277250755E-02 + 0.1465097774028671E-02 0.1431993362850165E-02 0.1399333543679485E-02 0.1367114871454921E-02 0.1335333956479567E-02 + 0.1303987464824598E-02 0.1273072118744786E-02 0.1242584697106271E-02 0.1212522035826240E-02 0.1182881028324278E-02 + 0.1153658625985074E-02 0.1124851838631879E-02 0.1096457735010339E-02 0.1068473443281882E-02 0.1040896151525936E-02 + 0.1013723108250083E-02 0.9869516229069582E-03 0.9605790664167954E-03 0.9346028716940452E-03 0.9090205341765010E-03 + 0.8838296123550832E-03 0.8590277283020786E-03 0.8346125681955534E-03 0.8105818828371373E-03 0.7869334881601800E-03 + 0.7636652657249203E-03 0.7407751631967363E-03 0.7182611948033279E-03 0.6961214417659799E-03 0.6743540526996259E-03 + 0.6529572439758464E-03 0.6319293000421489E-03 0.6112685736903467E-03 0.5909734862658870E-03 0.5710425278092155E-03 + 0.5514742571193334E-03 0.5322673017285347E-03 0.5134203577763651E-03 0.4949321897694443E-03 0.4768016302125221E-03 + 0.4590275790946831E-03 0.4416090032129194E-03 0.4245449353136761E-03 0.4078344730309316E-03 0.3914767775974666E-03 + 0.3754710723036193E-03 0.3598166406754878E-03 0.3445128243419585E-03 0.3295590205570407E-03 0.3149546793411112E-03 + 0.3006993002013562E-03 0.2867924283882840E-03 0.2732336506415988E-03 0.2600225903747107E-03 0.2471589022432513E-03 + 0.2346422660385661E-03 0.2224723798427698E-03 0.2106489523774314E-03 0.1991716944731751E-03 0.1880403095829506E-03 + 0.1772544832569928E-03 0.1668138714930798E-03 0.1567180878715900E-03 0.1469666893810824E-03 0.1375591608372710E-03 + 0.1284948977961454E-03 0.1197731878613226E-03 0.1113931902866863E-03 0.1033539137784803E-03 0.9565419240704367E-04 + 0.8829265954769630E-04 0.8126771978413778E-04 0.7457751872672617E-04 0.6821991072362678E-04 0.6219242447627770E-04 + 0.5649222661344906E-04 0.5111608333233986E-04 0.4606032028242377E-04 0.4132078095054316E-04 0.3689278390632745E-04 + 0.3277107938782920E-04 0.2894980585093507E-04 0.2542244727468145E-04 0.2218179221009314E-04 0.1921989578338595E-04 + 0.1652804611495441E-04 0.1409673689099332E-04 0.1191564811913617E-04 0.9973637403230573E-05 0.8258744369264157E-05 + 0.6758211140689631E-05 0.5458521963065276E-05 0.4345465168603044E-05 0.3404220589992921E-05 0.2619475202729796E-05 + 0.1975569103509067E-05 0.1456672814492850E-05 0.1046995232007964E-05 0.7310192213004316E-06 0.4937588492987344E-06 + 0.3210285891032542E-06 0.1997107219284094E-06 0.1180030350752796E-06 0.6562550627018659E-07 0.3396305969110393E-07 + 0.1612304561662313E-07 0.6892228656363058E-08 0.2589636663001748E-08 0.8280887390551865E-09 0.2156614040605737E-09 + 0.4301139703498805E-10 0.6010118005039632E-11 0.5149083260942099E-12 0.2193180426472887E-13 0.3274661750280784E-15 + 0.9138109562588437E-18 0.1354704193168576E-21 0.5668023630192864E-28 0.1003507143230543E-40 0.5696705688614969E-79 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 1 1.0080 1.8000 fcc + 0.0000000000000000E+00 -0.1535560579048078E+00 -0.2907237616945244E+00 -0.4159976694362098E+00 -0.5313742240924204E+00 + -0.6381516341634162E+00 -0.7372865497340048E+00 -0.8295323942693905E+00 -0.9155075568639930E+00 -0.9957340210656841E+00 + -0.1070661374993902E+01 -0.1140682768426532E+01 -0.1206146070115003E+01 -0.1267361986331669E+01 -0.1324610161159111E+01 + -0.1378143882981543E+01 -0.1428193796698535E+01 -0.1474970886958801E+01 -0.1518668914237085E+01 -0.1559466431801390E+01 + -0.1597528475905044E+01 -0.1633007997183788E+01 -0.1666047084236993E+01 -0.1696778018255523E+01 -0.1725324188761563E+01 + -0.1751800894031140E+01 -0.1776316044902340E+01 -0.1798970786973415E+01 -0.1819860053348930E+01 -0.1839073057876778E+01 + -0.1856693737076276E+01 -0.1872801147573207E+01 -0.1887469824748019E+01 -0.1900770107406360E+01 -0.1912768432550330E+01 + -0.1923527603729046E+01 -0.1933107035951585E+01 -0.1941562979733216E+01 -0.1948948726501137E+01 -0.1955314797295812E+01 + -0.1960709116458849E+01 -0.1965177171789682E+01 -0.1968762162475479E+01 -0.1971505135945817E+01 -0.1973445114672207E+01 + -0.1974619213818786E+01 -0.1975062750551728E+01 -0.1974809345728893E+01 -0.1973891018616083E+01 -0.1972338275210313E+01 + -0.1970180190692498E+01 -0.1967444486480829E+01 -0.1964157602310837E+01 -0.1960344763727966E+01 -0.1956030045342894E+01 + -0.1951236430167903E+01 -0.1945985865324263E+01 -0.1940299314385106E+01 -0.1934196806595530E+01 -0.1927697483190939E+01 + -0.1920819641016471E+01 -0.1913580773633311E+01 -0.1905997610082929E+01 -0.1898086151466418E+01 -0.1889861705483819E+01 + -0.1881338919067047E+01 -0.1872531809229777E+01 -0.1863453792248377E+01 -0.1854117711279363E+01 -0.1844535862511214E+01 + -0.1834720019941148E+01 -0.1824681458861012E+01 -0.1814430978130464E+01 -0.1803978921310083E+01 -0.1793335196722089E+01 + -0.1782509296501631E+01 -0.1771510314697401E+01 -0.1760346964476296E+01 -0.1749027594483329E+01 -0.1737560204404532E+01 + -0.1725952459777540E+01 -0.1714211706091635E+01 -0.1702344982216385E+01 -0.1690359033195583E+01 -0.1678260322440748E+01 + -0.1666055043356523E+01 -0.1653749130428169E+01 -0.1641348269799635E+01 -0.1628857909368793E+01 -0.1616283268425060E+01 + -0.1603629346852960E+01 -0.1590900933923877E+01 -0.1578102616696916E+01 -0.1565238788048639E+01 -0.1552313654350187E+01 + -0.1539331242809444E+01 -0.1526295408494650E+01 -0.1513209841055223E+01 -0.1500078071154424E+01 -0.1486903476627897E+01 + -0.1473689288381174E+01 -0.1460438596038697E+01 -0.1447154353356060E+01 -0.1433839383406718E+01 -0.1420496383553594E+01 + -0.1407127930215773E+01 -0.1393736483439595E+01 -0.1380324391283206E+01 -0.1366893894023143E+01 -0.1353447128190937E+01 + -0.1339986130447453E+01 -0.1326512841302277E+01 -0.1313029108685023E+01 -0.1299536691375160E+01 -0.1286037262296563E+01 + -0.1272532411682773E+01 -0.1259023650118594E+01 -0.1245512411463359E+01 -0.1232000055660992E+01 -0.1218487871441779E+01 + -0.1204977078920362E+01 -0.1191468832094503E+01 -0.1177964221248664E+01 -0.1164464275266519E+01 -0.1150969963856213E+01 + -0.1137482199691838E+01 -0.1124001840474834E+01 -0.1110529690918452E+01 -0.1097066504658454E+01 -0.1083612986093118E+01 + -0.1070169792155417E+01 -0.1056737534020013E+01 -0.1043316778747819E+01 -0.1029908050870580E+01 -0.1016511833917833E+01 + -0.1003128571888578E+01 -0.9897586706698354E+00 -0.9764024994041254E+00 -0.9630603918080221E+00 -0.9497326474434862E+00 + -0.9364195329439393E+00 -0.9231212831968543E+00 -0.9098381024844113E+00 -0.8965701655839697E+00 -0.8833176188297485E+00 + -0.8700805811373453E+00 -0.8568591449923775E+00 -0.8436533774046202E+00 -0.8304633208290344E+00 -0.8172889940547750E+00 + -0.8041303930634986E+00 -0.7909874918580566E+00 -0.7778602432626174E+00 -0.7647485796954503E+00 -0.7516524139151204E+00 + -0.7385716397412827E+00 -0.7255061327509165E+00 -0.7124557509508342E+00 -0.6994203354274540E+00 -0.6863997109745679E+00 + -0.6733936866998824E+00 -0.6604020566111790E+00 -0.6474246001827013E+00 -0.6344610829025981E+00 -0.6215112568020091E+00 + -0.6085748609664665E+00 -0.5956516220302268E+00 -0.5827412546541748E+00 -0.5698434619878014E+00 -0.5569579361158532E+00 + -0.5440843584902399E+00 -0.5312224003475492E+00 -0.5183717231128886E+00 -0.5055319787902968E+00 -0.4927028103404054E+00 + -0.4798838520455784E+00 -0.4670747298631208E+00 -0.4542750617668665E+00 -0.4414844580776081E+00 -0.4287025217826503E+00 + -0.4159288488449873E+00 -0.4031630285022929E+00 -0.3904046435562347E+00 -0.3776532706523132E+00 -0.3649084805505702E+00 + -0.3521698383875012E+00 -0.3394369039294391E+00 -0.3267092318177014E+00 -0.3139863718057774E+00 -0.3012678689887569E+00 + -0.2885532640253530E+00 -0.2758420933527601E+00 -0.2631338893944120E+00 -0.2504281807610877E+00 -0.2377244924455082E+00 + -0.2250223460105389E+00 -0.2123212597713198E+00 -0.1996207489715085E+00 -0.1869203259537742E+00 -0.1742195003247300E+00 + -0.1615177791145765E+00 -0.1488146669314823E+00 -0.1361096661109569E+00 -0.1234022768604086E+00 -0.1106919973989453E+00 + -0.9797832409262908E-01 -0.8526075158534008E-01 -0.7253877292531064E-01 -0.5981187968757973E-01 -0.4707956209239161E-01 + -0.3434130911979061E-01 -0.2159660862033985E-01 -0.8844947422254279E-02 0.3914188564942300E-02 0.1668131425026886E-01 + 0.2945694526441001E-01 0.4224159786604931E-01 0.5503578885129357E-01 0.6784003546613926E-01 0.8065485532187089E-01 + 0.9348076631322821E-01 0.1063182865393753E+00 0.1191679342274936E+00 0.1320302276589731E+00 0.1449056850980641E+00 + 0.1577948247229719E+00 0.1706981645593397E+00 0.1836162224158824E+00 0.1965495158223847E+00 0.2094985619696659E+00 + 0.2224638776517585E+00 0.2354459792100279E+00 0.2484453824792379E+00 0.2614626027354943E+00 0.2744981546460752E+00 + 0.2875525522209847E+00 0.3006263087661927E+00 0.3137199368386514E+00 0.3268339482028364E+00 0.3399688537888836E+00 + 0.3531251636522359E+00 0.3663033869348276E+00 0.3795040318275802E+00 0.3927276055344020E+00 0.4059746142374676E+00 + 0.4192455630638039E+00 0.4325409560532072E+00 0.4458612961272428E+00 0.4592070850596310E+00 0.4725788234476167E+00 + 0.4859770106845307E+00 0.4994021449334540E+00 0.5128547231018850E+00 0.5263352408174535E+00 0.5398441924046491E+00 + 0.5533820708624786E+00 0.5669493678430300E+00 0.5805465736309947E+00 0.5941741771240481E+00 0.6078326658140436E+00 + 0.6215225257691057E+00 0.6352442416164141E+00 0.6489982965258876E+00 0.6627851721945213E+00 0.6766053488314805E+00 + 0.6904593051439232E+00 0.7043475183234973E+00 0.7182704640335023E+00 0.7322286163966445E+00 0.7462224479835151E+00 + 0.7602524298016173E+00 0.7743190312849433E+00 0.7884227202841974E+00 0.8025639630575290E+00 0.8167432242618240E+00 + 0.8309609669444393E+00 0.8452176525355792E+00 0.8595137408410123E+00 0.8738496900353998E+00 0.8882259566559134E+00 + 0.9026429955964752E+00 0.9171012601023203E+00 0.9316012017649666E+00 0.9461432705176964E+00 0.9607279146312910E+00 + 0.9753555807102323E+00 0.9900267136892760E+00 0.1004741756830290E+01 0.1019501151719556E+01 0.1034305338265334E+01 + 0.1049154754695761E+01 0.1064049837557060E+01 0.1078991021712077E+01 0.1093978740339108E+01 0.1109013424930930E+01 + 0.1124095505294220E+01 0.1139225409549223E+01 0.1154403564129567E+01 0.1169630393782453E+01 0.1184906321569069E+01 + 0.1200231768865166E+01 0.1215607155361878E+01 0.1231032899066835E+01 0.1246509416305429E+01 0.1262037121722220E+01 + 0.1277616428282728E+01 0.1293247747275209E+01 0.1308931488312698E+01 0.1324668059335260E+01 0.1340457866612423E+01 + 0.1356301314745660E+01 0.1372198806671151E+01 0.1388150743662683E+01 0.1404157525334607E+01 0.1420219549645083E+01 + 0.1436337212899343E+01 0.1452510909753110E+01 0.1468741033216232E+01 0.1485027974656301E+01 0.1501372123802541E+01 + 0.1517773868749642E+01 0.1534233595961925E+01 0.1550751690277352E+01 0.1567328534911856E+01 0.1583964511463701E+01 + 0.1600659999917852E+01 0.1617415378650525E+01 0.1634231024433875E+01 0.1651107312440629E+01 0.1668044616248917E+01 + 0.1685043307847061E+01 0.1702103757638609E+01 0.1719226334447252E+01 0.1736411405521971E+01 0.1753659336542133E+01 + 0.1770970491622715E+01 0.1788345233319539E+01 0.1805783922634601E+01 0.1823286919021478E+01 0.1840854580390711E+01 + 0.1858487263115261E+01 0.1876185322036066E+01 0.1893949110467636E+01 0.1911778980203568E+01 0.1929675281522265E+01 + 0.1947638363192579E+01 0.1965668572479554E+01 0.1983766255150165E+01 0.2001931755479132E+01 0.2020165416254637E+01 + 0.2038467578784327E+01 0.2056838582901055E+01 0.2075278766968794E+01 0.2093788467888599E+01 0.2112368021104497E+01 + 0.2131017760609439E+01 0.2149738018951330E+01 0.2168529127238993E+01 0.2187391415148134E+01 0.2206325210927415E+01 + 0.2225330841404466E+01 0.2244408631991916E+01 0.2263558906693465E+01 0.2282781988109954E+01 0.2302078197445396E+01 + 0.2321447854513099E+01 0.2340891277741691E+01 0.2360408784181265E+01 0.2380000689509425E+01 0.2399667308037372E+01 + 0.2419408952716023E+01 0.2439225935142099E+01 0.2459118565564146E+01 0.2479087152888749E+01 0.2499132004686517E+01 + 0.2519253427198186E+01 0.2539451725340665E+01 0.2559727202713198E+01 0.2580080161603353E+01 0.2600510902993117E+01 + 0.2621019726564874E+01 0.2641606930707586E+01 0.2662272812522710E+01 0.2683017667830213E+01 0.2703841791174714E+01 + 0.2724745475831364E+01 0.2745729013811853E+01 0.2766792695870475E+01 0.2787936811510058E+01 0.2809161648987794E+01 + 0.2830467495321410E+01 0.2851854636294917E+01 0.2873323356464579E+01 0.2894873939164848E+01 0.2916506666514209E+01 + 0.2938221819421049E+01 0.2960019677589501E+01 0.2981900519525381E+01 0.3003864622541801E+01 0.3025912262765175E+01 + 0.3048043715140940E+01 0.3070259253439192E+01 0.3092559150260705E+01 0.3114943677042409E+01 0.3137413104063187E+01 + 0.3159967700449641E+01 0.3182607734181641E+01 0.3205333472098077E+01 0.3228145179902447E+01 0.3251043122168472E+01 + 0.3274027562345680E+01 0.3297098762765072E+01 0.3320256984644469E+01 0.3343502488094288E+01 0.3366835532122889E+01 + 0.3390256374642066E+01 0.3413765272472630E+01 0.3437362481349784E+01 0.3461048255928476E+01 0.3484822849788961E+01 + 0.3508686515442005E+01 0.3532639504334363E+01 0.3556682066854127E+01 0.3580814452335925E+01 0.3605036909066328E+01 + 0.3629349684289036E+01 0.3653753024210198E+01 0.3678247174003544E+01 0.3702832377815693E+01 0.3727508878771226E+01 + 0.3752276918977883E+01 0.3777136739531759E+01 0.3802088580522303E+01 0.3827132681037432E+01 0.3852269279168641E+01 + 0.3877498612015998E+01 0.3902820915693174E+01 0.3928236425332438E+01 0.3953745375089617E+01 0.3979347998149013E+01 + 0.4005044526728421E+01 0.4030835192083855E+01 0.4056720224514617E+01 0.4082699853368021E+01 0.4108774307044248E+01 + 0.4134943813001183E+01 0.4161208597759163E+01 0.4187568886905720E+01 0.4214024905100390E+01 0.4240576876079345E+01 + 0.4267225022660046E+01 0.4293969566746052E+01 0.4320810729331575E+01 0.4347748730506037E+01 0.4374783789458776E+01 + 0.4401916124483547E+01 0.4429145952983095E+01 0.4456473491473638E+01 0.4483898955589500E+01 0.4511422560087357E+01 + 0.4539044518850936E+01 0.4566765044895316E+01 0.4594584350371322E+01 0.4622502646570012E+01 0.4650520143926894E+01 + 0.4678637052026418E+01 0.4706853579606230E+01 0.4735169934561444E+01 0.4763586323948928E+01 0.4792102953991607E+01 + 0.4820720030082579E+01 0.4849437756789456E+01 0.4878256337858449E+01 0.4907175976218555E+01 0.4936196873985707E+01 + 0.4965319232466936E+01 0.4994543252164328E+01 0.5023869132779231E+01 0.5053297073216303E+01 0.5082827271587405E+01 + 0.5112459925215758E+01 0.5142195230639895E+01 0.5172033383617539E+01 0.5201974579129658E+01 0.5232019011384368E+01 + 0.5262166873820703E+01 0.5292418359112656E+01 0.5322773659173003E+01 0.5353232965157039E+01 0.5383796467466556E+01 + 0.5414464355753495E+01 0.5445236818923759E+01 0.5476114045141041E+01 0.5507096221830388E+01 0.5538183535682169E+01 + 0.5569376172655497E+01 0.5600674317982096E+01 0.5632078156169850E+01 0.5663587871006478E+01 0.5695203645563089E+01 + 0.5726925662197861E+01 0.5758754102559550E+01 0.5790689147591050E+01 0.5822730977532937E+01 0.5854879771926981E+01 + 0.5887135709619618E+01 0.5919498968765412E+01 0.5951969726830611E+01 0.5984548160596443E+01 0.6017234446162569E+01 + 0.6050028758950551E+01 0.6082931273707150E+01 0.6115942164507743E+01 0.6149061604759621E+01 0.6182289767205272E+01 + 0.6215626823925810E+01 0.6249072946344119E+01 0.6282628305228231E+01 0.6316293070694456E+01 0.6350067412210745E+01 + 0.6383951498599807E+01 0.6417945498042277E+01 0.6452049578080040E+01 0.6486263905619155E+01 0.6520588646933274E+01 + 0.6555023967666467E+01 0.6589570032836555E+01 0.6624227006838173E+01 0.6658995053445667E+01 0.6693874335816274E+01 + 0.6728865016493213E+01 0.6763967257408575E+01 0.6799181219886369E+01 0.6834507064645582E+01 0.6869944951802993E+01 + 0.6905495040876272E+01 0.6941157490786817E+01 0.6976932459862688E+01 0.7012820105841560E+01 0.7048820585873601E+01 + 0.7084934056524147E+01 0.7121160673776924E+01 0.7157500593036525E+01 0.7193953969131448E+01 0.7230520956316742E+01 + 0.7267201708277015E+01 0.7303996378128941E+01 0.7340905118424199E+01 0.7377928081152227E+01 0.7415065417742714E+01 + 0.7452317279068625E+01 0.7489683815448713E+01 0.7527165176650154E+01 0.7564761511891398E+01 0.7602472969844660E+01 + 0.7640299698638533E+01 0.7678241845860797E+01 0.7716299558560847E+01 0.7754472983252295E+01 0.7792762265915677E+01 + 0.7831167552000825E+01 0.7869688986429596E+01 0.7908326713598298E+01 0.7947080877380213E+01 0.7985951621128103E+01 + 0.8024939087676790E+01 0.8064043419345456E+01 0.8103264757940238E+01 0.8142603244756712E+01 0.8182059020582113E+01 + 0.8221632225698052E+01 0.8261322999882655E+01 0.8301131482413128E+01 0.8341057812068073E+01 0.8381102127129775E+01 + 0.8421264565386728E+01 0.8461545264135914E+01 0.8501944360185011E+01 0.8542461989854800E+01 0.8583098288981544E+01 + 0.8623853392919127E+01 0.8664727436541362E+01 0.8705720554244369E+01 0.8746832879948686E+01 0.8788064547101555E+01 + 0.8829415688679173E+01 0.8870886437188865E+01 0.8912476924671346E+01 0.8954187282702780E+01 0.8996017642397092E+01 + 0.9037968134408045E+01 0.9080038888931480E+01 0.9122230035707283E+01 0.9164541704021747E+01 0.9206974022709504E+01 + 0.9249527120155676E+01 0.9292201124297971E+01 0.9334996162628819E+01 0.9377912362197343E+01 0.9420949849611493E+01 + 0.9464108751040072E+01 0.9507389192214658E+01 0.9550791298431900E+01 0.9594315194555200E+01 0.9637961005016923E+01 + 0.9681728853820376E+01 0.9725618864541687E+01 0.9769631160331837E+01 0.9813765863918640E+01 0.9858023097608644E+01 + 0.9902402983288997E+01 0.9946905642429570E+01 0.9991531196084678E+01 0.1003627976489508E+02 0.1008115146908984E+02 + 0.1012614642848822E+02 0.1017126476250151E+02 0.1021650659013498E+02 0.1026187202998970E+02 0.1030736120026423E+02 + 0.1035297421875671E+02 0.1039871120286647E+02 0.1044457226959594E+02 0.1049055753555247E+02 0.1053666711695001E+02 + 0.1058290112961095E+02 0.1062925968896805E+02 0.1067574291006588E+02 0.1072235090756281E+02 0.1076908379573268E+02 + 0.1081594168846656E+02 0.1086292469927445E+02 0.1091003294128697E+02 0.1095726652725712E+02 0.1100462556956189E+02 + 0.1105211018020406E+02 0.1109972047081387E+02 0.1114745655265044E+02 0.1119531853660384E+02 0.1124330653319640E+02 + 0.1129142065258453E+02 0.1133966100456022E+02 0.1138802769855287E+02 0.1143652084363064E+02 0.1148514054850226E+02 + 0.1153388692151854E+02 0.1158276007067394E+02 0.1163176010360828E+02 0.1168088712760808E+02 0.1173014124960834E+02 + 0.1177952257619401E+02 0.1182903121360145E+02 0.1187866726772023E+02 0.1192843084409426E+02 0.1197832204792367E+02 + 0.1202834098406616E+02 0.1207848775703852E+02 0.1212876247101815E+02 0.1217916522984446E+02 0.1222969613702057E+02 + 0.1228035529571446E+02 0.1233114280876082E+02 0.1238205877866202E+02 0.1243310330759011E+02 0.1248427649738783E+02 + 0.1253557844957024E+02 0.1258700926532612E+02 0.1263856904551937E+02 0.1269025789069041E+02 0.1274207590105764E+02 + 0.1279402317651873E+02 0.1284609981665210E+02 0.1289830592071831E+02 0.1295064158766139E+02 0.1300310691611016E+02 + 0.1305570200437972E+02 0.1310842695047267E+02 0.1316128185208051E+02 0.1321426680658502E+02 0.1326738191105951E+02 + 0.1332062726227020E+02 0.1337400295667756E+02 0.1342750909043750E+02 0.1348114575940276E+02 0.1353491305912430E+02 + 0.1358881108485235E+02 0.1364283993153797E+02 0.1369699969383405E+02 0.1375129046609678E+02 0.1380571234238685E+02 + 0.1386026541647074E+02 0.1391494978182183E+02 0.1396976553162181E+02 0.1402471275876187E+02 0.1407979155584384E+02 + 0.1413500201518157E+02 0.1419034422880200E+02 0.1424581828844641E+02 0.1430142428557176E+02 0.1435716231135165E+02 + 0.1441303245667767E+02 0.1446903481216061E+02 0.1452516946813144E+02 0.1458143651464284E+02 0.1463783604146995E+02 + 0.1469436813811187E+02 0.1475103289379257E+02 0.1480783039746221E+02 0.1486476073779820E+02 0.1492182400320636E+02 + 0.1497902028182210E+02 0.1503634966151138E+02 0.1509381222987208E+02 0.1515140807423487E+02 0.1520913728166454E+02 + 0.1526699993896084E+02 0.1532499613265989E+02 0.1538312594903494E+02 0.1544138947409778E+02 0.1549978679359965E+02 + 0.1555831799303221E+02 0.1561698315762881E+02 0.1567578237236552E+02 0.1573471572196207E+02 0.1579378329088299E+02 + 0.1585298516333866E+02 0.1591232142328633E+02 0.1597179215443117E+02 0.1603139744022732E+02 0.1609113736387884E+02 + 0.1615101200834081E+02 0.1621102145632030E+02 0.1627116579027744E+02 0.1633144509242638E+02 0.1639185944473622E+02 + 0.1645240892893225E+02 0.1651309362649662E+02 0.1657391361866950E+02 0.1663486898645014E+02 0.1669595981059768E+02 + 0.1675718617163216E+02 0.1681854814983560E+02 0.1688004582525278E+02 0.1694167927769237E+02 0.1700344858672776E+02 + 0.1706535383169809E+02 0.1712739509170910E+02 0.1718957244563422E+02 0.1725188597211529E+02 0.1731433574956364E+02 + 0.1737692185616106E+02 0.1743964436986050E+02 0.1750250336838723E+02 0.1756549892923954E+02 0.1762863112968988E+02 + 0.1769190004678551E+02 0.1775530575734953E+02 0.1781884833798184E+02 0.1788252786505983E+02 0.1794634441473943E+02 + 0.1801029806295595E+02 0.1807438888542495E+02 0.1813861695764293E+02 0.1820298235488868E+02 0.1826748515222356E+02 + 0.1833212542449270E+02 0.1839690324632588E+02 0.1846181869213811E+02 0.1852687183613067E+02 0.1859206275229210E+02 + 0.1865739151439864E+02 0.1872285819601541E+02 0.1878846287049704E+02 0.1885420561098861E+02 0.1892008649042634E+02 + 0.1898610558153868E+02 0.1905226295684672E+02 0.1911855868866527E+02 0.1918499284910370E+02 0.1925156551006659E+02 + 0.1931827674325448E+02 0.1938512662016491E+02 0.1945211521209302E+02 0.1951924259013235E+02 0.1958650882517566E+02 + 0.1965391398791571E+02 0.1972145814884597E+02 0.1978914137826159E+02 0.1985696374625988E+02 0.1992492532274116E+02 + 0.1999302617740977E+02 0.2006126637977442E+02 0.2012964599914926E+02 0.2019816510465454E+02 0.2026682376521724E+02 + 0.2033562204957191E+02 0.2040456002626147E+02 0.2047363776363781E+02 0.2054285532986256E+02 0.2061221279290795E+02 + 0.2068171022055733E+02 0.2075134768040595E+02 0.2082112523986171E+02 0.2089104296614605E+02 0.2096110092629424E+02 + 0.2103129918715649E+02 0.2110163781539841E+02 0.2117211687750176E+02 0.2124273643976533E+02 0.2131349656830528E+02 + 0.2138439732905617E+02 0.2145543878777140E+02 0.2152662101002412E+02 0.2159794406120766E+02 0.2166940800653642E+02 + 0.2174101291104644E+02 0.2181275883959610E+02 0.2188464585686669E+02 0.2195667402736326E+02 0.2202884341541514E+02 + 0.2210115408517663E+02 0.2217360610062771E+02 0.2224619952557461E+02 0.2231893442365038E+02 0.2239181085831591E+02 + 0.2246482889286010E+02 0.2253798859040076E+02 0.2261129001388523E+02 0.2268473322609096E+02 0.2275831828962614E+02 + 0.2283204526693043E+02 0.2290591422027539E+02 0.2297992521176526E+02 0.2305407830333766E+02 0.2312837355676387E+02 + 0.2320281103364977E+02 0.2327739079543636E+02 0.2335211290340030E+02 0.2342697741865454E+02 0.2350198440214897E+02 + 0.2357713391467102E+02 0.2365242601684612E+02 0.2372786076913854E+02 0.2380343823185174E+02 0.2387915846512908E+02 + 0.2395502152895441E+02 0.2403102748315263E+02 0.2410717638739019E+02 0.2418346830117586E+02 0.2425990328386112E+02 + 0.2433648139464079E+02 0.2441320269255370E+02 0.2449006723648306E+02 0.2456707508515719E+02 0.2464422629715007E+02 + 0.2472152093088173E+02 0.2479895904461906E+02 0.2487654069647616E+02 0.2495426594441500E+02 0.2503213484624594E+02 + 0.2511014745962827E+02 0.2518830384207072E+02 0.2526660405093208E+02 0.2534504814342175E+02 0.2542363617660013E+02 + 0.2550236820737923E+02 0.2558124429252339E+02 0.2566026448864954E+02 0.2573942885222773E+02 0.2581873743958190E+02 + 0.2589819030689023E+02 0.2597778751018570E+02 0.2605752910535647E+02 0.2613741514814674E+02 0.2621744569415681E+02 + 0.2629762079884404E+02 0.2637794051752302E+02 0.2645840490536618E+02 0.2653901401740439E+02 0.2661976790852737E+02 + 0.2670066663348421E+02 0.2678171024688378E+02 0.2686289880319548E+02 0.2694423235674941E+02 0.2702571096173704E+02 + 0.2710733467221175E+02 0.2718910354208919E+02 0.2727101762514775E+02 0.2735307697502924E+02 0.2743528164523912E+02 + 0.2751763168914713E+02 0.2760012715998774E+02 0.2768276811086066E+02 0.2776555459473111E+02 0.2784848666443062E+02 + 0.2793156437265721E+02 0.2801478777197602E+02 0.2809815691481973E+02 0.2818167185348894E+02 0.2826533264015273E+02 + 0.2834913932684915E+02 0.2843309196548557E+02 0.2851719060783909E+02 0.2860143530555727E+02 0.2868582611015826E+02 + 0.2877036307303130E+02 0.2885504624543746E+02 0.2893987567850965E+02 0.2902485142325337E+02 0.2910997353054712E+02 + 0.2919524205114265E+02 0.2928065703566552E+02 0.2936621853461569E+02 0.2945192659836760E+02 0.2953778127717089E+02 + 0.2962378262115081E+02 0.2970993068030837E+02 0.2979622550452115E+02 0.2988266714354346E+02 0.2996925564700682E+02 + 0.3005599106442041E+02 0.3014287344517153E+02 0.3022990283852592E+02 0.3031707929362812E+02 0.3040440285950215E+02 + 0.3049187358505165E+02 0.3057949151906041E+02 0.3066725671019266E+02 0.3075516920699371E+02 0.3084322905789012E+02 + 0.3093143631119021E+02 0.3101979101508448E+02 0.3110829321764588E+02 0.3119694296683040E+02 0.3128574031047729E+02 + 0.3137468529630954E+02 0.3146377797193422E+02 0.3155301838484299E+02 0.3164240658241237E+02 0.3173194261190401E+02 + 0.3182162652046552E+02 0.3191145835513032E+02 0.3200143816281827E+02 0.3209156599033621E+02 0.3218184188437798E+02 + 0.3227226589152506E+02 0.3236283805824685E+02 0.3245355843090114E+02 0.3254442705573426E+02 0.3263544397888169E+02 + 0.3272660924636835E+02 0.3281792290410885E+02 0.3290938499790812E+02 0.3300099557346138E+02 0.3309275467635493E+02 + 0.3318466235206626E+02 0.3327671864596444E+02 0.3336892360331044E+02 0.3346127726925774E+02 0.3355377968885226E+02 + 0.3364643090703304E+02 0.3373923096863262E+02 0.3383217991837713E+02 0.3392527780088678E+02 0.3401852466067623E+02 + 0.3411192054215498E+02 0.3420546548962749E+02 0.3429915954729392E+02 0.3439300275925001E+02 0.3448699516948774E+02 + 0.3458113682189561E+02 0.3467542776025882E+02 0.3476986802825981E+02 0.3486445766947862E+02 0.3495919672739288E+02 + 0.3505408524537850E+02 0.3514912326671002E+02 0.3524431083456054E+02 0.3533964799200239E+02 0.3543513478200754E+02 + 0.3553077124744756E+02 0.3562655743109424E+02 0.3572249337561980E+02 0.3581857912359721E+02 0.3591481471750058E+02 + 0.3601120019970533E+02 0.3610773561248870E+02 0.3620442099802995E+02 0.3630125639841068E+02 0.3639824185561516E+02 + 0.3649537741153064E+02 0.3659266310794771E+02 0.3669009898656054E+02 0.3678768508896718E+02 0.3688542145666988E+02 + 0.3698330813107555E+02 0.3708134515349577E+02 0.3717938217591600E+02 0.3727741919833622E+02 0.3737545622075644E+02 + 0.0000000000000000E+00 0.8576998932607242E-09 0.5148474978702150E-07 0.5500333859843751E-06 0.2898571356744415E-05 + 0.1037065667137954E-04 0.2904394432880980E-04 0.6869069328866988E-04 0.1435525383839498E-03 0.2729524897641136E-03 + 0.4817179545381958E-03 0.8004046139757985E-03 0.1265323067409609E-02 0.1918378981427738E-02 0.2806743664553777E-02 + 0.3982376035816319E-02 0.5501419303057878E-02 0.7423496677200373E-02 0.9810930426149240E-02 0.1272790776956854E-01 + 0.1623961574245743E-01 0.2041136538278681E-01 0.2530772356585144E-01 0.3099166862766308E-01 0.3752378368081732E-01 + 0.4496149929855063E-01 0.5335839507962672E-01 0.6276356754813610E-01 0.7322106991690198E-01 0.8476942747035206E-01 + 0.9744123071429918E-01 0.1112628070018588E+00 0.1262539700776599E+00 0.1424278458837341E+00 0.1597907720342443E+00 + 0.1783422675846084E+00 0.1980750690841191E+00 0.2189752283993167E+00 0.2410222674169928E+00 0.2641893844693322E+00 + 0.2884437071578631E+00 0.3137465861762969E+00 0.3400539247340754E+00 0.3673165382520538E+00 0.3954805391293457E+00 + 0.4244877415567311E+00 0.4542760815685687E+00 0.4847800477740307E+00 0.5159311184824792E+00 0.5476582012304797E+00 + 0.5798880710234582E+00 0.6125458039182285E+00 0.6455552028889719E+00 0.6788392132348257E+00 0.7123203250985853E+00 + 0.7459209609702914E+00 0.7795638463441852E+00 0.8131723619807327E+00 0.8466708764954843E+00 0.8799850582522438E+00 + 0.9130421657784031E+00 0.9457713161447614E+00 0.9781037309602292E+00 0.1009972959823397E+01 0.1041315081248019E+01 + 0.1072068881238206E+01 0.1102176009831869E+01 0.1131581116058128E+01 0.1160231961866557E+01 0.1188079515683897E+01 + 0.1215078026337852E+01 0.1241185078158618E+01 0.1266361628127532E+01 0.1290572025989520E+01 0.1313784018282635E+01 + 0.1335968737264703E+01 0.1357100675734715E+01 0.1377157648755932E+01 0.1396120743289401E+01 0.1413974256741546E+01 + 0.1430705625418266E+01 0.1446305343861415E+01 0.1460766876022088E+01 0.1474086559199635E+01 0.1486263501646126E+01 + 0.1497299474703849E+01 0.1507198800308697E+01 0.1515968234655533E+01 0.1523616848783268E+01 0.1530155906797786E+01 + 0.1535598742410441E+01 0.1539960634428920E+01 0.1543258681796175E+01 0.1545511678732089E+01 0.1546739990491811E+01 + 0.1546965430214609E+01 0.1546211137297620E+01 0.1544501457690412E+01 0.1541861826468803E+01 0.1538318653010165E+01 + 0.1533899209057386E+01 0.1528631519925127E+01 0.1522544259069783E+01 0.1515666646213862E+01 0.1508028349186392E+01 + 0.1499659389613263E+01 0.1490590052565443E+01 0.1480850800248451E+01 0.1470472189793603E+01 0.1459484795190111E+01 + 0.1447919133377286E+01 0.1435805594497667E+01 0.1423174376295045E+01 0.1410055422625766E+01 0.1396478366037582E+01 + 0.1382472474357517E+01 0.1368066601218609E+01 0.1353289140445096E+01 0.1338167984206406E+01 0.1322730484842268E+01 + 0.1307003420254224E+01 0.1291012962752784E+01 0.1274784651244435E+01 0.1258343366638420E+01 0.1241713310349911E+01 + 0.1224917985773531E+01 0.1207980182599308E+01 0.1190921963841912E+01 0.1173764655453436E+01 0.1156528838389896E+01 + 0.1139234343002130E+01 0.1121900245622720E+01 0.1104544867221897E+01 0.1087185774007220E+01 0.1069839779843846E+01 + 0.1052522950374696E+01 0.1035250608722480E+01 0.1018037342658465E+01 0.1000897013126039E+01 0.9838427640104167E+00 + 0.9668870330493002E+00 0.9500415637828995E+00 0.9333174184453955E+00 0.9167249917036894E+00 0.9002740251531050E+00 + 0.8839736224835302E+00 0.8678322652333790E+00 0.8518578290525983E+00 0.8360576003997890E+00 0.8204382936023470E+00 + 0.8050060682122852E+00 0.7897665465941298E+00 0.7747248316849636E+00 0.7598855248702404E+00 0.7452527439225495E+00 + 0.7308301409539072E+00 0.7166209203354966E+00 0.7026278565420246E+00 0.6888533118809829E+00 0.6752992540701540E+00 + 0.6619672736296282E+00 0.6488586010574048E+00 0.6359741237603777E+00 0.6233144027150980E+00 0.6108796888351882E+00 + 0.5986699390246809E+00 0.5866848318987949E+00 0.5749237831558405E+00 0.5633859605859940E+00 0.5520702987046087E+00 + 0.5409755129995881E+00 0.5301001137840697E+00 0.5194424196473048E+00 0.5090005704981659E+00 0.4987725401971368E+00 + 0.4887561487740056E+00 0.4789490742297346E+00 0.4693488639221445E+00 0.4599529455361500E+00 0.4507586376402879E+00 + 0.4417631598321903E+00 0.4329636424765457E+00 0.4243571360398264E+00 0.4159406200268177E+00 0.4077110115246057E+00 + 0.3996651733602655E+00 0.3917999218790373E+00 0.3841120343502322E+00 0.3765982560085148E+00 0.3692553067386082E+00 + 0.3620798874117488E+00 0.3550686858825059E+00 0.3482183826548197E+00 0.3415256562262722E+00 0.3349871881197929E+00 + 0.3285996676120873E+00 0.3223597961681734E+00 0.3162642915914723E+00 0.3103098918988991E+00 0.3044933589304323E+00 + 0.2988114817025848E+00 0.2932610795151651E+00 0.2878390048206519E+00 0.2825421458654130E+00 0.2773674291118858E+00 + 0.2723118214507413E+00 0.2673723322118953E+00 0.2625460149830915E+00 0.2578299692446370E+00 0.2532213418286768E+00 + 0.2487173282112436E+00 0.2443151736451206E+00 0.2400121741413617E+00 0.2358056773071348E+00 0.2316930830473297E+00 + 0.2276718441371882E+00 0.2237394666729961E+00 0.2198935104076650E+00 0.2161315889778330E+00 0.2124513700288889E+00 + 0.2088505752441177E+00 0.2053269802839583E+00 0.2018784146411472E+00 0.1985027614173130E+00 0.1951979570263882E+00 + 0.1919619908299856E+00 0.1887929047096988E+00 0.1856887925810768E+00 0.1826477998538276E+00 0.1796681228426198E+00 + 0.1767480081326520E+00 0.1738857519039822E+00 0.1710796992184251E+00 0.1683282432726463E+00 0.1656298246209137E+00 + 0.1629829303707959E+00 0.1603860933549304E+00 0.1578378912818327E+00 0.1553369458685551E+00 0.1528819219578573E+00 + 0.1504715266224071E+00 0.1481045082583851E+00 0.1457796556707337E+00 0.1434957971521608E+00 0.1412517995578756E+00 + 0.1390465673779208E+00 0.1368790418088395E+00 0.1347481998263070E+00 0.1326530532602482E+00 0.1305926478738530E+00 + 0.1285660624478085E+00 0.1265724078709661E+00 0.1246108262385681E+00 0.1226804899590787E+00 0.1207806008705706E+00 + 0.1189103893675429E+00 0.1170691135389732E+00 0.1152560583183238E+00 0.1134705346461653E+00 0.1117118786460041E+00 + 0.1099794508138442E+00 0.1082726352219536E+00 0.1065908387372449E+00 0.1049334902546352E+00 0.1033000399456902E+00 + 0.1016899585228177E+00 0.1001027365192277E+00 0.9853788358483354E-01 0.9699492779823146E-01 0.9547341499485665E-01 + 0.9397290811138079E-01 0.9249298654638069E-01 0.9103324553728220E-01 0.8959329555354877E-01 0.8817276170606399E-01 + 0.8677128317262857E-01 0.8538851263947052E-01 0.8402411575864875E-01 0.8267777062120664E-01 0.8134916724591848E-01 + 0.8003800708345375E-01 0.7874400253576731E-01 0.7746687649051477E-01 0.7620636187027600E-01 0.7496220119635953E-01 + 0.7373414616695294E-01 0.7252195724937327E-01 0.7132540328616367E-01 0.7014426111477837E-01 0.6897831520058859E-01 + 0.6782735728294027E-01 0.6669118603398869E-01 0.6556960673003079E-01 0.6446243093505667E-01 0.6336947619623536E-01 + 0.6229056575105237E-01 0.6122552824581402E-01 0.6017419746523230E-01 0.5913641207280737E-01 0.5811201536172281E-01 + 0.5710085501597033E-01 0.5610278288142408E-01 0.5511765474658521E-01 0.5414533013271837E-01 0.5318567209310896E-01 + 0.5223854702116695E-01 0.5130382446711163E-01 0.5038137696297216E-01 0.4947107985564236E-01 0.4857281114773465E-01 + 0.4768645134597841E-01 0.4681188331691594E-01 0.4594899214965088E-01 0.4509766502540915E-01 0.4425779109367826E-01 + 0.4342926135469399E-01 0.4261196854804814E-01 0.4180580704719781E-01 0.4101067275965932E-01 0.4022646303267519E-01 + 0.3945307656414969E-01 0.3869041331864940E-01 0.3793837444827467E-01 0.3719686221820911E-01 0.3646577993676117E-01 + 0.3574503188971662E-01 0.3503452327882445E-01 0.3433416016424531E-01 0.3364384941079507E-01 0.3296349863782079E-01 + 0.3229301617255276E-01 0.3163231100677876E-01 0.3098129275669249E-01 0.3033987162577284E-01 0.2970795837055464E-01 + 0.2908546426915543E-01 0.2847230109242889E-01 0.2786838107761748E-01 0.2727361690438311E-01 0.2668792167309761E-01 + 0.2611120888527847E-01 0.2554339242606102E-01 0.2498438654859956E-01 0.2443410586029598E-01 0.2389246531075691E-01 + 0.2335938018138393E-01 0.2283476607650571E-01 0.2231853891596374E-01 0.2181061492906659E-01 0.2131091064983147E-01 + 0.2081934291343454E-01 0.2033582885379438E-01 0.1986028590221680E-01 0.1939263178703108E-01 0.1893278453415130E-01 + 0.1848066246849892E-01 0.1803618421622546E-01 0.1759926870767613E-01 0.1716983518103927E-01 0.1674780318662707E-01 + 0.1633309259173651E-01 0.1592562358604172E-01 0.1552531668746990E-01 0.1513209274851720E-01 0.1474587296296080E-01 + 0.1436657887292672E-01 0.1399413237627429E-01 0.1362845573426023E-01 0.1326947157944628E-01 0.1291710292381743E-01 + 0.1257127316707774E-01 0.1223190610509324E-01 0.1189892593845275E-01 0.1157225728111806E-01 0.1125182516913743E-01 + 0.1093755506939646E-01 0.1062937288838200E-01 0.1032720498093588E-01 0.1003097815897619E-01 0.9740619700164219E-02 + 0.9456057356497178E-02 0.9177219362806280E-02 0.8904034445141316E-02 0.8636431829023183E-02 0.8374341247546036E-02 + 0.8117692949311960E-02 0.7866417706180585E-02 0.7620446820816740E-02 0.7379712134019578E-02 0.7144146031816014E-02 + 0.6913681452302325E-02 0.6688251892216657E-02 0.6467791413225554E-02 0.6252234647907211E-02 0.6041516805413253E-02 + 0.5835573676791136E-02 0.5634341639947666E-02 0.5437757664233824E-02 0.5245759314629934E-02 0.5058284755509180E-02 + 0.4875272753955811E-02 0.4696662682613547E-02 0.4522394522037392E-02 0.4352408862520555E-02 0.4186646905366133E-02 + 0.4025050463570553E-02 0.3867561961883894E-02 0.3714124436208813E-02 0.3564681532297067E-02 0.3419177503699341E-02 + 0.3277557208920367E-02 0.3139766107727285E-02 0.3005750256555324E-02 0.2875456302949815E-02 0.2748831478978852E-02 + 0.2625823593545541E-02 0.2506381023522792E-02 0.2390452703627873E-02 0.2277988114946939E-02 0.2168937272013016E-02 + 0.2063250708333439E-02 0.1960879460254761E-02 0.1861775049045227E-02 0.1765889461065943E-02 0.1673175125893125E-02 + 0.1583584892244586E-02 0.1497072001553956E-02 0.1413590059026983E-02 0.1333093002004349E-02 0.1255535065446408E-02 + 0.1180870744346243E-02 0.1109054752869345E-02 0.1040041980010902E-02 0.9737874415562595E-03 0.9102462281261181E-03 + 0.8493734490870866E-03 0.7911241721104120E-03 0.7354533581681445E-03 0.6823157917680999E-03 0.6316660062474194E-03 + 0.5834582039715675E-03 0.5376461713226330E-03 0.4941831884102573E-03 0.4530219335027502E-03 0.4141143822583456E-03 + 0.3774117019399670E-03 0.3428641409258591E-03 0.3104209139870729E-03 0.2800300839961760E-03 0.2516384409654113E-03 + 0.2251913795924475E-03 0.2006327768245250E-03 0.1779048713433524E-03 0.1569481473297049E-03 0.1377012253937927E-03 + 0.1201007641585952E-03 0.1040813766598551E-03 0.8957556647504338E-04 0.7651368930508610E-04 0.6482394658893534E-04 + 0.5443241860150438E-04 0.4526314532314971E-04 0.3723826410463467E-04 0.3027821368846399E-04 0.2430201435404447E-04 + 0.1922763365777299E-04 0.1497244622116435E-04 0.1145379401469120E-04 0.8589650285013768E-05 0.6299385349542388E-05 + 0.4504625622961494E-05 0.3130188220885624E-05 0.2105062280742719E-05 0.1363395085845545E-05 0.8454270900288885E-06 + 0.4983067594254876E-06 0.2767065679872027E-06 0.1431594160449781E-06 0.6804490613003522E-07 0.2918182930693568E-07 + 0.1102919874006033E-07 0.3560261260656263E-08 0.9406176465862757E-09 0.1916420214061158E-09 0.2763777688791933E-10 + 0.2482312356945943E-11 0.1136644735947497E-12 0.1904831683752850E-14 0.6466043629846817E-17 0.1381172060080856E-20 + 0.1274303700193166E-26 0.2106088550891557E-38 0.1212886175035114E-71 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.8576998932607242E-09 0.5148474978702150E-07 0.5500333859843751E-06 0.2898571356744415E-05 + 0.1037065667137954E-04 0.2904394432880980E-04 0.6869069328866988E-04 0.1435525383839498E-03 0.2729524897641136E-03 + 0.4817179545381958E-03 0.8004046139757985E-03 0.1265323067409609E-02 0.1918378981427738E-02 0.2806743664553777E-02 + 0.3982376035816319E-02 0.5501419303057878E-02 0.7423496677200373E-02 0.9810930426149240E-02 0.1272790776956854E-01 + 0.1623961574245743E-01 0.2041136538278681E-01 0.2530772356585144E-01 0.3099166862766308E-01 0.3752378368081732E-01 + 0.4496149929855063E-01 0.5335839507962672E-01 0.6276356754813610E-01 0.7322106991690198E-01 0.8476942747035206E-01 + 0.9744123071429918E-01 0.1112628070018588E+00 0.1262539700776599E+00 0.1424278458837341E+00 0.1597907720342443E+00 + 0.1783422675846084E+00 0.1980750690841191E+00 0.2189752283993167E+00 0.2410222674169928E+00 0.2641893844693322E+00 + 0.2884437071578631E+00 0.3137465861762969E+00 0.3400539247340754E+00 0.3673165382520538E+00 0.3954805391293457E+00 + 0.4244877415567311E+00 0.4542760815685687E+00 0.4847800477740307E+00 0.5159311184824792E+00 0.5476582012304797E+00 + 0.5798880710234582E+00 0.6125458039182285E+00 0.6455552028889719E+00 0.6788392132348257E+00 0.7123203250985853E+00 + 0.7459209609702914E+00 0.7795638463441852E+00 0.8131723619807327E+00 0.8466708764954843E+00 0.8799850582522438E+00 + 0.9130421657784031E+00 0.9457713161447614E+00 0.9781037309602292E+00 0.1009972959823397E+01 0.1041315081248019E+01 + 0.1072068881238206E+01 0.1102176009831869E+01 0.1131581116058128E+01 0.1160231961866557E+01 0.1188079515683897E+01 + 0.1215078026337852E+01 0.1241185078158618E+01 0.1266361628127532E+01 0.1290572025989520E+01 0.1313784018282635E+01 + 0.1335968737264703E+01 0.1357100675734715E+01 0.1377157648755932E+01 0.1396120743289401E+01 0.1413974256741546E+01 + 0.1430705625418266E+01 0.1446305343861415E+01 0.1460766876022088E+01 0.1474086559199635E+01 0.1486263501646126E+01 + 0.1497299474703849E+01 0.1507198800308697E+01 0.1515968234655533E+01 0.1523616848783268E+01 0.1530155906797786E+01 + 0.1535598742410441E+01 0.1539960634428920E+01 0.1543258681796175E+01 0.1545511678732089E+01 0.1546739990491811E+01 + 0.1546965430214609E+01 0.1546211137297620E+01 0.1544501457690412E+01 0.1541861826468803E+01 0.1538318653010165E+01 + 0.1533899209057386E+01 0.1528631519925127E+01 0.1522544259069783E+01 0.1515666646213862E+01 0.1508028349186392E+01 + 0.1499659389613263E+01 0.1490590052565443E+01 0.1480850800248451E+01 0.1470472189793603E+01 0.1459484795190111E+01 + 0.1447919133377286E+01 0.1435805594497667E+01 0.1423174376295045E+01 0.1410055422625766E+01 0.1396478366037582E+01 + 0.1382472474357517E+01 0.1368066601218609E+01 0.1353289140445096E+01 0.1338167984206406E+01 0.1322730484842268E+01 + 0.1307003420254224E+01 0.1291012962752784E+01 0.1274784651244435E+01 0.1258343366638420E+01 0.1241713310349911E+01 + 0.1224917985773531E+01 0.1207980182599308E+01 0.1190921963841912E+01 0.1173764655453436E+01 0.1156528838389896E+01 + 0.1139234343002130E+01 0.1121900245622720E+01 0.1104544867221897E+01 0.1087185774007220E+01 0.1069839779843846E+01 + 0.1052522950374696E+01 0.1035250608722480E+01 0.1018037342658465E+01 0.1000897013126039E+01 0.9838427640104167E+00 + 0.9668870330493002E+00 0.9500415637828995E+00 0.9333174184453955E+00 0.9167249917036894E+00 0.9002740251531050E+00 + 0.8839736224835302E+00 0.8678322652333790E+00 0.8518578290525983E+00 0.8360576003997890E+00 0.8204382936023470E+00 + 0.8050060682122852E+00 0.7897665465941298E+00 0.7747248316849636E+00 0.7598855248702404E+00 0.7452527439225495E+00 + 0.7308301409539072E+00 0.7166209203354966E+00 0.7026278565420246E+00 0.6888533118809829E+00 0.6752992540701540E+00 + 0.6619672736296282E+00 0.6488586010574048E+00 0.6359741237603777E+00 0.6233144027150980E+00 0.6108796888351882E+00 + 0.5986699390246809E+00 0.5866848318987949E+00 0.5749237831558405E+00 0.5633859605859940E+00 0.5520702987046087E+00 + 0.5409755129995881E+00 0.5301001137840697E+00 0.5194424196473048E+00 0.5090005704981659E+00 0.4987725401971368E+00 + 0.4887561487740056E+00 0.4789490742297346E+00 0.4693488639221445E+00 0.4599529455361500E+00 0.4507586376402879E+00 + 0.4417631598321903E+00 0.4329636424765457E+00 0.4243571360398264E+00 0.4159406200268177E+00 0.4077110115246057E+00 + 0.3996651733602655E+00 0.3917999218790373E+00 0.3841120343502322E+00 0.3765982560085148E+00 0.3692553067386082E+00 + 0.3620798874117488E+00 0.3550686858825059E+00 0.3482183826548197E+00 0.3415256562262722E+00 0.3349871881197929E+00 + 0.3285996676120873E+00 0.3223597961681734E+00 0.3162642915914723E+00 0.3103098918988991E+00 0.3044933589304323E+00 + 0.2988114817025848E+00 0.2932610795151651E+00 0.2878390048206519E+00 0.2825421458654130E+00 0.2773674291118858E+00 + 0.2723118214507413E+00 0.2673723322118953E+00 0.2625460149830915E+00 0.2578299692446370E+00 0.2532213418286768E+00 + 0.2487173282112436E+00 0.2443151736451206E+00 0.2400121741413617E+00 0.2358056773071348E+00 0.2316930830473297E+00 + 0.2276718441371882E+00 0.2237394666729961E+00 0.2198935104076650E+00 0.2161315889778330E+00 0.2124513700288889E+00 + 0.2088505752441177E+00 0.2053269802839583E+00 0.2018784146411472E+00 0.1985027614173130E+00 0.1951979570263882E+00 + 0.1919619908299856E+00 0.1887929047096988E+00 0.1856887925810768E+00 0.1826477998538276E+00 0.1796681228426198E+00 + 0.1767480081326520E+00 0.1738857519039822E+00 0.1710796992184251E+00 0.1683282432726463E+00 0.1656298246209137E+00 + 0.1629829303707959E+00 0.1603860933549304E+00 0.1578378912818327E+00 0.1553369458685551E+00 0.1528819219578573E+00 + 0.1504715266224071E+00 0.1481045082583851E+00 0.1457796556707337E+00 0.1434957971521608E+00 0.1412517995578756E+00 + 0.1390465673779208E+00 0.1368790418088395E+00 0.1347481998263070E+00 0.1326530532602482E+00 0.1305926478738530E+00 + 0.1285660624478085E+00 0.1265724078709661E+00 0.1246108262385681E+00 0.1226804899590787E+00 0.1207806008705706E+00 + 0.1189103893675429E+00 0.1170691135389732E+00 0.1152560583183238E+00 0.1134705346461653E+00 0.1117118786460041E+00 + 0.1099794508138442E+00 0.1082726352219536E+00 0.1065908387372449E+00 0.1049334902546352E+00 0.1033000399456902E+00 + 0.1016899585228177E+00 0.1001027365192277E+00 0.9853788358483354E-01 0.9699492779823146E-01 0.9547341499485665E-01 + 0.9397290811138079E-01 0.9249298654638069E-01 0.9103324553728220E-01 0.8959329555354877E-01 0.8817276170606399E-01 + 0.8677128317262857E-01 0.8538851263947052E-01 0.8402411575864875E-01 0.8267777062120664E-01 0.8134916724591848E-01 + 0.8003800708345375E-01 0.7874400253576731E-01 0.7746687649051477E-01 0.7620636187027600E-01 0.7496220119635953E-01 + 0.7373414616695294E-01 0.7252195724937327E-01 0.7132540328616367E-01 0.7014426111477837E-01 0.6897831520058859E-01 + 0.6782735728294027E-01 0.6669118603398869E-01 0.6556960673003079E-01 0.6446243093505667E-01 0.6336947619623536E-01 + 0.6229056575105237E-01 0.6122552824581402E-01 0.6017419746523230E-01 0.5913641207280737E-01 0.5811201536172281E-01 + 0.5710085501597033E-01 0.5610278288142408E-01 0.5511765474658521E-01 0.5414533013271837E-01 0.5318567209310896E-01 + 0.5223854702116695E-01 0.5130382446711163E-01 0.5038137696297216E-01 0.4947107985564236E-01 0.4857281114773465E-01 + 0.4768645134597841E-01 0.4681188331691594E-01 0.4594899214965088E-01 0.4509766502540915E-01 0.4425779109367826E-01 + 0.4342926135469399E-01 0.4261196854804814E-01 0.4180580704719781E-01 0.4101067275965932E-01 0.4022646303267519E-01 + 0.3945307656414969E-01 0.3869041331864940E-01 0.3793837444827467E-01 0.3719686221820911E-01 0.3646577993676117E-01 + 0.3574503188971662E-01 0.3503452327882445E-01 0.3433416016424531E-01 0.3364384941079507E-01 0.3296349863782079E-01 + 0.3229301617255276E-01 0.3163231100677876E-01 0.3098129275669249E-01 0.3033987162577284E-01 0.2970795837055464E-01 + 0.2908546426915543E-01 0.2847230109242889E-01 0.2786838107761748E-01 0.2727361690438311E-01 0.2668792167309761E-01 + 0.2611120888527847E-01 0.2554339242606102E-01 0.2498438654859956E-01 0.2443410586029598E-01 0.2389246531075691E-01 + 0.2335938018138393E-01 0.2283476607650571E-01 0.2231853891596374E-01 0.2181061492906659E-01 0.2131091064983147E-01 + 0.2081934291343454E-01 0.2033582885379438E-01 0.1986028590221680E-01 0.1939263178703108E-01 0.1893278453415130E-01 + 0.1848066246849892E-01 0.1803618421622546E-01 0.1759926870767613E-01 0.1716983518103927E-01 0.1674780318662707E-01 + 0.1633309259173651E-01 0.1592562358604172E-01 0.1552531668746990E-01 0.1513209274851720E-01 0.1474587296296080E-01 + 0.1436657887292672E-01 0.1399413237627429E-01 0.1362845573426023E-01 0.1326947157944628E-01 0.1291710292381743E-01 + 0.1257127316707774E-01 0.1223190610509324E-01 0.1189892593845275E-01 0.1157225728111806E-01 0.1125182516913743E-01 + 0.1093755506939646E-01 0.1062937288838200E-01 0.1032720498093588E-01 0.1003097815897619E-01 0.9740619700164219E-02 + 0.9456057356497178E-02 0.9177219362806280E-02 0.8904034445141316E-02 0.8636431829023183E-02 0.8374341247546036E-02 + 0.8117692949311960E-02 0.7866417706180585E-02 0.7620446820816740E-02 0.7379712134019578E-02 0.7144146031816014E-02 + 0.6913681452302325E-02 0.6688251892216657E-02 0.6467791413225554E-02 0.6252234647907211E-02 0.6041516805413253E-02 + 0.5835573676791136E-02 0.5634341639947666E-02 0.5437757664233824E-02 0.5245759314629934E-02 0.5058284755509180E-02 + 0.4875272753955811E-02 0.4696662682613547E-02 0.4522394522037392E-02 0.4352408862520555E-02 0.4186646905366133E-02 + 0.4025050463570553E-02 0.3867561961883894E-02 0.3714124436208813E-02 0.3564681532297067E-02 0.3419177503699341E-02 + 0.3277557208920367E-02 0.3139766107727285E-02 0.3005750256555324E-02 0.2875456302949815E-02 0.2748831478978852E-02 + 0.2625823593545541E-02 0.2506381023522792E-02 0.2390452703627873E-02 0.2277988114946939E-02 0.2168937272013016E-02 + 0.2063250708333439E-02 0.1960879460254761E-02 0.1861775049045227E-02 0.1765889461065943E-02 0.1673175125893125E-02 + 0.1583584892244586E-02 0.1497072001553956E-02 0.1413590059026983E-02 0.1333093002004349E-02 0.1255535065446408E-02 + 0.1180870744346243E-02 0.1109054752869345E-02 0.1040041980010902E-02 0.9737874415562595E-03 0.9102462281261181E-03 + 0.8493734490870866E-03 0.7911241721104120E-03 0.7354533581681445E-03 0.6823157917680999E-03 0.6316660062474194E-03 + 0.5834582039715675E-03 0.5376461713226330E-03 0.4941831884102573E-03 0.4530219335027502E-03 0.4141143822583456E-03 + 0.3774117019399670E-03 0.3428641409258591E-03 0.3104209139870729E-03 0.2800300839961760E-03 0.2516384409654113E-03 + 0.2251913795924475E-03 0.2006327768245250E-03 0.1779048713433524E-03 0.1569481473297049E-03 0.1377012253937927E-03 + 0.1201007641585952E-03 0.1040813766598551E-03 0.8957556647504338E-04 0.7651368930508610E-04 0.6482394658893534E-04 + 0.5443241860150438E-04 0.4526314532314971E-04 0.3723826410463467E-04 0.3027821368846399E-04 0.2430201435404447E-04 + 0.1922763365777299E-04 0.1497244622116435E-04 0.1145379401469120E-04 0.8589650285013768E-05 0.6299385349542388E-05 + 0.4504625622961494E-05 0.3130188220885624E-05 0.2105062280742719E-05 0.1363395085845545E-05 0.8454270900288885E-06 + 0.4983067594254876E-06 0.2767065679872027E-06 0.1431594160449781E-06 0.6804490613003522E-07 0.2918182930693568E-07 + 0.1102919874006033E-07 0.3560261260656263E-08 0.9406176465862757E-09 0.1916420214061158E-09 0.2763777688791933E-10 + 0.2482312356945943E-11 0.1136644735947497E-12 0.1904831683752850E-14 0.6466043629846817E-17 0.1381172060080856E-20 + 0.1274303700193166E-26 0.2106088550891557E-38 0.1212886175035114E-71 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.8576998932607242E-09 0.5148474978702150E-07 0.5500333859843751E-06 0.2898571356744415E-05 + 0.1037065667137954E-04 0.2904394432880980E-04 0.6869069328866988E-04 0.1435525383839498E-03 0.2729524897641136E-03 + 0.4817179545381958E-03 0.8004046139757985E-03 0.1265323067409609E-02 0.1918378981427738E-02 0.2806743664553777E-02 + 0.3982376035816319E-02 0.5501419303057878E-02 0.7423496677200373E-02 0.9810930426149240E-02 0.1272790776956854E-01 + 0.1623961574245743E-01 0.2041136538278681E-01 0.2530772356585144E-01 0.3099166862766308E-01 0.3752378368081732E-01 + 0.4496149929855063E-01 0.5335839507962672E-01 0.6276356754813610E-01 0.7322106991690198E-01 0.8476942747035206E-01 + 0.9744123071429918E-01 0.1112628070018588E+00 0.1262539700776599E+00 0.1424278458837341E+00 0.1597907720342443E+00 + 0.1783422675846084E+00 0.1980750690841191E+00 0.2189752283993167E+00 0.2410222674169928E+00 0.2641893844693322E+00 + 0.2884437071578631E+00 0.3137465861762969E+00 0.3400539247340754E+00 0.3673165382520538E+00 0.3954805391293457E+00 + 0.4244877415567311E+00 0.4542760815685687E+00 0.4847800477740307E+00 0.5159311184824792E+00 0.5476582012304797E+00 + 0.5798880710234582E+00 0.6125458039182285E+00 0.6455552028889719E+00 0.6788392132348257E+00 0.7123203250985853E+00 + 0.7459209609702914E+00 0.7795638463441852E+00 0.8131723619807327E+00 0.8466708764954843E+00 0.8799850582522438E+00 + 0.9130421657784031E+00 0.9457713161447614E+00 0.9781037309602292E+00 0.1009972959823397E+01 0.1041315081248019E+01 + 0.1072068881238206E+01 0.1102176009831869E+01 0.1131581116058128E+01 0.1160231961866557E+01 0.1188079515683897E+01 + 0.1215078026337852E+01 0.1241185078158618E+01 0.1266361628127532E+01 0.1290572025989520E+01 0.1313784018282635E+01 + 0.1335968737264703E+01 0.1357100675734715E+01 0.1377157648755932E+01 0.1396120743289401E+01 0.1413974256741546E+01 + 0.1430705625418266E+01 0.1446305343861415E+01 0.1460766876022088E+01 0.1474086559199635E+01 0.1486263501646126E+01 + 0.1497299474703849E+01 0.1507198800308697E+01 0.1515968234655533E+01 0.1523616848783268E+01 0.1530155906797786E+01 + 0.1535598742410441E+01 0.1539960634428920E+01 0.1543258681796175E+01 0.1545511678732089E+01 0.1546739990491811E+01 + 0.1546965430214609E+01 0.1546211137297620E+01 0.1544501457690412E+01 0.1541861826468803E+01 0.1538318653010165E+01 + 0.1533899209057386E+01 0.1528631519925127E+01 0.1522544259069783E+01 0.1515666646213862E+01 0.1508028349186392E+01 + 0.1499659389613263E+01 0.1490590052565443E+01 0.1480850800248451E+01 0.1470472189793603E+01 0.1459484795190111E+01 + 0.1447919133377286E+01 0.1435805594497667E+01 0.1423174376295045E+01 0.1410055422625766E+01 0.1396478366037582E+01 + 0.1382472474357517E+01 0.1368066601218609E+01 0.1353289140445096E+01 0.1338167984206406E+01 0.1322730484842268E+01 + 0.1307003420254224E+01 0.1291012962752784E+01 0.1274784651244435E+01 0.1258343366638420E+01 0.1241713310349911E+01 + 0.1224917985773531E+01 0.1207980182599308E+01 0.1190921963841912E+01 0.1173764655453436E+01 0.1156528838389896E+01 + 0.1139234343002130E+01 0.1121900245622720E+01 0.1104544867221897E+01 0.1087185774007220E+01 0.1069839779843846E+01 + 0.1052522950374696E+01 0.1035250608722480E+01 0.1018037342658465E+01 0.1000897013126039E+01 0.9838427640104167E+00 + 0.9668870330493002E+00 0.9500415637828995E+00 0.9333174184453955E+00 0.9167249917036894E+00 0.9002740251531050E+00 + 0.8839736224835302E+00 0.8678322652333790E+00 0.8518578290525983E+00 0.8360576003997890E+00 0.8204382936023470E+00 + 0.8050060682122852E+00 0.7897665465941298E+00 0.7747248316849636E+00 0.7598855248702404E+00 0.7452527439225495E+00 + 0.7308301409539072E+00 0.7166209203354966E+00 0.7026278565420246E+00 0.6888533118809829E+00 0.6752992540701540E+00 + 0.6619672736296282E+00 0.6488586010574048E+00 0.6359741237603777E+00 0.6233144027150980E+00 0.6108796888351882E+00 + 0.5986699390246809E+00 0.5866848318987949E+00 0.5749237831558405E+00 0.5633859605859940E+00 0.5520702987046087E+00 + 0.5409755129995881E+00 0.5301001137840697E+00 0.5194424196473048E+00 0.5090005704981659E+00 0.4987725401971368E+00 + 0.4887561487740056E+00 0.4789490742297346E+00 0.4693488639221445E+00 0.4599529455361500E+00 0.4507586376402879E+00 + 0.4417631598321903E+00 0.4329636424765457E+00 0.4243571360398264E+00 0.4159406200268177E+00 0.4077110115246057E+00 + 0.3996651733602655E+00 0.3917999218790373E+00 0.3841120343502322E+00 0.3765982560085148E+00 0.3692553067386082E+00 + 0.3620798874117488E+00 0.3550686858825059E+00 0.3482183826548197E+00 0.3415256562262722E+00 0.3349871881197929E+00 + 0.3285996676120873E+00 0.3223597961681734E+00 0.3162642915914723E+00 0.3103098918988991E+00 0.3044933589304323E+00 + 0.2988114817025848E+00 0.2932610795151651E+00 0.2878390048206519E+00 0.2825421458654130E+00 0.2773674291118858E+00 + 0.2723118214507413E+00 0.2673723322118953E+00 0.2625460149830915E+00 0.2578299692446370E+00 0.2532213418286768E+00 + 0.2487173282112436E+00 0.2443151736451206E+00 0.2400121741413617E+00 0.2358056773071348E+00 0.2316930830473297E+00 + 0.2276718441371882E+00 0.2237394666729961E+00 0.2198935104076650E+00 0.2161315889778330E+00 0.2124513700288889E+00 + 0.2088505752441177E+00 0.2053269802839583E+00 0.2018784146411472E+00 0.1985027614173130E+00 0.1951979570263882E+00 + 0.1919619908299856E+00 0.1887929047096988E+00 0.1856887925810768E+00 0.1826477998538276E+00 0.1796681228426198E+00 + 0.1767480081326520E+00 0.1738857519039822E+00 0.1710796992184251E+00 0.1683282432726463E+00 0.1656298246209137E+00 + 0.1629829303707959E+00 0.1603860933549304E+00 0.1578378912818327E+00 0.1553369458685551E+00 0.1528819219578573E+00 + 0.1504715266224071E+00 0.1481045082583851E+00 0.1457796556707337E+00 0.1434957971521608E+00 0.1412517995578756E+00 + 0.1390465673779208E+00 0.1368790418088395E+00 0.1347481998263070E+00 0.1326530532602482E+00 0.1305926478738530E+00 + 0.1285660624478085E+00 0.1265724078709661E+00 0.1246108262385681E+00 0.1226804899590787E+00 0.1207806008705706E+00 + 0.1189103893675429E+00 0.1170691135389732E+00 0.1152560583183238E+00 0.1134705346461653E+00 0.1117118786460041E+00 + 0.1099794508138442E+00 0.1082726352219536E+00 0.1065908387372449E+00 0.1049334902546352E+00 0.1033000399456902E+00 + 0.1016899585228177E+00 0.1001027365192277E+00 0.9853788358483354E-01 0.9699492779823146E-01 0.9547341499485665E-01 + 0.9397290811138079E-01 0.9249298654638069E-01 0.9103324553728220E-01 0.8959329555354877E-01 0.8817276170606399E-01 + 0.8677128317262857E-01 0.8538851263947052E-01 0.8402411575864875E-01 0.8267777062120664E-01 0.8134916724591848E-01 + 0.8003800708345375E-01 0.7874400253576731E-01 0.7746687649051477E-01 0.7620636187027600E-01 0.7496220119635953E-01 + 0.7373414616695294E-01 0.7252195724937327E-01 0.7132540328616367E-01 0.7014426111477837E-01 0.6897831520058859E-01 + 0.6782735728294027E-01 0.6669118603398869E-01 0.6556960673003079E-01 0.6446243093505667E-01 0.6336947619623536E-01 + 0.6229056575105237E-01 0.6122552824581402E-01 0.6017419746523230E-01 0.5913641207280737E-01 0.5811201536172281E-01 + 0.5710085501597033E-01 0.5610278288142408E-01 0.5511765474658521E-01 0.5414533013271837E-01 0.5318567209310896E-01 + 0.5223854702116695E-01 0.5130382446711163E-01 0.5038137696297216E-01 0.4947107985564236E-01 0.4857281114773465E-01 + 0.4768645134597841E-01 0.4681188331691594E-01 0.4594899214965088E-01 0.4509766502540915E-01 0.4425779109367826E-01 + 0.4342926135469399E-01 0.4261196854804814E-01 0.4180580704719781E-01 0.4101067275965932E-01 0.4022646303267519E-01 + 0.3945307656414969E-01 0.3869041331864940E-01 0.3793837444827467E-01 0.3719686221820911E-01 0.3646577993676117E-01 + 0.3574503188971662E-01 0.3503452327882445E-01 0.3433416016424531E-01 0.3364384941079507E-01 0.3296349863782079E-01 + 0.3229301617255276E-01 0.3163231100677876E-01 0.3098129275669249E-01 0.3033987162577284E-01 0.2970795837055464E-01 + 0.2908546426915543E-01 0.2847230109242889E-01 0.2786838107761748E-01 0.2727361690438311E-01 0.2668792167309761E-01 + 0.2611120888527847E-01 0.2554339242606102E-01 0.2498438654859956E-01 0.2443410586029598E-01 0.2389246531075691E-01 + 0.2335938018138393E-01 0.2283476607650571E-01 0.2231853891596374E-01 0.2181061492906659E-01 0.2131091064983147E-01 + 0.2081934291343454E-01 0.2033582885379438E-01 0.1986028590221680E-01 0.1939263178703108E-01 0.1893278453415130E-01 + 0.1848066246849892E-01 0.1803618421622546E-01 0.1759926870767613E-01 0.1716983518103927E-01 0.1674780318662707E-01 + 0.1633309259173651E-01 0.1592562358604172E-01 0.1552531668746990E-01 0.1513209274851720E-01 0.1474587296296080E-01 + 0.1436657887292672E-01 0.1399413237627429E-01 0.1362845573426023E-01 0.1326947157944628E-01 0.1291710292381743E-01 + 0.1257127316707774E-01 0.1223190610509324E-01 0.1189892593845275E-01 0.1157225728111806E-01 0.1125182516913743E-01 + 0.1093755506939646E-01 0.1062937288838200E-01 0.1032720498093588E-01 0.1003097815897619E-01 0.9740619700164219E-02 + 0.9456057356497178E-02 0.9177219362806280E-02 0.8904034445141316E-02 0.8636431829023183E-02 0.8374341247546036E-02 + 0.8117692949311960E-02 0.7866417706180585E-02 0.7620446820816740E-02 0.7379712134019578E-02 0.7144146031816014E-02 + 0.6913681452302325E-02 0.6688251892216657E-02 0.6467791413225554E-02 0.6252234647907211E-02 0.6041516805413253E-02 + 0.5835573676791136E-02 0.5634341639947666E-02 0.5437757664233824E-02 0.5245759314629934E-02 0.5058284755509180E-02 + 0.4875272753955811E-02 0.4696662682613547E-02 0.4522394522037392E-02 0.4352408862520555E-02 0.4186646905366133E-02 + 0.4025050463570553E-02 0.3867561961883894E-02 0.3714124436208813E-02 0.3564681532297067E-02 0.3419177503699341E-02 + 0.3277557208920367E-02 0.3139766107727285E-02 0.3005750256555324E-02 0.2875456302949815E-02 0.2748831478978852E-02 + 0.2625823593545541E-02 0.2506381023522792E-02 0.2390452703627873E-02 0.2277988114946939E-02 0.2168937272013016E-02 + 0.2063250708333439E-02 0.1960879460254761E-02 0.1861775049045227E-02 0.1765889461065943E-02 0.1673175125893125E-02 + 0.1583584892244586E-02 0.1497072001553956E-02 0.1413590059026983E-02 0.1333093002004349E-02 0.1255535065446408E-02 + 0.1180870744346243E-02 0.1109054752869345E-02 0.1040041980010902E-02 0.9737874415562595E-03 0.9102462281261181E-03 + 0.8493734490870866E-03 0.7911241721104120E-03 0.7354533581681445E-03 0.6823157917680999E-03 0.6316660062474194E-03 + 0.5834582039715675E-03 0.5376461713226330E-03 0.4941831884102573E-03 0.4530219335027502E-03 0.4141143822583456E-03 + 0.3774117019399670E-03 0.3428641409258591E-03 0.3104209139870729E-03 0.2800300839961760E-03 0.2516384409654113E-03 + 0.2251913795924475E-03 0.2006327768245250E-03 0.1779048713433524E-03 0.1569481473297049E-03 0.1377012253937927E-03 + 0.1201007641585952E-03 0.1040813766598551E-03 0.8957556647504338E-04 0.7651368930508610E-04 0.6482394658893534E-04 + 0.5443241860150438E-04 0.4526314532314971E-04 0.3723826410463467E-04 0.3027821368846399E-04 0.2430201435404447E-04 + 0.1922763365777299E-04 0.1497244622116435E-04 0.1145379401469120E-04 0.8589650285013768E-05 0.6299385349542388E-05 + 0.4504625622961494E-05 0.3130188220885624E-05 0.2105062280742719E-05 0.1363395085845545E-05 0.8454270900288885E-06 + 0.4983067594254876E-06 0.2767065679872027E-06 0.1431594160449781E-06 0.6804490613003522E-07 0.2918182930693568E-07 + 0.1102919874006033E-07 0.3560261260656263E-08 0.9406176465862757E-09 0.1916420214061158E-09 0.2763777688791933E-10 + 0.2482312356945943E-11 0.1136644735947497E-12 0.1904831683752850E-14 0.6466043629846817E-17 0.1381172060080856E-20 + 0.1274303700193166E-26 0.2106088550891557E-38 0.1212886175035114E-71 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.3765610317640694E+00 0.7400358894127599E+00 0.1090712381667745E+01 0.1428873061247002E+01 + 0.1754795319320031E+01 0.2068751483890357E+01 0.2371008922950546E+01 0.2661830152878451E+01 0.2941472952229258E+01 + 0.3210190480819170E+01 0.3468231403786657E+01 0.3715840020150198E+01 0.3953256395252374E+01 0.4180716496383695E+01 + 0.4398452330811846E+01 0.4606692085398965E+01 0.4805660266967400E+01 0.4995577842570571E+01 0.5176662378836555E+01 + 0.5349128179575754E+01 0.5513186420878141E+01 0.5669045282968079E+01 0.5816910078133630E+01 0.5956983374101555E+01 + 0.6089465112286805E+01 0.6214552720405558E+01 0.6332441219002502E+01 0.6443323321505209E+01 0.6547389527480199E+01 + 0.6644828208826436E+01 0.6735825688701171E+01 0.6820566313030878E+01 0.6899232514514866E+01 0.6972004869081964E+01 + 0.7039062144810148E+01 0.7100581343365575E+01 0.7156737734061032E+01 0.7207704880673625E+01 0.7253654661198675E+01 + 0.7294757280749858E+01 0.7331181277846054E+01 0.7363093524351962E+01 0.7390659219363427E+01 0.7414041877348629E+01 + 0.7433403310874117E+01 0.7448903608259055E+01 0.7460701106512816E+01 0.7468952359920434E+01 0.7473812104646840E+01 + 0.7475433219735298E+01 0.7473966684877387E+01 0.7469561535331859E+01 0.7462364814367910E+01 0.7452521523604532E+01 + 0.7440174571612401E+01 0.7425464721137732E+01 0.7408530535299623E+01 0.7389508323102637E+01 0.7368532084596213E+01 + 0.7345733456000793E+01 0.7321241655108376E+01 0.7295183427252115E+01 0.7267682992125909E+01 0.7238861991720891E+01 + 0.7208839439630969E+01 0.7177731671964857E+01 0.7145652300086835E+01 0.7112712165393094E+01 0.7079019296315407E+01 + 0.7044678867728360E+01 0.7009793162921103E+01 0.6974461538279471E+01 0.6938780390809384E+01 0.6902843128617441E+01 + 0.6866740144450676E+01 0.6830558792382606E+01 0.6794383367719482E+01 0.6758295090186962E+01 0.6722372090444448E+01 + 0.6686689399961921E+01 0.6651318944281731E+01 0.6616329539676658E+01 0.6581786893203926E+01 0.6547753606144576E+01 + 0.6514289180807551E+01 0.6481450030667977E+01 0.6449289493800484E+01 0.6417857849559566E+01 0.6387202338451258E+01 + 0.6357367185132800E+01 0.6328393624470087E+01 0.6300319930576388E+01 0.6273181448749665E+01 0.6247010630220808E+01 + 0.6221837069619801E+01 0.6197687545062726E+01 0.6174586060758330E+01 0.6152553892029570E+01 0.6131609632642339E+01 + 0.6111769244331025E+01 0.6093046108408382E+01 0.6075451079345281E+01 0.6058992540204510E+01 0.6043676459811814E+01 + 0.6029506451546534E+01 0.6016483833633909E+01 0.6004607690820981E+01 0.5993874937318422E+01 0.5984280380890941E+01 + 0.5975816787979942E+01 0.5968474949742999E+01 0.5962243748896129E+01 0.5957110227246338E+01 0.5953059653803552E+01 + 0.5950075593363216E+01 0.5948139975452642E+01 0.5947233163536738E+01 0.5947334024380974E+01 0.5948419997472152E+01 + 0.5950467164400099E+01 0.5953450318106323E+01 0.5957343031908459E+01 0.5962117728212475E+01 0.5967745746827388E+01 + 0.5974197412800709E+01 0.5981442103695763E+01 0.5989448316235365E+01 0.5998183732239485E+01 0.6007615283788049E+01 + 0.6017709217542990E+01 0.6028431158167253E+01 0.6039746170781648E+01 0.6051618822403686E+01 0.6064013242315937E+01 + 0.6076893181314657E+01 0.6090222069792634E+01 0.6103963074613425E+01 0.6118079154737412E+01 0.6132533115562999E+01 + 0.6147287661949624E+01 0.6162305449892092E+01 0.6177549136818604E+01 0.6192981430488190E+01 0.6208565136465474E+01 + 0.6224263204154009E+01 0.6240038771371831E+01 0.6255855207455509E+01 0.6271676154881747E+01 0.6287465569397743E+01 + 0.6303187758654289E+01 0.6318807419337479E+01 0.6334289672797612E+01 0.6349600099175650E+01 0.6364704770029900E+01 + 0.6379570279467482E+01 0.6394163773787110E+01 0.6408452979641630E+01 0.6422406230730219E+01 0.6435992493032277E+01 + 0.6449181388596262E+01 0.6461943217898319E+01 0.6474248980787193E+01 0.6486070396033000E+01 0.6497379919498787E+01 + 0.6508150760955191E+01 0.6518356899559369E+01 0.6527973098020561E+01 0.6536974915475707E+01 0.6545338719099223E+01 + 0.6553041694472095E+01 0.6560061854736102E+01 0.6566378048559677E+01 0.6571969966942736E+01 0.6576818148888014E+01 + 0.6580903985967331E+01 0.6584209725811516E+01 0.6586718474552983E+01 0.6588414198250604E+01 0.6589281723326368E+01 + 0.6589306736044133E+01 0.6588475781060250E+01 0.6586776259076728E+01 0.6584196423626929E+01 0.6580725377024553E+01 + 0.6576353065506066E+01 0.6571070273597098E+01 0.6564868617732960E+01 0.6557740539163546E+01 0.6549679296172584E+01 + 0.6540678955640928E+01 0.6530734383983693E+01 0.6519841237490329E+01 0.6507995952096807E+01 0.6495195732618538E+01 + 0.6481438541472563E+01 0.6466723086916791E+01 0.6451048810834144E+01 0.6434415876088694E+01 0.6416825153480584E+01 + 0.6398278208326170E+01 0.6378777286689151E+01 0.6358325301288192E+01 0.6336925817105747E+01 0.6314583036722893E+01 + 0.6291301785403415E+01 0.6267087495951198E+01 0.6241946193363197E+01 0.6215884479300494E+01 0.6188909516399138E+01 + 0.6161029012441793E+01 0.6132251204410994E+01 0.6102584842443767E+01 0.6072039173707282E+01 0.6040623926214209E+01 + 0.6008349292596213E+01 0.5975225913853303E+01 0.5941264863095957E+01 0.5906477629296895E+01 0.5870876101068294E+01 + 0.5834472550479789E+01 0.5797279616932335E+01 0.5759310291102085E+01 0.5720577898967909E+01 0.5681096085935931E+01 + 0.5640878801073526E+01 0.5599940281464876E+01 0.5558295036699770E+01 0.5515957833506386E+01 0.5472943680538803E+01 + 0.5429267813328917E+01 0.5384945679412595E+01 0.5339992923638538E+01 0.5294425373668760E+01 0.5248259025678392E+01 + 0.5201510030262340E+01 0.5154194678555982E+01 0.5106329388576237E+01 0.5057930691789439E+01 0.5009015219911397E+01 + 0.4959599691945191E+01 0.4909700901461299E+01 0.4859335704124821E+01 0.4808521005473441E+01 0.4757273748950229E+01 + 0.4705610904194174E+01 0.4653549455591696E+01 0.4601106391091448E+01 0.4548298691284878E+01 0.4495143318754116E+01 + 0.4441657207689196E+01 0.4387857253775341E+01 0.4333760304351776E+01 0.4279383148842287E+01 0.4224742509458196E+01 + 0.4169855032173684E+01 0.4114737277973392E+01 0.4059405714371826E+01 0.4003876707203877E+01 0.3948166512685741E+01 + 0.3892291269744721E+01 0.3836266992617200E+01 0.3780109563712459E+01 0.3723834726741400E+01 0.3667458080107569E+01 + 0.3610995070558891E+01 0.3554460987097478E+01 0.3497870955145241E+01 0.3441239930962816E+01 0.3384582696318687E+01 + 0.3327913853406216E+01 0.3271247820004922E+01 0.3214598824883478E+01 0.3157980903440747E+01 0.3101407893581784E+01 + 0.3044893431825231E+01 0.2988450949638577E+01 0.2932093669997769E+01 0.2875834604167262E+01 0.2819686548696998E+01 + 0.2763662082632170E+01 0.2707773564932239E+01 0.2652033132094799E+01 0.2596452695980827E+01 0.2541043941836626E+01 + 0.2485818326509053E+01 0.2430787076849344E+01 0.2375961188301807E+01 0.2321351423672851E+01 0.2266968312076604E+01 + 0.2212822148052429E+01 0.2158922990850521E+01 0.2105280663881218E+01 0.2051904754323755E+01 0.1998804612890416E+01 + 0.1945989353741675E+01 0.1893467854548430E+01 0.1841248756696710E+01 0.1789340465631234E+01 0.1737751151333199E+01 + 0.1686488748928507E+01 0.1635560959422214E+01 0.1584975250555055E+01 0.1534738857778293E+01 0.1484858785342541E+01 + 0.1435341807496924E+01 0.1386194469794414E+01 0.1337423090499684E+01 0.1289033762095411E+01 0.1241032352883452E+01 + 0.1193424508676993E+01 0.1146215654580135E+01 0.1099410996851037E+01 0.1053015524845333E+01 0.1007034013035967E+01 + 0.9614710231061919E+00 0.9163309061121906E+00 0.8716178047119132E+00 0.8273356554569915E+00 0.7834881911441322E+00 + 0.7400789432232032E+00 0.6971112442584428E+00 0.6545882304400988E+00 0.6125128441430950E+00 0.5708878365301393E+00 + 0.5297157701959697E+00 0.4889990218502538E+00 0.4487397850361310E+00 0.4089400728816994E+00 0.3696017208819437E+00 + 0.3307263897082250E+00 0.2923155680431669E+00 0.2543705754380062E+00 0.2168925651904757E+00 0.1798825272404206E+00 + 0.1433412910812248E+00 0.1072695286845231E+00 0.7166775743626266E-01 0.3653634308175027E-01 0.1875502677966891E-02 + -0.3231469244926006E-01 -0.6603431374472693E-01 -0.9928357246226212E-01 -0.1320628167035092E+00 -0.1643725284591359E+00 + -0.1962133206540352E+00 -0.2275859341981871E+00 -0.2584912350448162E+00 -0.2889302112573159E+00 -0.3189039700865247E+00 + -0.3484137350596561E+00 -0.3774608430824280E+00 -0.4060467415555353E+00 -0.4341729855069461E+00 -0.4618412347410261E+00 + -0.4890532510058743E+00 -0.5158108951799040E+00 -0.5421161244787339E+00 -0.5679709896834355E+00 -0.5933776323912099E+00 + -0.6183382822893291E+00 -0.6428552544532798E+00 -0.6669309466699765E+00 -0.6905678367868668E+00 -0.7137684800877064E+00 + -0.7365355066956285E+00 -0.7588716190043869E+00 -0.7807795891382519E+00 -0.8022622564412896E+00 -0.8233225249964942E+00 + -0.8439633611754367E+00 -0.8641877912188305E+00 -0.8839988988484928E+00 -0.9033998229112149E+00 -0.9223937550548300E+00 + -0.9409839374369939E+00 -0.9591736604667737E+00 -0.9769662605796675E+00 -0.9943651180460338E+00 -0.1011373654813408E+01 + -0.1027995332382722E+01 -0.1044233649718800E+01 -0.1060092141195189E+01 -0.1075574374573462E+01 -0.1090683949017157E+01 + -0.1105424493140398E+01 -0.1119799663091301E+01 -0.1133813140670142E+01 -0.1147468631482395E+01 -0.1160769863126533E+01 + -0.1173720583416712E+01 -0.1186324558640121E+01 -0.1198585571849071E+01 -0.1210507421187702E+01 -0.1222093918253196E+01 + -0.1233348886491358E+01 -0.1244276159626517E+01 -0.1254879580125511E+01 -0.1265162997695628E+01 -0.1275130267816335E+01 + -0.1284785250304552E+01 -0.1294131807913390E+01 -0.1303173804963923E+01 -0.1311915106009982E+01 -0.1320359574535607E+01 + -0.1328511071684896E+01 -0.1336373455024057E+01 -0.1343950577335306E+01 -0.1351246285442432E+01 -0.1358264419067570E+01 + -0.1365008809719085E+01 -0.1371483279610062E+01 -0.1377691640607245E+01 -0.1383637693209943E+01 -0.1389325225558719E+01 + -0.1394758012473418E+01 -0.1399939814520254E+01 -0.1404874377107532E+01 -0.1409565429609723E+01 -0.1414016684519505E+01 + -0.1418231836627389E+01 -0.1422214562228558E+01 -0.1425968518356584E+01 -0.1429497342043625E+01 -0.1432804649606689E+01 + -0.1435894035959656E+01 -0.1438769073950589E+01 -0.1441433313724035E+01 -0.1443890282107847E+01 -0.1446143482024210E+01 + -0.1448196391924410E+01 -0.1450052465247018E+01 -0.1451715129899050E+01 -0.1453187787759769E+01 -0.1454473814206628E+01 + -0.1455576557663118E+01 -0.1456499339167960E+01 -0.1457245451965397E+01 -0.1457818161116118E+01 -0.1458220703128390E+01 + -0.1458456285609144E+01 -0.1458528086934452E+01 -0.1458439255939184E+01 -0.1458192911625301E+01 -0.1457792142888557E+01 + -0.1457240008263066E+01 -0.1456539535683532E+01 -0.1455693722264615E+01 -0.1454705534097164E+01 -0.1453577906060864E+01 + -0.1452313741653029E+01 -0.1450915912833076E+01 -0.1449387259882392E+01 -0.1447730591279191E+01 -0.1445948683588039E+01 + -0.1444044281363676E+01 -0.1442020097068773E+01 -0.1439878811005344E+01 -0.1437623071259354E+01 -0.1435255493658342E+01 + -0.1432778661741579E+01 -0.1430195126742490E+01 -0.1427507407583088E+01 -0.1424717990879937E+01 -0.1421829330961478E+01 + -0.1418843849896296E+01 -0.1415763937532114E+01 -0.1412591951545110E+01 -0.1409330217499327E+01 -0.1405981028915838E+01 + -0.1402546647351420E+01 -0.1399029302486348E+01 -0.1395431192221163E+01 -0.1391754482782035E+01 -0.1388001308834431E+01 + -0.1384173773604920E+01 -0.1380273949010718E+01 -0.1376303875796823E+01 -0.1372265563680394E+01 -0.1368160991502163E+01 + -0.1363992107384622E+01 -0.1359760828896748E+01 -0.1355469043224972E+01 -0.1351118607350228E+01 -0.1346711348230812E+01 + -0.1342249062990785E+01 -0.1337733519113769E+01 -0.1333166454641865E+01 -0.1328549578379474E+01 -0.1323884570101832E+01 + -0.1319173080768030E+01 -0.1314416732738336E+01 -0.1309617119995603E+01 -0.1304775808370537E+01 -0.1299894335770717E+01 + -0.1294974212413071E+01 -0.1290016921059716E+01 -0.1285023917256931E+01 -0.1279996629577071E+01 -0.1274936459863322E+01 + -0.1269844783477041E+01 -0.1264722949547587E+01 -0.1259572281224406E+01 -0.1254394075931317E+01 -0.1249189605622732E+01 + -0.1243960117041727E+01 -0.1238706831979822E+01 -0.1233430947538271E+01 -0.1228133636390794E+01 -0.1222816047047525E+01 + -0.1217479304120173E+01 -0.1212124508588114E+01 -0.1206752738065413E+01 -0.1201365047068555E+01 -0.1195962467284892E+01 + -0.1190546007841516E+01 -0.1185116655574617E+01 -0.1179675375299079E+01 -0.1174223110078329E+01 -0.1168760781494218E+01 + -0.1163289289916911E+01 -0.1157809514774660E+01 -0.1152322314823388E+01 -0.1146828528415948E+01 -0.1141328973770988E+01 + -0.1135824449241374E+01 -0.1130315733582035E+01 -0.1124803586217146E+01 -0.1119288747506621E+01 -0.1113771939011809E+01 + -0.1108253863760298E+01 -0.1102735206509786E+01 -0.1097216634010968E+01 -0.1091698795269313E+01 -0.1086182321805725E+01 + -0.1080667827915982E+01 -0.1075155910928945E+01 -0.1069647151463423E+01 -0.1064142113683687E+01 -0.1058641345553532E+01 + -0.1053145379088904E+01 -0.1047654730608969E+01 -0.1042169900985625E+01 -0.1036691375891408E+01 -0.1031219626045731E+01 + -0.1025755107459436E+01 -0.1020298261677578E+01 -0.1014849516020502E+01 -0.1009409283823040E+01 -0.1003977964671914E+01 + -0.9985559446412423E+00 -0.9931435965261650E+00 -0.9877412800745212E+00 -0.9823493422165672E+00 -0.9769681172927177E+00 + -0.9715979272792943E+00 -0.9662390820122231E+00 -0.9608918794086823E+00 -0.9555566056867116E+00 -0.9502335355826994E+00 + -0.9449229325667899E+00 -0.9396250490561532E+00 -0.9343401266261530E+00 -0.9290683962193379E+00 -0.9238100783522983E+00 + -0.9185653833203373E+00 -0.9133345113999997E+00 -0.9081176530493820E+00 -0.9029149891062611E+00 -0.8977266909840595E+00 + -0.8925529208655598E+00 -0.8873938318944620E+00 -0.8822495683646910E+00 -0.8771202659075404E+00 -0.8720060516765797E+00 + -0.8669070445303514E+00 -0.8618233552128786E+00 -0.8567550865319589E+00 -0.8517023335352547E+00 -0.8466651836841759E+00 + -0.8416437170255952E+00 -0.8366380063613471E+00 -0.8316481174155630E+00 -0.8266741089998076E+00 -0.8217160331760809E+00 + -0.8167739354176268E+00 -0.8118478547676139E+00 -0.8069378239956513E+00 -0.8020438697521995E+00 -0.7971660127208436E+00 + -0.7923042677684496E+00 -0.7874586440932471E+00 -0.7826291453708021E+00 -0.7778157698979398E+00 -0.7730185107345809E+00 + -0.7682373558435663E+00 -0.7634722882284258E+00 -0.7587232860691486E+00 -0.7539903228559367E+00 -0.7492733675209987E+00 + -0.7445723845683611E+00 -0.7398873342017247E+00 -0.7352181724504098E+00 -0.7305648512933688E+00 -0.7259273187813085E+00 + -0.7213055191569296E+00 -0.7166993929733191E+00 -0.7121088772104908E+00 -0.7075339053901175E+00 -0.7029744076884417E+00 + -0.6984303110474385E+00 -0.6939015392841926E+00 -0.6893880131985548E+00 -0.6848896506790639E+00 -0.6804063668071960E+00 + -0.6759380739599310E+00 -0.6714846819106545E+00 -0.6670460979284606E+00 -0.6626222268758263E+00 -0.6582129713047191E+00 + -0.6538182315511271E+00 -0.6494379058280859E+00 -0.6450718903171657E+00 -0.6407200792584876E+00 -0.6363823650392715E+00 + -0.6320586382809613E+00 -0.6277487879249267E+00 -0.6234527013167734E+00 -0.6191702642893190E+00 -0.6149013612442086E+00 + -0.6106458752322457E+00 -0.6064036880324198E+00 -0.6021746802297080E+00 -0.5979587312916264E+00 -0.5937557196436042E+00 + -0.5895655227431641E+00 -0.5853880171529922E+00 -0.5812230786128654E+00 -0.5770705821105107E+00 -0.5729304019514115E+00 + -0.5688024118275793E+00 -0.5646864848853448E+00 -0.5605824937921645E+00 -0.5564903108025173E+00 -0.5524098078228833E+00 + -0.5483408564758644E+00 -0.5442833281634526E+00 -0.5402370941295085E+00 -0.5362020255214600E+00 -0.5321779934512643E+00 + -0.5281648690556621E+00 -0.5241625235557782E+00 -0.5201708283160628E+00 -0.5161896549026552E+00 -0.5122188751411803E+00 + -0.5082583611740192E+00 -0.5043079855170916E+00 -0.5003676211161868E+00 -0.4964371414029022E+00 -0.4925164203501901E+00 + -0.4886053325275901E+00 -0.4847037531561659E+00 -0.4808115581632069E+00 -0.4769286242367184E+00 -0.4730548288797583E+00 + -0.4691900504646559E+00 -0.4653341682871753E+00 -0.4614870626206452E+00 -0.4576486147701215E+00 -0.4538187071266341E+00 + -0.4499972232215512E+00 -0.4461840477811270E+00 -0.4423790667812826E+00 -0.4385821675026696E+00 -0.4347932385860811E+00 + -0.4310121700882537E+00 -0.4272388535381303E+00 -0.4234731819936421E+00 -0.4197150500990645E+00 -0.4159643541430195E+00 + -0.4122209921171803E+00 -0.4084848637757519E+00 -0.4047558706957974E+00 -0.4010339163384737E+00 -0.3973189061112476E+00 + -0.3936107474311905E+00 -0.3899093497893938E+00 -0.3862146248166102E+00 -0.3825264863501910E+00 -0.3788448505024144E+00 + -0.3751696357302771E+00 -0.3715007629068495E+00 -0.3678381553942878E+00 -0.3641817391185885E+00 -0.3605314426461966E+00 + -0.3568871972625555E+00 -0.3532489370527205E+00 -0.3496165989841241E+00 -0.3459901229916214E+00 -0.3423694520649201E+00 + -0.3387545323385251E+00 -0.3351453131843082E+00 -0.3315417473068326E+00 -0.3279437908415819E+00 -0.3243514034561918E+00 + -0.3207645484548654E+00 -0.3171831928860834E+00 -0.3136073076537766E+00 -0.3100368676321130E+00 -0.3064718517840476E+00 + -0.3029122432838121E+00 -0.2993580296435038E+00 -0.2958092028439498E+00 -0.2922657594700352E+00 -0.2887277008506632E+00 + -0.2851950332035602E+00 -0.2816677677851020E+00 -0.2781459210453749E+00 -0.2746295147886844E+00 -0.2711185763397140E+00 + -0.2676131387155659E+00 -0.2641132408039054E+00 -0.2606189275474402E+00 -0.2571302501349864E+00 -0.2536472661993449E+00 + -0.2501700400222663E+00 -0.2466986427467328E+00 -0.2432331525968512E+00 -0.2397736551055949E+00 -0.2363202433506903E+00 + -0.2328730181989250E+00 -0.2294320885591435E+00 -0.2259975716442418E+00 -0.2225695932424345E+00 -0.2191482879980940E+00 + -0.2157337997024620E+00 -0.2123262815945201E+00 -0.2089258966723290E+00 -0.2055328180151234E+00 -0.2021472291164557E+00 + -0.1987693242286884E+00 -0.1953993087191055E+00 -0.1920373994379287E+00 -0.1886838250985003E+00 -0.1853388266698828E+00 + -0.1820026577821215E+00 -0.1786755851443744E+00 -0.1753578889761193E+00 -0.1720498634515968E+00 -0.1687518171576267E+00 + -0.1654640735649029E+00 -0.1621869715128154E+00 -0.1589208657078173E+00 -0.1556661272352739E+00 -0.1524231440846908E+00 + -0.1491923216881294E+00 -0.1459740834715274E+00 -0.1427688714185721E+00 -0.1395771466466322E+00 -0.1363993899941623E+00 + -0.1332361026188316E+00 -0.1300878066054895E+00 -0.1269550455829047E+00 -0.1238383853480043E+00 -0.1207384144961449E+00 + -0.1176557450556807E+00 -0.1145910131248316E+00 -0.1115448795085540E+00 -0.1085180303527610E+00 -0.1055111777728831E+00 + -0.1025250604733206E+00 -0.9956044435388604E-01 -0.9661812309881886E-01 -0.9369891874337012E-01 -0.9080368221234399E-01 + -0.8793329382426256E-01 -0.8508866375406340E-01 -0.8227073244639434E-01 -0.7948047097061904E-01 -0.7671888130764398E-01 + -0.7398699655753553E-01 -0.7128588105567601E-01 -0.6861663038386651E-01 -0.6598037126130515E-01 -0.6337826129880289E-01 + -0.6081148859784694E-01 -0.5828127117427706E-01 -0.5578885618432740E-01 -0.5333551892862030E-01 -0.5092256160742038E-01 + -0.4855131179798897E-01 -0.4622312062232615E-01 -0.4393936057086534E-01 -0.4170142294489704E-01 -0.3951071487762254E-01 + -0.3736865589081760E-01 -0.3527667394121730E-01 -0.3323620090791550E-01 -0.3124866746947142E-01 -0.2931549731709577E-01 + -0.2743810064840861E-01 -0.2561786688503255E-01 -0.2385615655688409E-01 -0.2215429229678155E-01 -0.2051354889121152E-01 + -0.1893514233719176E-01 -0.1742021786166798E-01 -0.1596983686930661E-01 -0.1458496279764457E-01 -0.1326644587608198E-01 + -0.1201500680808027E-01 -0.1083121942521028E-01 -0.9715492398480059E-02 -0.8668050137937885E-02 -0.7688913067140435E-02 + -0.6777877525966872E-02 -0.5934495634602323E-02 -0.5158055544131036E-02 -0.4447562605453990E-02 -0.3801722107660840E-02 + -0.3218924367835703E-02 -0.2697233092980475E-02 -0.2234378075199077E-02 -0.1827753413977412E-02 -0.1474422570309129E-02 + -0.1171131627019387E-02 -0.9143321317637030E-03 -0.7002148003936321E-03 -0.5247551181118452E-03 -0.3837714480605755E-03 + -0.2729955946109330E-03 -0.1881548319023403E-03 -0.1250631789481358E-03 -0.7971820570180325E-04 -0.4839798665393986E-04 + -0.2775118225470492E-04 -0.1487196131798424E-04 -0.7351058493098910E-05 -0.3295260747991843E-05 -0.1310550608265630E-05 + -0.4491803501599659E-06 -0.1275625109004752E-06 -0.2842493719500779E-07 -0.4598019108179812E-08 -0.4812641260020268E-09 + -0.2729062991232811E-10 -0.6277478184238277E-12 -0.3532884035284522E-14 -0.1843992263449434E-17 -0.1064033801639711E-22 + -0.2179574996326970E-32 -0.2191274365894180E-56 -0.5812978673716309E-216 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.8687248663605213E+00 0.1707263902374461E+01 0.2516310697140216E+01 0.3296545407385949E+01 + 0.4048635017677018E+01 0.4773233612655782E+01 0.5470982663629552E+01 0.6142511330615299E+01 0.6788436779961467E+01 + 0.7409364516870689E+01 0.8005888731517908E+01 0.8578592656974877E+01 0.9128048936794247E+01 0.9654819999856910E+01 + 0.1015945843992924E+02 0.1064250739729831E+02 0.1110450093984054E+02 0.1154596444092118E+02 0.1196741495160918E+02 + 0.1236936156481509E+02 0.1275230576911170E+02 0.1311674179017046E+02 0.1346315691793700E+02 0.1379203181786923E+02 + 0.1410384082476923E+02 0.1439905221795016E+02 0.1467812847668937E+02 0.1494152651512514E+02 0.1518969789595702E+02 + 0.1542308902250295E+02 0.1564214130885283E+02 0.1584729132803401E+02 0.1603897093826909E+02 0.1621760738756086E+02 + 0.1638362339698061E+02 0.1653743722316642E+02 0.1667946270065578E+02 0.1681010926478216E+02 0.1692978195595912E+02 + 0.1703888140625709E+02 0.1713780380924828E+02 0.1722694087415465E+02 0.1730667976538239E+02 0.1737740302856498E+02 + 0.1743948850426588E+02 0.1749330923051193E+02 0.1753923333533993E+02 0.1757762392054244E+02 0.1760883893779540E+02 + 0.1763323105833935E+02 0.1765114753736991E+02 0.1766293007427053E+02 0.1766891466979376E+02 0.1766943148126528E+02 + 0.1766480467684931E+02 0.1765535228987511E+02 0.1764138607418140E+02 0.1762321136139172E+02 0.1760112692098567E+02 + 0.1757542482398380E+02 0.1754639031101227E+02 0.1751430166546395E+02 0.1747943009241989E+02 0.1744203960394378E+02 + 0.1740238691130952E+02 0.1736072132467072E+02 0.1731728466062878E+02 0.1727231115810628E+02 0.1722602740288191E+02 + 0.1717865226109467E+02 0.1713039682197727E+02 0.1708146435003250E+02 0.1703205024682137E+02 0.1698234202248845E+02 + 0.1693251927710871E+02 0.1688275369189969E+02 0.1683320903030526E+02 0.1678404114892058E+02 0.1673539801819411E+02 + 0.1668741975280949E+02 0.1664023865162014E+02 0.1659397924698056E+02 0.1654875836329216E+02 0.1650468518455595E+02 + 0.1646186133070283E+02 0.1642038094245007E+02 0.1638033077441462E+02 0.1634179029619614E+02 0.1630483180112684E+02 + 0.1626952052237267E+02 0.1623591475605696E+02 0.1620406599106814E+02 0.1617401904520420E+02 0.1614581220729854E+02 + 0.1611947738496719E+02 0.1609504025761150E+02 0.1607252043430844E+02 0.1605193161621790E+02 0.1603328176313632E+02 + 0.1601657326382578E+02 0.1600180310974979E+02 0.1598896307184925E+02 0.1597803987999542E+02 0.1596901540476141E+02 + 0.1596186684115860E+02 0.1595656689399044E+02 0.1595308396448294E+02 0.1595138233785788E+02 0.1595142237152340E+02 + 0.1595316068356454E+02 0.1595655034122527E+02 0.1596154104908305E+02 0.1596807933662661E+02 0.1597610874495764E+02 + 0.1598557001234738E+02 0.1599640125838981E+02 0.1600853816650400E+02 0.1602191416454864E+02 0.1603646060332359E+02 + 0.1605210693274370E+02 0.1606878087548201E+02 0.1608640859789002E+02 0.1610491487801469E+02 0.1612422327054205E+02 + 0.1614425626850959E+02 0.1616493546163930E+02 0.1618618169115549E+02 0.1620791520096096E+02 0.1623005578505677E+02 + 0.1625252293110075E+02 0.1627523596000996E+02 0.1629811416152313E+02 0.1632107692564781E+02 0.1634404386992741E+02 + 0.1636693496247232E+02 0.1638967064070816E+02 0.1641217192580325E+02 0.1643436053274611E+02 0.1645615897605117E+02 + 0.1647749067108008E+02 0.1649828003097248E+02 0.1651845255918834E+02 0.1653793493767038E+02 0.1655665511064232E+02 + 0.1657454236406513E+02 0.1659152740077896E+02 0.1660754241136564E+02 0.1662252114077064E+02 0.1663639895072981E+02 + 0.1664911287805092E+02 0.1666060168880418E+02 0.1667080592848118E+02 0.1667966796818515E+02 0.1668713204691969E+02 + 0.1669314431004635E+02 0.1669765284398512E+02 0.1670060770723475E+02 0.1670196095779233E+02 0.1670166667705496E+02 + 0.1669968099028751E+02 0.1669596208374337E+02 0.1669047021852679E+02 0.1668316774128659E+02 0.1667401909183290E+02 + 0.1666299080776961E+02 0.1665005152623624E+02 0.1663517198285345E+02 0.1661832500796750E+02 0.1659948552028914E+02 + 0.1657863051802247E+02 0.1655573906758000E+02 0.1653079228997926E+02 0.1650377334501676E+02 0.1647466741331476E+02 + 0.1644346167633494E+02 0.1641014529445382E+02 0.1637470938319258E+02 0.1633714698769450E+02 0.1629745305554087E+02 + 0.1625562440799640E+02 0.1621165970977314E+02 0.1616555943740087E+02 0.1611732584629117E+02 0.1606696293657995E+02 + 0.1601447641783236E+02 0.1595987367269281E+02 0.1590316371956016E+02 0.1584435717436734E+02 0.1578346621154290E+02 + 0.1572050452422970E+02 0.1565548728383454E+02 0.1558843109898079E+02 0.1551935397393391E+02 0.1544827526656816E+02 + 0.1537521564594045E+02 0.1530019704953602E+02 0.1522324264024800E+02 0.1514437676315159E+02 0.1506362490213083E+02 + 0.1498101363641504E+02 0.1489657059707905E+02 0.1481032442355990E+02 0.1472230472024070E+02 0.1463254201315024E+02 + 0.1454106770682513E+02 0.1444791404137927E+02 0.1435311404982355E+02 0.1425670151567689E+02 0.1415871093090752E+02 + 0.1405917745424228E+02 0.1395813686987899E+02 0.1385562554663566E+02 0.1375168039756887E+02 0.1364633884009084E+02 + 0.1353963875661431E+02 0.1343161845575160E+02 0.1332231663409325E+02 0.1321177233858961E+02 0.1310002492955745E+02 + 0.1298711404433202E+02 0.1287307956158335E+02 0.1275796156631419E+02 0.1264180031555601E+02 0.1252463620477686E+02 + 0.1240650973501518E+02 0.1228746148075084E+02 0.1216753205852430E+02 0.1204676209631323E+02 0.1192519220367461E+02 + 0.1180286294265961E+02 0.1167981479950663E+02 0.1155608815711772E+02 0.1143172326832159E+02 0.1130676022992646E+02 + 0.1118123895756377E+02 0.1105519916132396E+02 0.1092868032218412E+02 0.1080172166922607E+02 0.1067436215764326E+02 + 0.1054664044753408E+02 0.1041859488347744E+02 0.1029026347488684E+02 0.1016168387713817E+02 0.1003289337346536E+02 + 0.9903928857617679E+01 0.9774826817272114E+01 0.9645623318193554E+01 0.9516353989134197E+01 0.9387054007464796E+01 + 0.9257758085527723E+01 0.9128500457703609E+01 0.8999314868181001E+01 0.8870234559419087E+01 0.8741292261293285E+01 + 0.8612520180912444E+01 0.8483949993096608E+01 0.8355612831503974E+01 0.8227539280395387E+01 0.8099759367023964E+01 + 0.7972302554638278E+01 0.7845197736086287E+01 0.7718473228007762E+01 0.7592156765602027E+01 0.7466275497958868E+01 + 0.7340855983939128E+01 0.7215924188591989E+01 0.7091505480096169E+01 0.6967624627211525E+01 0.6844305797227783E+01 + 0.6721572554397537E+01 0.6599447858839925E+01 0.6477954065901652E+01 0.6357112925962435E+01 0.6236945584671568E+01 + 0.6117472583602064E+01 0.5998713861309926E+01 0.5880688754784813E+01 0.5763416001279670E+01 0.5646913740506246E+01 + 0.5531199517183574E+01 0.5416290283926924E+01 0.5302202404464881E+01 0.5188951657171522E+01 0.5076553238901992E+01 + 0.4965021769119214E+01 0.4854371294299406E+01 0.4744615292604905E+01 0.4635766678812629E+01 0.4527837809486449E+01 + 0.4420840488382136E+01 0.4314785972074110E+01 0.4209684975792541E+01 0.4105547679460195E+01 0.4002383733918524E+01 + 0.3900202267332557E+01 0.3799011891764151E+01 0.3698820709903869E+01 0.3599636321951710E+01 0.3501465832636705E+01 + 0.3404315858366423E+01 0.3308192534496821E+01 0.3213101522713837E+01 0.3119048018517560E+01 0.3026036758800617E+01 + 0.2934072029512395E+01 0.2843157673401020E+01 0.2753297097824851E+01 0.2664493282626155E+01 0.2576748788059156E+01 + 0.2490065762765371E+01 0.2404445951788702E+01 0.2319890704624000E+01 0.2236400983291912E+01 0.2153977370433589E+01 + 0.2072620077419250E+01 0.1992328952464182E+01 0.1913103488746359E+01 0.1834942832520140E+01 0.1757845791220436E+01 + 0.1681810841551835E+01 0.1606836137557940E+01 0.1532919518665786E+01 0.1460058517700443E+01 0.1388250368865471E+01 + 0.1317492015684907E+01 0.1247780118901998E+01 0.1179111064331551E+01 0.1111480970661150E+01 0.1044885697198059E+01 + 0.9793208515582879E+00 0.9147817972939893E+00 0.8512636614565350E+00 0.7887613420918976E+00 0.7272695156654265E+00 + 0.6667826444134151E+00 0.6072949836187563E+00 0.5488005888082287E+00 0.4912933228690584E+00 0.4347668630826892E+00 + 0.3792147080735970E+00 0.3246301846712228E+00 0.2710064546832890E+00 0.2183365215789164E+00 0.1666132370796914E+00 + 0.1158293076575852E+00 0.6597730093832276E-01 0.1704965200881259E-01 -0.3096133037222471E-01 -0.7806345766145839E-01 + -0.1242646555170061E+00 -0.1695729578839355E+00 -0.2139965011800796E+00 -0.2575435185826074E+00 -0.3002223344158743E+00 + -0.3420413586411577E+00 -0.3830090814482432E+00 -0.4231340679495004E+00 -0.4624249529762802E+00 -0.5008904359780200E+00 + -0.5385392760237241E+00 -0.5753802869061535E+00 -0.6114223323483075E+00 -0.6466743213121019E+00 -0.6811452034089456E+00 + -0.7148439644120911E+00 -0.7477796218700159E+00 -0.7799612208208035E+00 -0.8113978296067292E+00 -0.8420985357887053E+00 + -0.8720724421598169E+00 -0.9013286628575624E+00 -0.9298763195738665E+00 -0.9577245378622440E+00 -0.9848824435414749E+00 + -0.1011359159194722E+01 -0.1037163800763434E+01 -0.1062305474235226E+01 -0.1086793272424552E+01 -0.1110636271845517E+01 + -0.1133843529675753E+01 -0.1156424080810253E+01 -0.1178386935004340E+01 -0.1199741074104586E+01 -0.1220495449366658E+01 + -0.1240658978858965E+01 -0.1260240544951108E+01 -0.1279248991885808E+01 -0.1297693123433412E+01 -0.1315581700627601E+01 + -0.1332923439581261E+01 -0.1349727009381238E+01 -0.1366001030060941E+01 -0.1381754070649363E+01 -0.1396994647295475E+01 + -0.1411731221466749E+01 -0.1425972198220502E+01 -0.1439725924546859E+01 -0.1453000687782247E+01 -0.1465804714091862E+01 + -0.1478146167020199E+01 -0.1490033146108215E+01 -0.1501473685575904E+01 -0.1512475753069052E+01 -0.1523047248468980E+01 + -0.1533196002763981E+01 -0.1542929776981157E+01 -0.1552256261177614E+01 -0.1561183073489532E+01 -0.1569717759238136E+01 + -0.1577867790091117E+01 -0.1585640563278520E+01 -0.1593043400861668E+01 -0.1600083549054143E+01 -0.1606768177593432E+01 + -0.1613104379162233E+01 -0.1619099168858133E+01 -0.1624759483710538E+01 -0.1630092182243682E+01 -0.1635104044084646E+01 + -0.1639801769615148E+01 -0.1644191979666060E+01 -0.1648281215253528E+01 -0.1652075937355576E+01 -0.1655582526728141E+01 + -0.1658807283759452E+01 -0.1661756428361703E+01 -0.1664436099898922E+01 -0.1666852357150144E+01 -0.1669011178306643E+01 + -0.1670918461002464E+01 -0.1672580022377071E+01 -0.1674001599169259E+01 -0.1675188847841216E+01 -0.1676147344732051E+01 + -0.1676882586239485E+01 -0.1677399989029130E+01 -0.1677704890270234E+01 -0.1677802547897067E+01 -0.1677698140895068E+01 + -0.1677396769610920E+01 -0.1676903456085609E+01 -0.1676223144409744E+01 -0.1675360701100275E+01 -0.1674320915497755E+01 + -0.1673108500183398E+01 -0.1671728091415232E+01 -0.1670184249582419E+01 -0.1668481459677102E+01 -0.1666624131783108E+01 + -0.1664616601580613E+01 -0.1662463130866198E+01 -0.1660167908087604E+01 -0.1657735048892448E+01 -0.1655168596690241E+01 + -0.1652472523227175E+01 -0.1649650729172852E+01 -0.1646707044718564E+01 -0.1643645230186273E+01 -0.1640468976647931E+01 + -0.1637181906554373E+01 -0.1633787574373395E+01 -0.1630289467236240E+01 -0.1626691005592231E+01 -0.1622995543870765E+01 + -0.1619206371150311E+01 -0.1615326711833899E+01 -0.1611359726330491E+01 -0.1607308511741977E+01 -0.1603176102555118E+01 + -0.1598965471338085E+01 -0.1594679529441171E+01 -0.1590321127701217E+01 -0.1585893057149300E+01 -0.1581398049721393E+01 + -0.1576838778971485E+01 -0.1572217860786824E+01 -0.1567537854104941E+01 -0.1562801261632051E+01 -0.1558010530562515E+01 + -0.1553168053298982E+01 -0.1548276168172963E+01 -0.1543337160165420E+01 -0.1538353261627133E+01 -0.1533326652998501E+01 + -0.1528259463528551E+01 -0.1523153771992774E+01 -0.1518011607409659E+01 -0.1512834949755512E+01 -0.1507625730677423E+01 + -0.1502385834204081E+01 -0.1497117097454231E+01 -0.1491821311342496E+01 -0.1486500221282453E+01 -0.1481155527886632E+01 + -0.1475788887663291E+01 -0.1470401913709823E+01 -0.1464996176402467E+01 -0.1459573204082366E+01 -0.1454134483737546E+01 + -0.1448681461680846E+01 -0.1443215544223580E+01 -0.1437738098344736E+01 -0.1432250452355627E+01 -0.1426753896559857E+01 + -0.1421249683908433E+01 -0.1415739030649932E+01 -0.1410223116975571E+01 -0.1404703087659131E+01 -0.1399180052691527E+01 + -0.1393655087910084E+01 -0.1388129235622212E+01 -0.1382603505223591E+01 -0.1377078873810667E+01 -0.1371556286787404E+01 + -0.1366036658466202E+01 -0.1360520872663014E+01 -0.1355009783286443E+01 -0.1349504214920848E+01 -0.1344004963403421E+01 + -0.1338512796395142E+01 -0.1333028453945557E+01 -0.1327552649051373E+01 -0.1322086068208856E+01 -0.1316629371959906E+01 + -0.1311183195431850E+01 -0.1305748148870926E+01 -0.1300324818169403E+01 -0.1294913765386324E+01 -0.1289515529261906E+01 + -0.1284130625725508E+01 -0.1278759548397190E+01 -0.1273402769082885E+01 -0.1268060738263149E+01 -0.1262733885575457E+01 + -0.1257422620290157E+01 -0.1252127331779953E+01 -0.1246848389983009E+01 -0.1241586145859656E+01 -0.1236340931842745E+01 + -0.1231113062281559E+01 -0.1225902833879501E+01 -0.1220710526125339E+01 -0.1215536401718194E+01 -0.1210380706986247E+01 + -0.1205243672299176E+01 -0.1200125512474344E+01 -0.1195026427176832E+01 -0.1189946601313249E+01 -0.1184886205419436E+01 + -0.1179845396042039E+01 -0.1174824316114016E+01 -0.1169823095324133E+01 -0.1164841850480436E+01 -0.1159880685867766E+01 + -0.1154939693599391E+01 -0.1150018953962708E+01 -0.1145118535759160E+01 -0.1140238496638358E+01 -0.1135378883426438E+01 + -0.1130539732448745E+01 -0.1125721069846856E+01 -0.1120922911890006E+01 -0.1116145265280953E+01 -0.1111388127456360E+01 + -0.1106651486881709E+01 -0.1101935323340800E+01 -0.1097239608219940E+01 -0.1092564304786787E+01 -0.1087909368463974E+01 + -0.1083274747097547E+01 -0.1078660381220247E+01 -0.1074066204309709E+01 -0.1069492143041646E+01 -0.1064938117538041E+01 + -0.1060404041610429E+01 -0.1055889822998297E+01 -0.1051395363602706E+01 -0.1046920559715141E+01 -0.1042465302241655E+01 + -0.1038029476922388E+01 -0.1033612964546500E+01 -0.1029215641162557E+01 -0.1024837378284490E+01 -0.1020478043093089E+01 + -0.1016137498633167E+01 -0.1011815604006419E+01 -0.1007512214560045E+01 -0.1003227182071147E+01 -0.9989603549270579E+00 + -0.9947115783015485E+00 -0.9904806943270184E+00 -0.9862675422627522E+00 -0.9820719586592493E+00 -0.9778937775186953E+00 + -0.9737328304516771E+00 -0.9695889468301108E+00 -0.9654619539365238E+00 -0.9613516771097025E+00 -0.9572579398867307E+00 + -0.9531805641415736E+00 -0.9491193702201466E+00 -0.9450741770719889E+00 -0.9410448023785890E+00 -0.9370310626784017E+00 + -0.9330327734886064E+00 -0.9290497494236897E+00 -0.9250818043108714E+00 -0.9211287513024286E+00 -0.9171904029850091E+00 + -0.9132665714859235E+00 -0.9093570685765163E+00 -0.9054617057726567E+00 -0.9015802944323839E+00 -0.8977126458507625E+00 + -0.8938585713520132E+00 -0.8900178823789437E+00 -0.8861903905797556E+00 -0.8823759078922311E+00 -0.8785742466254294E+00 + -0.8747852195388349E+00 -0.8710086399190866E+00 -0.8672443216543031E+00 -0.8634920793060465E+00 -0.8597517281789752E+00 + -0.8560230843882563E+00 -0.8523059649247257E+00 -0.8486001877179036E+00 -0.8449055716968552E+00 -0.8412219368489985E+00 + -0.8375491042768192E+00 -0.8338868962526480E+00 -0.8302351362714315E+00 -0.8265936491016083E+00 -0.8229622608341091E+00 + -0.8193407989295268E+00 -0.8157290922634788E+00 -0.8121269711702471E+00 -0.8085342674846857E+00 -0.8049508145824523E+00 + -0.8013764474186241E+00 -0.7978110025647080E+00 -0.7942543182440929E+00 -0.7907062343659974E+00 -0.7871665925579165E+00 + -0.7836352361966469E+00 -0.7801120104378853E+00 -0.7765967622444689E+00 -0.7730893404132703E+00 -0.7695895956008084E+00 + -0.7660973803475873E+00 -0.7626125491011952E+00 -0.7591349582382320E+00 -0.7556644660850415E+00 -0.7522009329373659E+00 + -0.7487442210788564E+00 -0.7452941947985601E+00 -0.7418507204073561E+00 -0.7384136662534099E+00 -0.7349829027366561E+00 + -0.7315583023223650E+00 -0.7281397395537861E+00 -0.7247270910639445E+00 -0.7213202355865901E+00 -0.7179190539663420E+00 + -0.7145234291680540E+00 -0.7111332462854418E+00 -0.7077483925489899E+00 -0.7043687573331715E+00 -0.7009942321630125E+00 + -0.6976247107200276E+00 -0.6942600888475667E+00 -0.6909002645555757E+00 -0.6875451380248399E+00 -0.6841946116106925E+00 + -0.6808485898462595E+00 -0.6775069794452312E+00 -0.6741696893042333E+00 -0.6708366305047628E+00 -0.6675077163147983E+00 + -0.6641828621900246E+00 -0.6608619857747765E+00 -0.6575450069026729E+00 -0.6542318475970094E+00 -0.6509224320708961E+00 + -0.6476166867272263E+00 -0.6443145401584339E+00 -0.6410159231461258E+00 -0.6377207686605807E+00 -0.6344290118601643E+00 + -0.6311405900906676E+00 -0.6278554428846229E+00 -0.6245735119605972E+00 -0.6212947412225088E+00 -0.6180190767589913E+00 + -0.6147464668428325E+00 -0.6114768619305104E+00 -0.6082102146618701E+00 -0.6049464798599574E+00 -0.6016856145310354E+00 + -0.5984275778648340E+00 -0.5951723312350204E+00 -0.5919198381999848E+00 -0.5886700645038960E+00 -0.5854229780781174E+00 + -0.5821785490429797E+00 -0.5789367497099552E+00 -0.5756975545842548E+00 -0.5724609403678959E+00 -0.5692268859632494E+00 + -0.5659953724771183E+00 -0.5627663832253617E+00 -0.5595399037381192E+00 -0.5563159217656418E+00 -0.5530944272847829E+00 + -0.5498754125061794E+00 -0.5466588718821447E+00 -0.5434448021153181E+00 -0.5402332021681084E+00 -0.5370240732729479E+00 + -0.5338174189434215E+00 -0.5306132449862715E+00 -0.5274115595143415E+00 -0.5242123729604776E+00 -0.5210156980924291E+00 + -0.5178215500287884E+00 -0.5146299462559857E+00 -0.5114409066464112E+00 -0.5082544534776542E+00 -0.5050706114529327E+00 + -0.5018894077227221E+00 -0.4987108719076290E+00 -0.4955350361225455E+00 -0.4923619350021070E+00 -0.4891916057274888E+00 + -0.4860240880545712E+00 -0.4828594243435082E+00 -0.4796976595897113E+00 -0.4765388414562883E+00 -0.4733830203079488E+00 + -0.4702302492464025E+00 -0.4670805841472636E+00 -0.4639340836984699E+00 -0.4607908094402333E+00 -0.4576508258065108E+00 + -0.4545142001680199E+00 -0.4513810028767579E+00 -0.4482513073120319E+00 -0.4451251899279745E+00 -0.4420027303025001E+00 + -0.4388840111876836E+00 -0.4357691185614755E+00 -0.4326581416807331E+00 -0.4295511731354427E+00 -0.4264483089040742E+00 + -0.4233496484099363E+00 -0.4202552945784125E+00 -0.4171653538949250E+00 -0.4140799364634484E+00 -0.4109991560653700E+00 + -0.4079231302184809E+00 -0.4048519802358120E+00 -0.4017858312840442E+00 -0.3987248124411331E+00 -0.3956690567527806E+00 + -0.3926187012873193E+00 -0.3895738871885333E+00 -0.3865347597258667E+00 -0.3835014683414236E+00 -0.3804741666930851E+00 + -0.3774530126929794E+00 -0.3744381685404753E+00 -0.3714298007487684E+00 -0.3684280801640104E+00 -0.3654331819758509E+00 + -0.3624452857181055E+00 -0.3594645752581452E+00 -0.3564912387734580E+00 -0.3535254687136594E+00 -0.3505674617460703E+00 + -0.3476174186827757E+00 -0.3446755443868791E+00 -0.3417420476554580E+00 -0.3388171410764583E+00 -0.3359010408565321E+00 + -0.3329939666165476E+00 -0.3300961411511784E+00 -0.3272077901487176E+00 -0.3243291418668700E+00 -0.3214604267599845E+00 + -0.3186018770527939E+00 -0.3157537262553701E+00 -0.3129162086136159E+00 -0.3100895584892342E+00 -0.3072740096627376E+00 + -0.3044697945526863E+00 -0.3016771433440111E+00 -0.2988962830179719E+00 -0.2961274362760575E+00 -0.2933708203499825E+00 + -0.2906266456898650E+00 -0.2878951145227867E+00 -0.2851764192741990E+00 -0.2824707408451726E+00 -0.2797782467393001E+00 + -0.2770990890342526E+00 -0.2744334021946651E+00 -0.2717813007251957E+00 -0.2691428766655449E+00 -0.2665181969328780E+00 + -0.2639073005217756E+00 -0.2613101955776174E+00 -0.2587268563663881E+00 -0.2561572201724773E+00 -0.2536011841663135E+00 + -0.2510586022957567E+00 -0.2485292822692960E+00 -0.2460129827152067E+00 -0.2435094106190135E+00 -0.2410182191615573E+00 + -0.2385390061013152E+00 -0.2360713128665393E+00 -0.2336146245440482E+00 -0.2311683709702571E+00 -0.2287319291436186E+00 + -0.2263046271825591E+00 -0.2238857500445038E+00 -0.2214745471939171E+00 -0.2190702423535930E+00 -0.2166720453861016E+00 + -0.2142791662241082E+00 -0.2118908305935776E+00 -0.2095062970515578E+00 -0.2071248745972281E+00 -0.2047459398312080E+00 + -0.2023689523724028E+00 -0.1999934670554019E+00 -0.1976191414090548E+00 -0.1952457371550912E+00 -0.1928731150462155E+00 + -0.1905012233025302E+00 -0.1881300810881581E+00 -0.1857597595959972E+00 -0.1833903639169085E+00 -0.1810220185223115E+00 + -0.1786548578143285E+00 -0.1762890213721006E+00 -0.1739246522622315E+00 -0.1715618967099617E+00 -0.1692009041513801E+00 + -0.1668418273480159E+00 -0.1644848225100573E+00 -0.1621300494242820E+00 -0.1597776715867397E+00 -0.1574278563403202E+00 + -0.1550807750173627E+00 -0.1527366030874480E+00 -0.1503955203105244E+00 -0.1480577108955310E+00 -0.1457233636646466E+00 + -0.1433926722233472E+00 -0.1410658351364051E+00 -0.1387430561099922E+00 -0.1364245441800418E+00 -0.1341105139070126E+00 + -0.1318011855772175E+00 -0.1294967854108453E+00 -0.1271975457768302E+00 -0.1249037054146965E+00 -0.1226155096635082E+00 + -0.1203332106980454E+00 -0.1180570677723090E+00 -0.1157873474704553E+00 -0.1135243239652422E+00 -0.1112682792840448E+00 + -0.1090195035824928E+00 -0.1067782954257439E+00 -0.1045449620773913E+00 -0.1023198197959724E+00 -0.1001031941390004E+00 + -0.9789542027442202E-01 -0.9569684329933507E-01 -0.9350781856577459E-01 -0.9132871201329762E-01 -0.8915990050804710E-01 + -0.8700177218790264E-01 -0.8485472681323365E-01 -0.8271917612269755E-01 -0.8059554419341119E-01 -0.7848426780471512E-01 + -0.7638579680463178E-01 -0.7430059447796174E-01 -0.7222913791482828E-01 -0.7017191837828506E-01 -0.6812944166942314E-01 + -0.6610222848819827E-01 -0.6409081478795155E-01 -0.6209575212134812E-01 -0.6011760797515669E-01 -0.5815696609097321E-01 + -0.5621442676864546E-01 -0.5429060714874503E-01 -0.5238614147002400E-01 -0.5050168129729559E-01 -0.4863789571467226E-01 + -0.4679547147851291E-01 -0.4497511312379645E-01 -0.4317754301696363E-01 -0.4140350134749559E-01 -0.3965374604968968E-01 + -0.3792905264519061E-01 -0.3623021399585374E-01 -0.3455803995547253E-01 -0.3291335690774033E-01 -0.3129700717659555E-01 + -0.2970984829376720E-01 -0.2815275210690626E-01 -0.2662660371018717E-01 -0.2513230017763598E-01 -0.2367074907776015E-01 + -0.2224286674626115E-01 -0.2084957629177444E-01 -0.1949180530768286E-01 -0.1817048326111876E-01 -0.1688653852836564E-01 + -0.1564089504398897E-01 -0.1443446852927493E-01 -0.1326816226396534E-01 -0.1214286236395461E-01 -0.1105943252668154E-01 + -0.1001870820551502E-01 -0.9021490174708021E-02 -0.8068537447652485E-02 -0.7160559513483508E-02 -0.6298207860858848E-02 + -0.5482066763324758E-02 -0.4712643308532483E-02 -0.3990356664167553E-02 -0.3315526587400327E-02 -0.2688361202633861E-02 + -0.2108944095059771E-02 -0.1577220795897805E-02 -0.1092984770086615E-02 -0.6558630595718385E-03 -0.2653017861664537E-03 + 0.7944822189490764E-04 0.3793453454019918E-03 0.6355702167323619E-03 0.8495373838452211E-03 0.1022904990027115E-02 + 0.1157581756795607E-02 0.1255730447553756E-02 0.1319766883295748E-02 0.1352353488459118E-02 0.1356386278494535E-02 + 0.1334974179358035E-02 0.1291409617048463E-02 0.1229129462600355E-02 0.1151665700113620E-02 0.1062585641275423E-02 + 0.9654221768740550E-03 0.8635954616548462E-03 0.7603285776664598E-03 0.6585610737771120E-03 0.5608657269660935E-03 + 0.4693752087118773E-03 0.3857262433307593E-03 0.3110288768033999E-03 0.2458671434387088E-03 0.1903343314865707E-03 + 0.1441011800570143E-03 0.1065093644667441E-03 0.7667716125666785E-04 0.5360156636052818E-04 0.3624338213230885E-04 + 0.2358881126340773E-04 0.1468957244294401E-04 0.8688517982512364E-05 0.4836926461183601E-05 0.2505806106186696E-05 + 0.1190778874910442E-05 0.5095498141563876E-06 0.1916497626697207E-06 0.6134629795982277E-07 0.1599283622173898E-07 + 0.3192844313628801E-08 0.4465991345509002E-09 0.3830055172706218E-10 0.1633011596692233E-11 0.2440735408533676E-13 + 0.6817882595562817E-16 0.1011756708173479E-19 0.4237417807138562E-26 0.7509788045435901E-39 0.4267446943283257E-77 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.5899841183367943E+00 0.1161355619573833E+01 0.1714505862663386E+01 0.2249819256784396E+01 + 0.2767673391510573E+01 0.3268439177645294E+01 0.3752481000506378E+01 0.4220156886514003E+01 0.4671818683172639E+01 + 0.5107812251922465E+01 0.5528477672848820E+01 0.5934149459862732E+01 0.6325156784687305E+01 0.6701823707789128E+01 + 0.7064469414269955E+01 0.7413408452670304E+01 0.7748950974623735E+01 0.8071402973330306E+01 0.8381066518882308E+01 + 0.8678239988567556E+01 0.8963218290390984E+01 0.9236293078186977E+01 0.9497752956839562E+01 0.9747883676281340E+01 + 0.9986968313100460E+01 0.1021528743874655E+02 0.1043311927348773E+02 0.1064073982542990E+02 0.1083842301406511E+02 + 0.1102644077796590E+02 0.1120506316638604E+02 0.1137455841466486E+02 0.1153519300345998E+02 0.1168723170195367E+02 + 0.1183093759528836E+02 0.1196657209658812E+02 0.1209439494401590E+02 0.1221466418339854E+02 0.1232763613702556E+02 + 0.1243356535929262E+02 0.1253270457991625E+02 0.1262530463549414E+02 0.1271161439022432E+02 0.1279188064662818E+02 + 0.1286634804714671E+02 0.1293525896749568E+02 0.1299885340267705E+02 0.1305736884654751E+02 0.1311104016584454E+02 + 0.1316009946956320E+02 0.1320477597456633E+02 0.1324529586829482E+02 0.1328188216942499E+02 0.1331475458729735E+02 + 0.1334412938091442E+02 0.1337021921827631E+02 0.1339323303679160E+02 0.1341337590546720E+02 0.1343084888954589E+02 + 0.1344584891822348E+02 0.1345856865604004E+02 0.1346919637850042E+02 0.1347791585244115E+02 0.1348490622162011E+02 + 0.1349034189796659E+02 0.1349439245888940E+02 0.1349722255100133E+02 0.1349899180057996E+02 0.1349985473104553E+02 + 0.1349996068770030E+02 0.1349945376993611E+02 0.1349847277108194E+02 0.1349715112602811E+02 0.1349561686673074E+02 + 0.1349399258566773E+02 0.1349239540728639E+02 0.1349093696745374E+02 0.1348972340089195E+02 0.1348885533655486E+02 + 0.1348842790087613E+02 0.1348853072879561E+02 0.1348924798244868E+02 0.1349065837738147E+02 0.1349283521613647E+02 + 0.1349584642903438E+02 0.1349975462196169E+02 0.1350461713095838E+02 0.1351048608338651E+02 0.1351740846544771E+02 + 0.1352542619580703E+02 0.1353457620507051E+02 0.1354489052085530E+02 0.1355639635818421E+02 0.1356911621492991E+02 + 0.1358306797202959E+02 0.1359826499818650E+02 0.1361471625877207E+02 0.1363242642864042E+02 0.1365139600856614E+02 + 0.1367162144501598E+02 0.1369309525296598E+02 0.1371580614147713E+02 0.1373973914174481E+02 0.1376487573734043E+02 + 0.1379119399636717E+02 0.1381866870525614E+02 0.1384727150393395E+02 0.1387697102209792E+02 0.1390773301634148E+02 + 0.1393952050787757E+02 0.1397229392061555E+02 0.1400601121935343E+02 0.1404062804785455E+02 0.1407609786658558E+02 + 0.1411237208990064E+02 0.1414940022246391E+02 0.1418712999471152E+02 0.1422550749716204E+02 0.1426447731339282E+02 + 0.1430398265150846E+02 0.1434396547393582E+02 0.1438436662538888E+02 0.1442512595885534E+02 0.1446618245946512E+02 + 0.1450747436611004E+02 0.1454893929069182E+02 0.1459051433488456E+02 0.1463213620430574E+02 0.1467374131999813E+02 + 0.1471526592713335E+02 0.1475664620085529E+02 0.1479781834918989E+02 0.1483871871295512E+02 0.1487928386261246E+02 + 0.1491945069200887E+02 0.1495915650896474E+02 0.1499833912267056E+02 0.1503693692786206E+02 0.1507488898574914E+02 + 0.1511213510168126E+02 0.1514861589953717E+02 0.1518427289283329E+02 0.1521904855255031E+02 0.1525288637168290E+02 + 0.1528573092652318E+02 0.1531752793469264E+02 0.1534822430994272E+02 0.1537776821374822E+02 0.1540610910372214E+02 + 0.1543319777888478E+02 0.1545898642182323E+02 0.1548342863778163E+02 0.1550647949072526E+02 0.1552809553642536E+02 + 0.1554823485261403E+02 0.1556685706626144E+02 0.1558392337803033E+02 0.1559939658396475E+02 0.1561324109447264E+02 + 0.1562542295066320E+02 0.1563590983810227E+02 0.1564467109805053E+02 0.1565167773625032E+02 0.1565690242932856E+02 + 0.1566031952888424E+02 0.1566190506332994E+02 0.1566163673755728E+02 0.1565949393049741E+02 0.1565545769064767E+02 + 0.1564951072963612E+02 0.1564163741389599E+02 0.1563182375452176E+02 0.1562005739537916E+02 0.1560632759954093E+02 + 0.1559062523411967E+02 0.1557294275356961E+02 0.1555327418152762E+02 0.1553161509126428E+02 0.1550796258481429E+02 + 0.1548231527085568E+02 0.1545467324140574E+02 0.1542503804740110E+02 0.1539341267322875E+02 0.1535980151027311E+02 + 0.1532421032954375E+02 0.1528664625344730E+02 0.1524711772676548E+02 0.1520563448690045E+02 0.1516220753344726E+02 + 0.1511684909715194E+02 0.1506957260831226E+02 0.1502039266467727E+02 0.1496932499890005E+02 0.1491638644559677E+02 + 0.1486159490806366E+02 0.1480496932470243E+02 0.1474652963520277E+02 0.1468629674652943E+02 0.1462429249875961E+02 + 0.1456053963081552E+02 0.1449506174613458E+02 0.1442788327831924E+02 0.1435902945680608E+02 0.1428852627259312E+02 + 0.1421640044406208E+02 0.1414267938293157E+02 0.1406739116037524E+02 0.1399056447333767E+02 0.1391222861107943E+02 + 0.1383241342198120E+02 0.1375114928063558E+02 0.1366846705525355E+02 0.1358439807541183E+02 0.1349897410016506E+02 + 0.1341222728654655E+02 0.1332419015847903E+02 0.1323489557611632E+02 0.1314437670563505E+02 0.1305266698949474E+02 + 0.1295980011718308E+02 0.1286580999646230E+02 0.1277073072513102E+02 0.1267459656331543E+02 0.1257744190630183E+02 + 0.1247930125792220E+02 0.1238020920450298E+02 0.1228020038938623E+02 0.1217930948803182E+02 0.1207757118370758E+02 + 0.1197502014377439E+02 0.1187169099657116E+02 0.1176761830890495E+02 0.1166283656414955E+02 0.1155738014095610E+02 + 0.1145128329257739E+02 0.1134458012680787E+02 0.1123730458653994E+02 0.1112949043093634E+02 0.1102117121721842E+02 + 0.1091238028306897E+02 0.1080315072964744E+02 0.1069351540521540E+02 0.1058350688936919E+02 0.1047315747787608E+02 + 0.1036249916810981E+02 0.1025156364508113E+02 0.1014038226805835E+02 0.1002898605777191E+02 0.9917405684197892E+01 + 0.9805671454913359E+01 0.9693813304017528E+01 0.9581860781611367E+01 0.9469843043828288E+01 0.9357788843408597E+01 + 0.9245726520809420E+01 0.9133683995842015E+01 0.9021688759828107E+01 0.8909767868266561E+01 0.8797947934001263E+01 + 0.8686255120881437E+01 0.8574715137904995E+01 0.8463353233835596E+01 0.8352194192283553E+01 0.8241262327241410E+01 + 0.8130581479064045E+01 0.8020175010883365E+01 0.7910065805447962E+01 0.7800276262377434E+01 0.7690828295821206E+01 + 0.7581743332512092E+01 0.7473042310204099E+01 0.7364745676484368E+01 0.7256873387949169E+01 0.7149444909733861E+01 + 0.7042479215386244E+01 0.6935994787073786E+01 0.6830009616114025E+01 0.6724541203818547E+01 0.6619606562640385E+01 + 0.6515222217614777E+01 0.6411404208083596E+01 0.6308168089693712E+01 0.6205528936659299E+01 0.6103501344278738E+01 + 0.6002099431696649E+01 0.5901336844901273E+01 0.5801226759948285E+01 0.5701781886401747E+01 0.5603014470983003E+01 + 0.5504936301418622E+01 0.5407558710478755E+01 0.5310892580196972E+01 0.5214948346263076E+01 0.5119736002580636E+01 + 0.5025265105980838E+01 0.4931544781084478E+01 0.4838583725304196E+01 0.4746390213979240E+01 0.4654972105634751E+01 + 0.4564336847358377E+01 0.4474491480286574E+01 0.4385442645193613E+01 0.4297196588176073E+01 0.4209759166425876E+01 + 0.4123135854085263E+01 0.4037331748177098E+01 0.3952351574603862E+01 0.3868199694209329E+01 0.3784880108896700E+01 + 0.3702396467797228E+01 0.3620752073483427E+01 0.3539949888221543E+01 0.3459992540257458E+01 0.3380882330130837E+01 + 0.3302621237012444E+01 0.3225210925059441E+01 0.3148652749783842E+01 0.3072947764429528E+01 0.2998096726353141E+01 + 0.2924100103404396E+01 0.2850958080301697E+01 0.2778670564998860E+01 0.2707237195038878E+01 0.2636657343891009E+01 + 0.2566930127267545E+01 0.2498054409416378E+01 0.2430028809386447E+01 0.2362851707262292E+01 0.2296521250364838E+01 + 0.2231035359415401E+01 0.2166391734659781E+01 0.2102587861949918E+01 0.2039621018780374E+01 0.1977488280277051E+01 + 0.1916186525135823E+01 0.1855712441508784E+01 0.1796062532835888E+01 0.1737233123619909E+01 0.1679220365142876E+01 + 0.1622020241122005E+01 0.1565628573303434E+01 0.1510041026992134E+01 0.1455253116516494E+01 0.1401260210626005E+01 + 0.1348057537820834E+01 0.1295640191612015E+01 0.1244003135710985E+01 0.1193141209147503E+01 0.1143049131314995E+01 + 0.1093721506942225E+01 0.1045152830990733E+01 0.9973374934770503E+00 0.9502697842192204E+00 0.9039438975069450E+00 + 0.8583539366947573E+00 0.8134939187180027E+00 0.7693577785309419E+00 0.7259393734669808E+00 0.6832324875204686E+00 + 0.6412308355501580E+00 0.5999280674039510E+00 0.5593177719650326E+00 0.5193934811192902E+00 0.4801486736441256E+00 + 0.4415767790185855E+00 0.4036711811552292E+00 0.3664252220536028E+00 0.3298322053757856E+00 0.2938853999441776E+00 + 0.2585780431619257E+00 0.2239033443561915E+00 0.1898544880448611E+00 0.1564246371270075E+00 0.1236069359975595E+00 + 0.9139451358676925E-01 0.5978048632501255E-01 0.2875796103333898E-01 -0.1679962259405253E-02 -0.3154018757241899E-01 + -0.6082962030108538E-01 -0.8955516461660286E-01 -0.1177237209366101E+00 -0.1453421834658722E+00 -0.1724174378064842E+00 + -0.1989563586366328E+00 -0.2249658074573321E+00 -0.2504526304061375E+00 -0.2754236561371938E+00 -0.2998856937666934E+00 + -0.3238455308829152E+00 -0.3473099316199632E+00 -0.3702856347944674E+00 -0.3927793521041590E+00 -0.4147977663876007E+00 + -0.4363475299441409E+00 -0.4574352629131093E+00 -0.4780675517114195E+00 -0.4982509475286878E+00 -0.5179919648788196E+00 + -0.5372970802072690E+00 -0.5561727305530091E+00 -0.5746253122642059E+00 -0.5926611797667505E+00 -0.6102866443846747E+00 + -0.6275079732115432E+00 -0.6443313880318098E+00 -0.6607630642913176E+00 -0.6768091301158876E+00 -0.6924756653771867E+00 + -0.7077687008048035E+00 -0.7226942171437692E+00 -0.7372581443564278E+00 -0.7514663608678986E+00 -0.7653246928540729E+00 + -0.7788389135713435E+00 -0.7920147427271221E+00 -0.8048578458902081E+00 -0.8173738339401606E+00 -0.8295682625548225E+00 + -0.8414466317350016E+00 -0.8530143853655495E+00 -0.8642769108119376E+00 -0.8752395385514281E+00 -0.8859075418380596E+00 + -0.8962861364005478E+00 -0.9063804801723496E+00 -0.9161956730529236E+00 -0.9257367566995721E+00 -0.9350087143488421E+00 + -0.9440164706668895E+00 -0.9527648916278635E+00 -0.9612587844196464E+00 -0.9695028973760704E+00 -0.9775019199350281E+00 + -0.9852604826214921E+00 -0.9927831570549439E+00 -0.1000074455980330E+01 -0.1007138833321882E+01 -0.1013980684259106E+01 + -0.1020604345324242E+01 -0.1027014094520476E+01 -0.1033214151460282E+01 -0.1039208677523227E+01 -0.1045001776032526E+01 + -0.1050597492449770E+01 -0.1055999814587213E+01 -0.1061212672836912E+01 -0.1066239940416186E+01 -0.1071085433628814E+01 + -0.1075752912141292E+01 -0.1080246079273645E+01 -0.1084568582304249E+01 -0.1088724012788046E+01 -0.1092715906887623E+01 + -0.1096547745716693E+01 -0.1100222955695317E+01 -0.1103744908916555E+01 -0.1107116923523791E+01 -0.1110342264098502E+01 + -0.1113424142057791E+01 -0.1116365716061343E+01 -0.1119170092427236E+01 -0.1121840325556284E+01 -0.1124379418364351E+01 + -0.1126790322722266E+01 -0.1129075939902947E+01 -0.1131239121035218E+01 -0.1133282667564084E+01 -0.1135209331716900E+01 + -0.1137021816975156E+01 -0.1138722778551496E+01 -0.1140314823871568E+01 -0.1141800513060382E+01 -0.1143182359432848E+01 + -0.1144462829988106E+01 -0.1145644345907359E+01 -0.1146729283054887E+01 -0.1147719972481915E+01 -0.1148618700933064E+01 + -0.1149427711355036E+01 -0.1150149203407336E+01 -0.1150785333974662E+01 -0.1151338217680745E+01 -0.1151809927403365E+01 + -0.1152202494790314E+01 -0.1152517910775978E+01 -0.1152758126098446E+01 -0.1152925051816752E+01 -0.1153020559828135E+01 + -0.1153046483385062E+01 -0.1153004617611814E+01 -0.1152896720020397E+01 -0.1152724511025663E+01 -0.1152489674459358E+01 + -0.1152193858082955E+01 -0.1151838674099132E+01 -0.1151425699661622E+01 -0.1150956477383416E+01 -0.1150432515843014E+01 + -0.1149855290088658E+01 -0.1149226242140391E+01 -0.1148546781489776E+01 -0.1147818285597133E+01 -0.1147042100386233E+01 + -0.1146219540736222E+01 -0.1145351890970717E+01 -0.1144440405343972E+01 -0.1143486308523956E+01 -0.1142490796072246E+01 + -0.1141455034920708E+01 -0.1140380163844745E+01 -0.1139267293933129E+01 -0.1138117509054281E+01 -0.1136931866318917E+01 + -0.1135711396538980E+01 -0.1134457104682830E+01 -0.1133169970326549E+01 -0.1131850948101341E+01 -0.1130500968136960E+01 + -0.1129120936501098E+01 -0.1127711735634675E+01 -0.1126274224782987E+01 -0.1124809240422688E+01 -0.1123317596684496E+01 + -0.1121800085771649E+01 -0.1120257478374031E+01 -0.1118690524077965E+01 -0.1117099951771584E+01 -0.1115486470045851E+01 + -0.1113850767591084E+01 -0.1112193513589038E+01 -0.1110515358100515E+01 -0.1108816932448459E+01 -0.1107098849596516E+01 + -0.1105361704523115E+01 -0.1103606074590946E+01 -0.1101832519911928E+01 -0.1100041583707593E+01 -0.1098233792664933E+01 + -0.1096409657287642E+01 -0.1094569672242852E+01 -0.1092714316703250E+01 -0.1090844054684662E+01 -0.1088959335379075E+01 + -0.1087060593483124E+01 -0.1085148249522008E+01 -0.1083222710168924E+01 -0.1081284368559944E+01 -0.1079333604604411E+01 + -0.1077370785290845E+01 -0.1075396264988352E+01 -0.1073410385743633E+01 -0.1071413477573506E+01 -0.1069405858753038E+01 + -0.1067387836099281E+01 -0.1065359705250640E+01 -0.1063321750941883E+01 -0.1061274247274852E+01 -0.1059217457984850E+01 + -0.1057151636702792E+01 -0.1055077027213080E+01 -0.1052993863707296E+01 -0.1050902371033679E+01 -0.1048802764942500E+01 + -0.1046695252327259E+01 -0.1044580031461829E+01 -0.1042457292233526E+01 -0.1040327216372171E+01 -0.1038189977675128E+01 + -0.1036045742228431E+01 -0.1033894668623957E+01 -0.1031736908172717E+01 -0.1029572605114311E+01 -0.1027401896822551E+01 + -0.1025224914007316E+01 -0.1023041780912662E+01 -0.1020852615511239E+01 -0.1018657529695029E+01 -0.1016456629462466E+01 + -0.1014250015101953E+01 -0.1012037781371852E+01 -0.1009820017676932E+01 -0.1007596808241376E+01 -0.1005368232278329E+01 + -0.1003134364156065E+01 -0.1000895273560783E+01 -0.9986510256561214E+00 -0.9964016812393415E+00 -0.9941472968943378E+00 + -0.9918879251414070E+00 -0.9896236145838693E+00 -0.9873544100515853E+00 -0.9850803527413915E+00 -0.9828014803544729E+00 + -0.9805178272307916E+00 -0.9782294244804987E+00 -0.9759363001124680E+00 -0.9736384791599416E+00 -0.9713359838033104E+00 + -0.9690288334901421E+00 -0.9667170450524106E+00 -0.9644006328210118E+00 -0.9620796087376083E+00 -0.9597539824638249E+00 + -0.9574237614878179E+00 -0.9550889512283189E+00 -0.9527495551361136E+00 -0.9504055747930490E+00 -0.9480570100085778E+00 + -0.9457038589139001E+00 -0.9433461180537021E+00 -0.9409837824755957E+00 -0.9386168458172143E+00 -0.9362453003910622E+00 + -0.9338691372671331E+00 -0.9314883463533257E+00 -0.9291029164737088E+00 -0.9267128354446561E+00 -0.9243180901489110E+00 + -0.9219186666075736E+00 -0.9195145500500918E+00 -0.9171057249822572E+00 -0.9146921752522568E+00 -0.9122738841148049E+00 + -0.9098508342934115E+00 -0.9074230080407725E+00 -0.9049903871973761E+00 -0.9025529532482975E+00 -0.9001106873782734E+00 + -0.8976635705250287E+00 -0.8952115834309455E+00 -0.8927547066930527E+00 -0.8902929208114043E+00 -0.8878262062358644E+00 + -0.8853545434113288E+00 -0.8828779128213984E+00 -0.8803962950305826E+00 -0.8779096707249944E+00 -0.8754180207516187E+00 + -0.8729213261561652E+00 -0.8704195682195257E+00 -0.8679127284928716E+00 -0.8654007888314326E+00 -0.8628837314269541E+00 + -0.8603615388388851E+00 -0.8578341940243193E+00 -0.8553016803666958E+00 -0.8527639817033201E+00 -0.8502210823517030E+00 + -0.8476729671347476E+00 -0.8451196214048268E+00 -0.8425610310667432E+00 -0.8399971825996356E+00 -0.8374280630778245E+00 + -0.8348536601906327E+00 -0.8322739622612096E+00 -0.8296889582643635E+00 -0.8270986378434532E+00 -0.8245029913263251E+00 + -0.8219020097403632E+00 -0.8192956848266297E+00 -0.8166840090531358E+00 -0.8140669756272810E+00 -0.8114445785074459E+00 + -0.8088168124137882E+00 -0.8061836728382580E+00 -0.8035451560538301E+00 -0.8009012591230101E+00 -0.7982519799055862E+00 + -0.7955973170657049E+00 -0.7929372700782288E+00 -0.7902718392344300E+00 -0.7876010256470514E+00 -0.7849248312546936E+00 + -0.7822432588256222E+00 -0.7795563119609465E+00 -0.7768639950972300E+00 -0.7741663135085275E+00 -0.7714632733078751E+00 + -0.7687548814482437E+00 -0.7660411457229735E+00 -0.7633220747657076E+00 -0.7605976780498430E+00 -0.7578679658874885E+00 + -0.7551329494280029E+00 -0.7523926406560499E+00 -0.7496470523892526E+00 -0.7468961982754271E+00 -0.7441400927894049E+00 + -0.7413787512294852E+00 -0.7386121897135014E+00 -0.7358404251745365E+00 -0.7330634753562915E+00 -0.7302813588081042E+00 + -0.7274940948796763E+00 -0.7247017037154513E+00 -0.7219042062487405E+00 -0.7191016241955283E+00 -0.7162939800480140E+00 + -0.7134812970679073E+00 -0.7106635992794407E+00 -0.7078409114621805E+00 -0.7050132591435788E+00 -0.7021806685913191E+00 + -0.6993431668054603E+00 -0.6965007815103690E+00 -0.6936535411464760E+00 -0.6908014748618515E+00 -0.6879446125036175E+00 + -0.6850829846091927E+00 -0.6822166223973989E+00 -0.6793455577594238E+00 -0.6764698232496565E+00 -0.6735894520763950E+00 + -0.6707044780924551E+00 -0.6678149357856630E+00 -0.6649208602692607E+00 -0.6620222872722230E+00 -0.6591192531294906E+00 + -0.6562117947721472E+00 -0.6532999497175199E+00 -0.6503837560592365E+00 -0.6474632524572266E+00 -0.6445384781276909E+00 + -0.6416094728330407E+00 -0.6386762768718036E+00 -0.6357389310685252E+00 -0.6327974767636543E+00 -0.6298519558034233E+00 + -0.6269024105297427E+00 -0.6239488837700962E+00 -0.6209914188274636E+00 -0.6180300594702640E+00 -0.6150648499223307E+00 + -0.6120958348529247E+00 -0.6091230593667976E+00 -0.6061465689942978E+00 -0.6031664096815428E+00 -0.6001826277806448E+00 + -0.5971952700400222E+00 -0.5942043835947710E+00 -0.5912100159571299E+00 -0.5882122150070307E+00 -0.5852110289827398E+00 + -0.5822065064716095E+00 -0.5791986964009260E+00 -0.5761876480288783E+00 -0.5731734109356420E+00 -0.5701560350145878E+00 + -0.5671355704636246E+00 -0.5641120677766707E+00 -0.5610855777352810E+00 -0.5580561514004118E+00 -0.5550238401043444E+00 + -0.5519886954427705E+00 -0.5489507692670410E+00 -0.5459101136765916E+00 -0.5428667810115466E+00 -0.5398208238455037E+00 + -0.5367722949785179E+00 -0.5337212474302724E+00 -0.5306677344334658E+00 -0.5276118094273992E+00 -0.5245535260517865E+00 + -0.5214929381407842E+00 -0.5184300997172553E+00 -0.5153650649872665E+00 -0.5122978883348268E+00 -0.5092286243168869E+00 + -0.5061573276585855E+00 -0.5030840532487656E+00 -0.5000088561357634E+00 -0.4969317915234724E+00 -0.4938529147677048E+00 + -0.4907722813728380E+00 -0.4876899469887706E+00 -0.4846059674081886E+00 -0.4815203985641517E+00 -0.4784332965280080E+00 + -0.4753447175076490E+00 -0.4722547178461055E+00 -0.4691633540205086E+00 -0.4660706826414067E+00 -0.4629767604524667E+00 + -0.4598816443305548E+00 -0.4567853912862148E+00 -0.4536880584645588E+00 -0.4505897031465675E+00 -0.4474903827508280E+00 + -0.4443901548357052E+00 -0.4412890771019746E+00 -0.4381872073959169E+00 -0.4350846037128897E+00 -0.4319813242013982E+00 + -0.4288774271676646E+00 -0.4257729710807258E+00 -0.4226680145780600E+00 -0.4195626164717658E+00 -0.4164568357553127E+00 + -0.4133507316108669E+00 -0.4102443634172216E+00 -0.4071377907583458E+00 -0.4040310734325635E+00 -0.4009242714623935E+00 + -0.3978174451050561E+00 -0.3947106548636826E+00 -0.3916039614992301E+00 -0.3884974260431417E+00 -0.3853911098107584E+00 + -0.3822850744155176E+00 -0.3791793817839579E+00 -0.3760740941715547E+00 -0.3729692741794092E+00 -0.3698649847718308E+00 + -0.3667612892948207E+00 -0.3636582514955066E+00 -0.3605559355425407E+00 -0.3574544060475049E+00 -0.3543537280873476E+00 + -0.3512539672278892E+00 -0.3481551895484317E+00 -0.3450574616675028E+00 -0.3419608507697824E+00 -0.3388654246342396E+00 + -0.3357712516635236E+00 -0.3326784009146562E+00 -0.3295869421310594E+00 -0.3264969457759724E+00 -0.3234084830672975E+00 + -0.3203216260139267E+00 -0.3172364474535990E+00 -0.3141530210923392E+00 -0.3110714215455339E+00 -0.3079917243806994E+00 + -0.3049140061619978E+00 -0.3018383444965689E+00 -0.2987648180827280E+00 -0.2956935067601084E+00 -0.2926244915618033E+00 + -0.2895578547685831E+00 -0.2864936799652645E+00 -0.2834320520992921E+00 -0.2803730575416270E+00 -0.2773167841500085E+00 + -0.2742633213346799E+00 -0.2712127601266646E+00 -0.2681651932486745E+00 -0.2651207151887529E+00 -0.2620794222767396E+00 + -0.2590414127636577E+00 -0.2560067869041315E+00 -0.2529756470419290E+00 -0.2499480976987507E+00 -0.2469242456663659E+00 + -0.2439042001022238E+00 -0.2408880726286486E+00 -0.2378759774357503E+00 -0.2348680313881797E+00 -0.2318643541358485E+00 + -0.2288650682287657E+00 -0.2258702992361172E+00 -0.2228801758697354E+00 -0.2198948301121145E+00 -0.2169143973491063E+00 + -0.2139390165074705E+00 -0.2109688301974238E+00 -0.2080039848603569E+00 -0.2050446309218908E+00 -0.2020909229504274E+00 + -0.1991430198213881E+00 -0.1962010848872974E+00 -0.1932652861539021E+00 -0.1903357964625070E+00 -0.1874127936787024E+00 + -0.1844964608876812E+00 -0.1815869865963202E+00 -0.1786845649422172E+00 -0.1757893959098759E+00 -0.1729016855542115E+00 + -0.1700216462315742E+00 -0.1671494968384586E+00 -0.1642854630580883E+00 -0.1614297776150348E+00 -0.1585826805380398E+00 + -0.1557444194312012E+00 -0.1529152497536538E+00 -0.1500954351078926E+00 -0.1472852475368416E+00 -0.1444849678297712E+00 + -0.1416948858371486E+00 -0.1389153007944590E+00 -0.1361465216550372E+00 -0.1333888674318927E+00 -0.1306426675484822E+00 + -0.1279082621983536E+00 -0.1251860027135053E+00 -0.1224762519412908E+00 -0.1197793846295987E+00 -0.1170957878199916E+00 + -0.1144258612484021E+00 -0.1117700177528869E+00 -0.1091286836878541E+00 -0.1065022993440523E+00 -0.1038913193734918E+00 + -0.1012962132183315E+00 -0.9871746554259221E-01 -0.9615557666540349E-01 -0.9361106299427452E-01 -0.9108445745667579E-01 + -0.8857630992797585E-01 -0.8608718765349675E-01 -0.8361767566217436E-01 -0.8116837716895883E-01 -0.7873991396273913E-01 + -0.7633292677617219E-01 -0.7394807563333809E-01 -0.7158604017067217E-01 -0.6924751992606029E-01 -0.6693323459041152E-01 + -0.6464392421534722E-01 -0.6238034936994107E-01 -0.6014329123865809E-01 -0.5793355165176966E-01 -0.5575195303860343E-01 + -0.5359933829294623E-01 -0.5147657053882339E-01 -0.4938453278367397E-01 -0.4732412744463571E-01 -0.4529627573227194E-01 + -0.4330191687455879E-01 -0.4134200716236433E-01 -0.3941751879595017E-01 -0.3752943851022626E-01 -0.3567876595462575E-01 + -0.3386651180149903E-01 -0.3209369555493235E-01 -0.3036134302986153E-01 -0.2867048346931652E-01 -0.2702214626567594E-01 + -0.2541735724993743E-01 -0.2385713451135265E-01 -0.2234248370839688E-01 -0.2087439283106441E-01 -0.1945382637408551E-01 + -0.1808171888098112E-01 -0.1675896782019106E-01 -0.1548642575704695E-01 -0.1426489178948888E-01 -0.1309510222150092E-01 + -0.1197772045673314E-01 -0.1091332610623831E-01 -0.9902403319266216E-02 -0.8945328365362132E-02 -0.8042356520369600E-02 + -0.7193608339198911E-02 -0.6399055435312237E-02 -0.5658505931682774E-02 -0.4971589801402351E-02 -0.4337744378844948E-02 + -0.3756200394787513E-02 -0.3225968971126078E-02 -0.2745830102014657E-02 -0.2314323246553361E-02 -0.1929740760130854E-02 + -0.1590124991640147E-02 -0.1293269963677403E-02 -0.1036728620523732E-02 -0.8178266578560640E-03 -0.6336839173092652E-03 + -0.4812442114554411E-03 -0.3573142088885663E-03 -0.2586116204308245E-03 -0.1818223529741868E-03 -0.1236655132753167E-03 + -0.8096414791917507E-04 -0.5071843506793948E-04 -0.3017679859046307E-04 -0.1689928305171012E-04 -0.8806800438416483E-05 + -0.4209924174242123E-05 -0.1812186230608453E-05 -0.6856430207874943E-06 -0.2207762234777510E-06 -0.5789808120346374E-07 + -0.1162764438867681E-07 -0.1636092194626611E-08 -0.1411469196261160E-09 -0.6053864648970130E-11 -0.9102103938482552E-13 + -0.2557695550579744E-15 -0.3818161159862620E-19 -0.1608640056516381E-25 -0.2867908542943528E-38 -0.1639405452192707E-76 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.1490972894185426E+01 0.2898594369705328E+01 0.4226102647398204E+01 0.5476628578286624E+01 + 0.6653199649346901E+01 0.7758744314426550E+01 0.8796096630727330E+01 0.9768001136837229E+01 0.1067711788189623E+02 + 0.1152602750277483E+02 0.1231723624359168E+02 0.1305318081663842E+02 0.1373623301352756E+02 0.1436870398832137E+02 + 0.1495284814912227E+02 0.1549086661002188E+02 0.1598491017060163E+02 0.1643708180475745E+02 0.1684943865406904E+02 + 0.1722399353297733E+02 0.1756271596351480E+02 0.1786753276618034E+02 0.1814032824076472E+02 0.1838294397656276E+02 + 0.1859717833554092E+02 0.1878478565478038E+02 0.1894747521601122E+02 0.1908691003043678E+02 0.1920470548645839E+02 + 0.1930242790649218E+02 0.1938159305696006E+02 0.1944366465286470E+02 0.1949005289524725E+02 0.1952211307638757E+02 + 0.1954114428394226E+02 0.1954838823141548E+02 0.1954502823850324E+02 0.1953218838101044E+02 0.1951093282627426E+02 + 0.1948226536638306E+02 0.1944712915800228E+02 0.1940640667433629E+02 0.1936091987169615E+02 0.1931143057032402E+02 + 0.1925864104655939E+02 0.1920319483112569E+02 0.1914567770627270E+02 0.1908661889272693E+02 0.1902649241587448E+02 + 0.1896571863932183E+02 0.1890466595293786E+02 0.1884365260166379E+02 0.1878294864077429E+02 0.1872277800286541E+02 + 0.1866332066162236E+02 0.1860471487736171E+02 0.1854705950943718E+02 0.1849041638082738E+02 0.1843481268057272E+02 + 0.1838024339018270E+02 0.1832667372067947E+02 0.1827404154756324E+02 0.1822225983166999E+02 0.1817121901462569E+02 + 0.1812078937837576E+02 0.1807082335907063E+02 0.1802115780640943E+02 0.1797161618037463E+02 0.1792201067812283E+02 + 0.1787214428462332E+02 0.1782181274145043E+02 0.1777080642893208E+02 0.1771891215763021E+02 0.1766591486587512E+02 + 0.1761159922079143E+02 0.1755575112093501E+02 0.1749815909930632E+02 0.1743861562611338E+02 0.1737691831122648E+02 + 0.1731287100679569E+02 0.1724628481099027E+02 0.1717697897426687E+02 0.1710478170998087E+02 0.1702953091152244E+02 + 0.1695107477848783E+02 0.1686927235468663E+02 0.1678399398103932E+02 0.1669512166663813E+02 0.1660254938142798E+02 + 0.1650618327411663E+02 0.1640594181904419E+02 0.1630175589583457E+02 0.1619356880571659E+02 0.1608133622844232E+02 + 0.1596502612374653E+02 0.1584461858128563E+02 0.1572010562296940E+02 0.1559149096155470E+02 0.1545878971931102E+02 + 0.1532202811049239E+02 0.1518124309126241E+02 0.1503648198061937E+02 0.1488780205575875E+02 0.1473527012519185E+02 + 0.1457896208281294E+02 0.1441896244597594E+02 0.1425536388050388E+02 0.1408826671541400E+02 0.1391777844999757E+02 + 0.1374401325574798E+02 0.1356709147548415E+02 0.1338713912187045E+02 0.1320428737738750E+02 0.1301867209766444E+02 + 0.1283043331994052E+02 0.1263971477828357E+02 0.1244666342705594E+02 0.1225142897398476E+02 0.1205416342406364E+02 + 0.1185502063538666E+02 0.1165415588789458E+02 0.1145172546589620E+02 0.1124788625511554E+02 0.1104279535490879E+02 + 0.1083660970619294E+02 0.1062948573553064E+02 0.1042157901572463E+02 0.1021304394318828E+02 0.1000403343227721E+02 + 0.9794698626690922E+01 0.9585188627981971E+01 0.9375650241143855E+01 0.9166227737187679E+01 0.8957062632560726E+01 + 0.8748293485208164E+01 0.8540055707031815E+01 0.8332481392456542E+01 0.8125699162775922E+01 0.7919834025914198E+01 + 0.7715007251210231E+01 0.7511336258802102E+01 0.7308934523167021E+01 0.7107911490350968E+01 0.6908372508405361E+01 + 0.6710418770533413E+01 0.6514147270438017E+01 0.6319650769353934E+01 0.6127017774240882E+01 0.5936332526610492E+01 + 0.5747675001458052E+01 0.5561120915770464E+01 0.5376741746084129E+01 0.5194604754569927E+01 0.5014773023128366E+01 + 0.4837305494984530E+01 0.4662257023280675E+01 0.4489678426173787E+01 0.4319616547955467E+01 0.4152114325723103E+01 + 0.3987210861143229E+01 0.3824941496860732E+01 0.3665337897121076E+01 0.3508428132186630E+01 0.3354236766142388E+01 + 0.3202784947701370E+01 0.3054090503634531E+01 0.2908168034465503E+01 0.2765029012085665E+01 0.2624681878960210E+01 + 0.2487132148611466E+01 0.2352382507080828E+01 0.2220432915085888E+01 0.2091280710604522E+01 0.1964920711632258E+01 + 0.1841345318874233E+01 0.1720544618147173E+01 0.1602506482281042E+01 0.1487216672323735E+01 0.1374658937865809E+01 + 0.1264815116314972E+01 0.1157665230963353E+01 0.1053187587702279E+01 0.9513588702517990E+00 0.8521542337834218E+00 + 0.7555473968256491E+00 0.6615107313528323E+00 0.5700153509680036E+00 0.4810311971000716E+00 0.3945271231455855E+00 + 0.3104709764939235E+00 0.2288296783834506E+00 0.1495693015446019E+00 0.7265514559315535E-01 -0.1948189855172862E-02 + -0.7427673437111640E-01 -0.1443670782148313E+00 -0.2122563061647371E+00 -0.2779819336760306E+00 -0.3415818453668393E+00 + -0.4030942358252462E+00 -0.4625575527254874E+00 -0.5200104422372566E+00 -0.5754916967079484E+00 -0.6290402045940768E+00 + -0.6806949026143181E+00 -0.7304947300937417E+00 -0.7784785854658435E+00 -0.8246852848961586E+00 -0.8691535229891830E+00 + -0.9119218355379459E+00 -0.9530285642737767E+00 -0.9925118235722190E+00 -0.1030409469069388E+01 -0.1066759068142054E+01 + -0.1101597872203433E+01 -0.1134962790765932E+01 -0.1166890367221378E+01 -0.1197416756288568E+01 -0.1226577703077706E+01 + -0.1254408523721037E+01 -0.1280944087518682E+01 -0.1306218800548890E+01 -0.1330266590691901E+01 -0.1353120894016819E+01 + -0.1374814642481296E+01 -0.1395380252894130E+01 -0.1414849617091440E+01 -0.1433254093277628E+01 -0.1450624498482941E+01 + -0.1466991102090209E+01 -0.1482383620384031E+01 -0.1496831212076521E+01 -0.1510362474764622E+01 -0.1523005442274803E+01 + -0.1534787582851975E+01 -0.1545735798150416E+01 -0.1555876422985430E+01 -0.1565235225805577E+01 -0.1573837409846275E+01 + -0.1581707614926664E+01 -0.1588869919852685E+01 -0.1595347845390397E+01 -0.1601164357774630E+01 -0.1606341872719178E+01 + -0.1610902259895794E+01 -0.1614866847850344E+01 -0.1618256429325549E+01 -0.1621091266960840E+01 -0.1623391099340840E+01 + -0.1625175147365167E+01 -0.1626462120913114E+01 -0.1627270225777996E+01 -0.1627617170846768E+01 -0.1627520175501631E+01 + -0.1626995977221341E+01 -0.1626060839360731E+01 -0.1624730559088164E+01 -0.1623020475461238E+01 -0.1620945477622288E+01 + -0.1618520013095815E+01 -0.1615758096171077E+01 -0.1612673316353719E+01 -0.1609278846871282E+01 -0.1605587453218097E+01 + -0.1601611501725963E+01 -0.1597362968147642E+01 -0.1592853446240992E+01 -0.1588094156342277E+01 -0.1583095953917781E+01 + -0.1577869338083636E+01 -0.1572424460084281E+01 -0.1566771131720695E+01 -0.1560918833720039E+01 -0.1554876724038992E+01 + -0.1548653646093535E+01 -0.1542258136908566E+01 -0.1535698435181091E+01 -0.1528982489251385E+01 -0.1522117964976844E+01 + -0.1515112253503763E+01 -0.1507972478932725E+01 -0.1500705505873594E+01 -0.1493317946886631E+01 -0.1485816169806484E+01 + -0.1478206304946291E+01 -0.1470494252179348E+01 -0.1462685687896228E+01 -0.1454786071835450E+01 -0.1446800653786156E+01 + -0.1438734480161472E+01 -0.1430592400441542E+01 -0.1422379073485444E+01 -0.1414098973711402E+01 -0.1405756397145003E+01 + -0.1397355467335255E+01 -0.1388900141138563E+01 -0.1380394214370867E+01 -0.1371841327328378E+01 -0.1363244970177461E+01 + -0.1354608488214437E+01 -0.1345935086996126E+01 -0.1337227837342175E+01 -0.1328489680210275E+01 -0.1319723431445484E+01 + -0.1310931786405037E+01 -0.1302117324460026E+01 -0.1293282513375510E+01 -0.1284429713570631E+01 -0.1275561182260429E+01 + -0.1266679077481073E+01 -0.1257785462000340E+01 -0.1248882307115163E+01 -0.1239971496338172E+01 -0.1231054828975166E+01 + -0.1222134023595495E+01 -0.1213210721397372E+01 -0.1204286489470143E+01 -0.1195362823955608E+01 -0.1186441153110434E+01 + -0.1177522840271803E+01 -0.1168609186728368E+01 -0.1159701434498662E+01 -0.1150800769019061E+01 -0.1141908321743441E+01 + -0.1133025172656630E+01 -0.1124152352703810E+01 -0.1115290846137928E+01 -0.1106441592787264E+01 -0.1097605490245227E+01 + -0.1088783395984451E+01 -0.1079976129397275E+01 -0.1071184473764625E+01 -0.1062409178155359E+01 -0.1053650959258049E+01 + -0.1044910503147221E+01 -0.1036188466985990E+01 -0.1027485480667053E+01 -0.1018802148393944E+01 -0.1010139050204464E+01 + -0.1001496743438119E+01 -0.9928757641494527E+00 -0.9842766284690484E+00 -0.9756998339140143E+00 -0.9671458606496940E+00 + -0.9586151727043447E+00 -0.9501082191384856E+00 -0.9416254351705762E+00 -0.9331672432606939E+00 -0.9247340541538072E+00 + -0.9163262678842421E+00 -0.9079442747428956E+00 -0.8995884562087340E+00 -0.8912591858460664E+00 -0.8829568301690750E+00 + -0.8746817494750385E+00 -0.8664342986476723E+00 -0.8582148279319598E+00 -0.8500236836818522E+00 -0.8418612090821510E+00 + -0.8337277448458742E+00 -0.8256236298884094E+00 -0.8175492019796625E+00 -0.8095047983754566E+00 -0.8014907564293513E+00 + -0.7935074141860654E+00 -0.7855551109576326E+00 -0.7776341878834073E+00 -0.7697449884750045E+00 -0.7618878591472366E+00 + -0.7540631497360738E+00 -0.7462712140046344E+00 -0.7385124101381848E+00 -0.7307871012290940E+00 -0.7230956557526664E+00 + -0.7154384480347357E+00 -0.7078158587119011E+00 -0.7002282751852088E+00 -0.6926760920681024E+00 -0.6851597116293913E+00 + -0.6776795442319780E+00 -0.6702360087680368E+00 -0.6628295330912921E+00 -0.6554605544470310E+00 -0.6481295199004043E+00 + -0.6408368867635551E+00 -0.6335831230220497E+00 -0.6263687077610380E+00 -0.6191941315915128E+00 -0.6120598970769715E+00 + -0.6049665191607240E+00 -0.5979145255940220E+00 -0.5909044573650831E+00 -0.5839368691290320E+00 -0.5770123296386506E+00 + -0.5701314221757601E+00 -0.5632947449829158E+00 -0.5565029116949882E+00 -0.5497565517700718E+00 -0.5430563109189926E+00 + -0.5364028515325477E+00 -0.5297968531054059E+00 -0.5232390126554224E+00 -0.5167300451368810E+00 -0.5102706838459522E+00 + -0.5038616808163805E+00 -0.4975038072031411E+00 -0.4911978536514589E+00 -0.4849446306482554E+00 -0.4787449688526985E+00 + -0.4725997194020929E+00 -0.4665097541888966E+00 -0.4604759661041344E+00 -0.4544992692419215E+00 -0.4485805990591846E+00 + -0.4427209124840173E+00 -0.4369211879653461E+00 -0.4311824254558134E+00 -0.4255056463188713E+00 -0.4198918931501576E+00 + -0.4143422295021775E+00 -0.4088577395001772E+00 -0.4034395273358983E+00 -0.3980887166245596E+00 -0.3928064496090112E+00 + -0.3875938861934557E+00 -0.3824522027875051E+00 -0.3773825909395854E+00 -0.3723862557368422E+00 -0.3674644139467203E+00 + -0.3626182918733373E+00 -0.3578491228995945E+00 -0.3531581446837392E+00 -0.3485465959768078E+00 -0.3440157130250673E+00 + -0.3395667255192788E+00 -0.3352008520504021E+00 -0.3309192950292724E+00 -0.3267232350259450E+00 -0.3226138244828918E+00 + -0.3185921807551977E+00 -0.3146593784305226E+00 -0.3108164408820478E+00 -0.3070643310091922E+00 -0.3034039411238457E+00 + -0.2998360819446073E+00 -0.2963614706684425E+00 -0.2929807180988327E+00 -0.2896943148224383E+00 -0.2865026164432708E+00 + -0.2834058279051005E+00 -0.2804039869602682E+00 -0.2774969468771566E+00 -0.2746843585203667E+00 -0.2719656519882723E+00 + -0.2693400180531267E+00 -0.2668063897203013E+00 -0.2643634243062732E+00 -0.2620094865300300E+00 -0.2597426332192892E+00 + -0.2575606003500299E+00 -0.2554607932624695E+00 -0.2534402810239623E+00 -0.2514957960316366E+00 -0.2496237400535760E+00 + -0.2478201979810306E+00 -0.2460809605838598E+00 -0.2444015574991944E+00 -0.2427773015044900E+00 -0.2412033447902379E+00 + -0.2396747474109387E+00 -0.2381865573144384E+00 -0.2367339003009647E+00 -0.2353120769446503E+00 -0.2339166619743637E+00 + -0.2325435999910598E+00 -0.2311892899420583E+00 -0.2298506498591054E+00 -0.2285251535007102E+00 -0.2272108322697357E+00 + -0.2259062395150722E+00 -0.2246103800296458E+00 -0.2233226143482858E+00 -0.2220425533758296E+00 -0.2207699612307818E+00 + -0.2195046807982463E+00 -0.2182465877415019E+00 -0.2169955687347858E+00 -0.2157515141286527E+00 -0.2145143163564465E+00 + -0.2132838697320672E+00 -0.2120600704271507E+00 -0.2108428164580473E+00 -0.2096320076725845E+00 -0.2084275457364440E+00 + -0.2072293341191706E+00 -0.2060372780798283E+00 -0.2048512846523208E+00 -0.2036712626303956E+00 -0.2024971225523388E+00 + -0.2013287766853885E+00 -0.2001661390098699E+00 -0.1990091252030775E+00 -0.1978576526229085E+00 -0.1967116402912710E+00 + -0.1955710088772761E+00 -0.1944356806802258E+00 -0.1933055796124141E+00 -0.1921806311817510E+00 -0.1910607624742264E+00 + -0.1899459021362168E+00 -0.1888359803566597E+00 -0.1877309288490946E+00 -0.1866306808335939E+00 -0.1855351710185818E+00 + -0.1844443355825659E+00 -0.1833581121557800E+00 -0.1822764398017569E+00 -0.1811992589988340E+00 -0.1801265116216080E+00 + -0.1790581409223451E+00 -0.1779940915123532E+00 -0.1769343093433298E+00 -0.1758787416886912E+00 -0.1748273371248939E+00 + -0.1737800455127509E+00 -0.1727368179787582E+00 -0.1716976068964338E+00 -0.1706623658676789E+00 -0.1696310497041661E+00 + -0.1686036144087650E+00 -0.1675800171570109E+00 -0.1665602162786198E+00 -0.1655441712390600E+00 -0.1645318426211851E+00 + -0.1635231921069348E+00 -0.1625181824591057E+00 -0.1615167775032033E+00 -0.1605189421093761E+00 -0.1595246421744391E+00 + -0.1585338446039885E+00 -0.1575465172946173E+00 -0.1565626291162327E+00 -0.1555821498944797E+00 -0.1546050503932762E+00 + -0.1536313022974632E+00 -0.1526608781955763E+00 -0.1516937515627348E+00 -0.1507298967436624E+00 -0.1497692889358336E+00 + -0.1488119041727559E+00 -0.1478577193073842E+00 -0.1469067119956771E+00 -0.1459588606802934E+00 -0.1450141445744331E+00 + -0.1440725436458233E+00 -0.1431340386008554E+00 -0.1421986108688733E+00 -0.1412662425866119E+00 -0.1403369165827954E+00 + -0.1394106163628882E+00 -0.1384873260940094E+00 -0.1375670305900030E+00 -0.1366497152966734E+00 -0.1357353662771839E+00 + -0.1348239701976193E+00 -0.1339155143127141E+00 -0.1330099864517488E+00 -0.1321073750046149E+00 -0.1312076689080463E+00 + -0.1303108576320237E+00 -0.1294169311663473E+00 -0.1285258800073831E+00 -0.1276376951449777E+00 -0.1267523680495491E+00 + -0.1258698906593478E+00 -0.1249902553678929E+00 -0.1241134550115789E+00 -0.1232394828574590E+00 -0.1223683325912011E+00 + -0.1214999983052166E+00 -0.1206344744869641E+00 -0.1197717560074267E+00 -0.1189118381097634E+00 -0.1180547163981319E+00 + -0.1172003868266877E+00 -0.1163488456887531E+00 -0.1155000896061621E+00 -0.1146541155187737E+00 -0.1138109206741603E+00 + -0.1129705026174663E+00 -0.1121328591814367E+00 -0.1112979884766172E+00 -0.1104658888817227E+00 -0.1096365590341772E+00 + -0.1088099978208190E+00 -0.1079862043687761E+00 -0.1071651780365066E+00 -0.1063469184050076E+00 -0.1055314252691870E+00 + -0.1047186986294014E+00 -0.1039087386831581E+00 -0.1031015458169785E+00 -0.1022971205984247E+00 -0.1014954637682864E+00 + -0.1006965762329294E+00 -0.9990045905680092E-01 -0.9910711345509600E-01 -0.9831654078657849E-01 -0.9752874254656095E-01 + -0.9674372036003734E-01 -0.9596147597497186E-01 -0.9518201125574054E-01 -0.9440532817672517E-01 -0.9363142881605759E-01 + -0.9286031534951537E-01 -0.9209199004456679E-01 -0.9132645525456264E-01 -0.9056371341307594E-01 -0.8980376702838780E-01 + -0.8904661867811879E-01 -0.8829227100400254E-01 -0.8754072670680409E-01 -0.8679198854137972E-01 -0.8604605931187735E-01 + -0.8530294186707681E-01 -0.8456263909586934E-01 -0.8382515392287562E-01 -0.8309048930419941E-01 -0.8235864822331807E-01 + -0.8162963368710800E-01 -0.8090344872200475E-01 -0.8018009637029486E-01 -0.7945957968654156E-01 -0.7874190173414135E-01 + -0.7802706558201103E-01 -0.7731507430140443E-01 -0.7660593096285831E-01 -0.7589963863326689E-01 -0.7519620037308256E-01 + -0.7449561923364434E-01 -0.7379789825463164E-01 -0.7310304046164423E-01 -0.7241104886390530E-01 -0.7172192645209033E-01 + -0.7103567619627764E-01 -0.7035230104402376E-01 -0.6967180391855922E-01 -0.6899418771710759E-01 -0.6831945530932572E-01 + -0.6764760953586510E-01 -0.6697865320705315E-01 -0.6631258910169627E-01 -0.6564941996600249E-01 -0.6498914851262336E-01 + -0.6433177741981720E-01 -0.6367730933073025E-01 -0.6302574685279916E-01 -0.6237709255727147E-01 -0.6173134897884694E-01 + -0.6108851861543815E-01 -0.6044860392805121E-01 -0.5981160734078578E-01 -0.5917753124095684E-01 -0.5854637797933600E-01 + -0.5791814987051506E-01 -0.5729284919339011E-01 -0.5667047819176833E-01 -0.5605103907509822E-01 -0.5543453401932198E-01 + -0.5482096516785345E-01 -0.5421033463268072E-01 -0.5360264449559476E-01 -0.5299789680954505E-01 -0.5239609360012387E-01 + -0.5179723686717961E-01 -0.5120132858656160E-01 -0.5060837071199547E-01 -0.5001836517709381E-01 -0.4943131389750106E-01 + -0.4884721877317583E-01 -0.4826608169081145E-01 -0.4768790452639723E-01 -0.4711268914792258E-01 -0.4654043741822612E-01 + -0.4597115119799098E-01 -0.4540483234889028E-01 -0.4484148273688456E-01 -0.4428110423567344E-01 -0.4372369873030461E-01 + -0.4316926812094350E-01 -0.4261781432680625E-01 -0.4206933929025882E-01 -0.4152384498108628E-01 -0.4098133340093556E-01 + -0.4044180658793538E-01 -0.3990526662149652E-01 -0.3937171562729746E-01 -0.3884115578245902E-01 -0.3831358932091222E-01 + -0.3778901853896358E-01 -0.3726744580106369E-01 -0.3674887354578273E-01 -0.3623330429199824E-01 -0.3572074064530062E-01 + -0.3521118530462180E-01 -0.3470464106909250E-01 -0.3420111084513349E-01 -0.3370059765378802E-01 -0.3320310463829990E-01 + -0.3270863507194550E-01 -0.3221719236612464E-01 -0.3172878007871772E-01 -0.3124340192271698E-01 -0.3076106177513717E-01 + -0.3028176368621473E-01 -0.2980551188890199E-01 -0.2933231080866432E-01 -0.2886216507358872E-01 -0.2839507952481046E-01 + -0.2793105922726807E-01 -0.2747010948079293E-01 -0.2701223583154306E-01 -0.2655744408378990E-01 -0.2610574031206566E-01 + -0.2565713087368143E-01 -0.2521162242162311E-01 -0.2476922191783597E-01 -0.2432993664690480E-01 -0.2389377423013912E-01 + -0.2346074264007272E-01 -0.2303085021538444E-01 -0.2260410567625017E-01 -0.2218051814013276E-01 -0.2176009713801780E-01 + -0.2134285263110349E-01 -0.2092879502794953E-01 -0.2051793520209298E-01 -0.2011028451013516E-01 -0.1970585481030489E-01 + -0.1930465848150186E-01 -0.1890670844282149E-01 -0.1851201817356444E-01 -0.1812060173372857E-01 -0.1773247378498237E-01 + -0.1734764961211651E-01 -0.1696614514496612E-01 -0.1658797698079692E-01 -0.1621316240714285E-01 -0.1584171942508113E-01 + -0.1547366677292802E-01 -0.1510902395033159E-01 -0.1474781124273767E-01 -0.1439004974619603E-01 -0.1403576139247217E-01 + -0.1368496897442080E-01 -0.1333769617157242E-01 -0.1299396757587675E-01 -0.1265380871753636E-01 -0.1231724609085785E-01 + -0.1198430718003442E-01 -0.1165502048476427E-01 -0.1132941554559642E-01 -0.1100752296888000E-01 -0.1068937445118038E-01 + -0.1037500280300520E-01 -0.1006444197166726E-01 -0.9757727063089234E-02 -0.9454894362331736E-02 -0.9155981352602857E-02 + -0.8861026732477590E-02 -0.8570070431026370E-02 -0.8283153620518910E-02 -0.8000318726330972E-02 -0.7721609433644288E-02 + -0.7447070690483597E-02 -0.7176748706588126E-02 -0.6910690947562739E-02 -0.6648946123695469E-02 -0.6391564172768492E-02 + -0.6138596236119977E-02 -0.5890094627143023E-02 -0.5646112791328837E-02 -0.5406705256875357E-02 -0.5171927574793084E-02 + -0.4941836247340325E-02 -0.4716488643516831E-02 -0.4495942900234213E-02 -0.4280257807663031E-02 -0.4069492677135494E-02 + -0.3863707189852578E-02 -0.3662961224513759E-02 -0.3467314661850819E-02 -0.3276827163911870E-02 -0.3091557925807099E-02 + -0.2911565397496689E-02 -0.2736906973081798E-02 -0.2567638644951017E-02 -0.2403814620049312E-02 -0.2245486895479086E-02 + -0.2092704790623673E-02 -0.1945514433017997E-02 -0.1803958195289058E-02 -0.1668074080673803E-02 -0.1537895054912087E-02 + -0.1413448322734187E-02 -0.1294754547748605E-02 -0.1181827015318322E-02 -0.1074670739037643E-02 -0.9732815127318119E-03 + -0.8776449115510747E-03 -0.7877352477807324E-03 -0.7035144894988547E-03 -0.6249311532533495E-03 -0.5519191855637202E-03 + -0.4843968523409821E-03 -0.4222656603112821E-03 -0.3654093402469373E-03 -0.3136929282422736E-03 -0.2669619883460904E-03 + -0.2250420274226155E-03 -0.1877381608793739E-03 -0.1548350954324305E-03 -0.1260975017208530E-03 -0.1012708544007759E-03 + -0.8008281908161370E-04 -0.6224526246190971E-04 -0.4745695222159778E-04 -0.3540699419800758E-04 -0.2577902344419184E-04 + -0.1825612034243538E-04 -0.1252636105889374E-04 -0.8288832859917125E-05 -0.5259851630896392E-05 -0.3179018438370757E-05 + -0.1814657830647114E-05 -0.9681145896094296E-06 -0.4763777092066571E-06 -0.2125847804801365E-06 -0.8416563922630169E-07 + -0.2871694661282378E-07 -0.8118483409326055E-08 -0.1800875019886702E-08 -0.2899912795055122E-09 -0.3021521412802248E-10 + -0.1705617717949463E-11 -0.3905505511147667E-13 -0.2187979755795985E-15 -0.1136823060733138E-18 -0.6529908184057616E-24 + -0.1331494455842040E-33 -0.1332533824576676E-57 -0.3518780789111388E-217 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.2980561953329615E-01 0.5916214233164482E-01 0.8807376775591262E-01 0.1165446070923979E+00 + 0.1445785896945104E+00 0.1721793127131528E+00 0.1993498372288393E+00 0.2260924395124203E+00 0.2524083296657185E+00 + 0.2782973516026372E+00 0.3037576786932059E+00 0.3287855187856478E+00 0.3533748410476745E+00 0.3775171353675275E+00 + 0.4012012131151563E+00 0.4244130560281678E+00 0.4471357179640750E+00 0.4693492823288160E+00 0.4910308762069837E+00 + 0.5121547406179706E+00 0.5326923549257166E+00 0.5526126122474077E+00 0.5718820417388514E+00 0.5904650728749644E+00 + 0.6083243362816283E+00 0.6254209952953163E+00 0.6417151022124156E+00 0.6571659731229090E+00 0.6717325752842186E+00 + 0.6853739211620790E+00 0.6980494635281584E+00 0.7097194863416821E+00 0.7203454865385274E+00 0.7298905422913191E+00 + 0.7383196637747241E+00 0.7456001229593330E+00 0.7517017594547573E+00 0.7565972599187180E+00 0.7602624090360081E+00 + 0.7626763105428430E+00 0.7638215772227638E+00 0.7636844892256079E+00 0.7622551204578512E+00 0.7595274331582714E+00 + 0.7554993411058685E+00 0.7501727422062439E+00 0.7435535214678834E+00 0.7356515256112056E+00 0.7264805107514307E+00 + 0.7160580647622865E+00 0.7044055060626673E+00 0.6915477606740609E+00 0.6775132194747052E+00 0.6623335776287783E+00 + 0.6460436581976104E+00 0.6286812219467698E+00 0.6102867653501249E+00 0.5909033087616116E+00 0.5705761766794121E+00 + 0.5493527719676207E+00 0.5272823458290659E+00 0.5044157652415996E+00 0.4808052794806210E+00 0.4565042872543610E+00 + 0.4315671058772241E+00 0.4060487438014351E+00 0.3800046777198434E+00 0.3534906353440669E+00 0.3265623848532687E+00 + 0.2992755319008061E+00 0.2716853249594787E+00 0.2438464696819385E+00 0.2158129528517275E+00 0.1876378764027582E+00 + 0.1593733018915083E+00 0.1310701057169563E+00 0.1027778452988341E+00 0.7454463634517153E-01 0.4641704126567402E-01 + 0.1843996871823178E-01 -0.9343415788128404E-02 -0.3689176836917064E-01 -0.6416563450906662E-01 -0.9112750630870141E-01 + -0.1177418695188684E+00 -0.1439752406767907E+00 -0.1697961946978080E+00 -0.1951753833029356E+00 -0.2200855446874273E+00 + -0.2445015048556650E+00 -0.2684001710639848E+00 -0.2917605178254852E+00 -0.3145635659398817E+00 -0.3367923550171064E+00 + -0.3584319099660255E+00 -0.3794692019194473E+00 -0.3998931040638364E+00 -0.4196943428370452E+00 -0.4388654449501550E+00 + -0.4574006806803239E+00 -0.4752960038707706E+00 -0.4925489890615999E+00 -0.5091587661615586E+00 -0.5251259530560686E+00 + -0.5404525865310800E+00 -0.5551420518758782E+00 -0.5691990115107658E+00 -0.5826293329679667E+00 -0.5954400165361110E+00 + -0.6076391228604799E+00 -0.6192357007728714E+00 -0.6302397156066638E+00 -0.6406619782344070E+00 -0.6505140750472834E+00 + -0.6598082990779603E+00 -0.6685575824509672E+00 -0.6767754303275997E+00 -0.6844758564958461E+00 -0.6916733207396428E+00 + -0.6983826681062417E+00 -0.7046190701754369E+00 -0.7103979684200303E+00 -0.7157350197331149E+00 -0.7206460441846081E+00 + -0.7251469750570049E+00 -0.7292538111984742E+00 -0.7329825717202728E+00 -0.7363492530549652E+00 -0.7393697883820587E+00 + -0.7420600094185869E+00 -0.7444356105635324E+00 -0.7465121153771925E+00 -0.7483048453692615E+00 -0.7498288910627880E+00 + -0.7510990852950691E+00 -0.7521299787110952E+00 -0.7529358174001737E+00 -0.7535305226219949E+00 -0.7539276725644879E+00 + -0.7541404860724225E+00 -0.7541818082827765E+00 -0.7540640981003759E+00 -0.7537994174452843E+00 -0.7533994222016963E+00 + -0.7528753547968463E+00 -0.7522380383374159E+00 -0.7514978722304342E+00 -0.7506648292152125E+00 -0.7497484537329505E+00 + -0.7487578615608312E+00 -0.7477017406379203E+00 -0.7465883530109418E+00 -0.7454255378288276E+00 -0.7442207153161546E+00 + -0.7429808916567682E+00 -0.7417126647203566E+00 -0.7404222305663006E+00 -0.7391153906607812E+00 -0.7377975597449168E+00 + -0.7364737742936068E+00 -0.7351487015066457E+00 -0.7338266487757376E+00 -0.7325115735730846E+00 -0.7312070937093148E+00 + -0.7299164979106890E+00 -0.7286427566676440E+00 -0.7273885333088894E+00 -0.7261561952575059E+00 -0.7249478254275804E+00 + -0.7237652337221139E+00 -0.7226099685950527E+00 -0.7214833286424112E+00 -0.7203863741895169E+00 -0.7193199388434760E+00 + -0.7182846409819289E+00 -0.7172808951511491E+00 -0.7163089233484455E+00 -0.7153687661656919E+00 -0.7144602937725963E+00 + -0.7135832167201219E+00 -0.7127370965461225E+00 -0.7119213561669281E+00 -0.7111352900401826E+00 -0.7103780740857679E+00 + -0.7096487753530824E+00 -0.7089463614243792E+00 -0.7082697095451826E+00 -0.7076176154740552E+00 -0.7069888020452744E+00 + -0.7063819274390548E+00 -0.7057955931550737E+00 -0.7052283516861344E+00 -0.7046787138897004E+00 -0.7041451560560322E+00 + -0.7036261266724787E+00 -0.7031200528842719E+00 -0.7026253466530071E+00 -0.7021404106145906E+00 -0.7016636436391807E+00 + -0.7011934460961990E+00 -0.7007282248280853E+00 -0.7002663978369600E+00 -0.6998063986888191E+00 -0.6993466806403545E+00 + -0.6988857204938393E+00 -0.6984220221858803E+00 -0.6979541201161606E+00 -0.6974805822225486E+00 -0.6970000128092043E+00 + -0.6965110551345379E+00 -0.6960123937660179E+00 -0.6955027567089953E+00 -0.6949809173168499E+00 -0.6944456959898160E+00 + -0.6938959616699598E+00 -0.6933306331398015E+00 -0.6927486801321128E+00 -0.6921491242584105E+00 -0.6915310397636959E+00 + -0.6908935541148920E+00 -0.6902358484304498E+00 -0.6895571577584888E+00 -0.6888567712107797E+00 -0.6881340319597943E+00 + -0.6873883371059062E+00 -0.6866191374217884E+00 -0.6858259369808462E+00 -0.6850082926764688E+00 -0.6841658136386904E+00 + -0.6832981605547428E+00 -0.6824050448998029E+00 -0.6814862280841192E+00 -0.6805415205224655E+00 -0.6795707806318362E+00 + -0.6785739137629465E+00 -0.6775508710711322E+00 -0.6765016483318922E+00 -0.6754262847062551E+00 -0.6743248614609347E+00 + -0.6731975006480673E+00 -0.6720443637491410E+00 -0.6708656502875580E+00 -0.6696615964141065E+00 -0.6684324734694262E+00 + -0.6671785865273722E+00 -0.6659002729230488E+00 -0.6645979007690805E+00 -0.6632718674635170E+00 -0.6619225981926605E+00 + -0.6605505444318366E+00 -0.6591561824471119E+00 -0.6577400118006743E+00 -0.6563025538625172E+00 -0.6548443503309030E+00 + -0.6533659617639238E+00 -0.6518679661243543E+00 -0.6503509573398282E+00 -0.6488155438802812E+00 -0.6472623473544041E+00 + -0.6456920011267967E+00 -0.6441051489573446E+00 -0.6425024436642409E+00 -0.6408845458119288E+00 -0.6392521224252083E+00 + -0.6376058457305376E+00 -0.6359463919255466E+00 -0.6342744399776308E+00 -0.6325906704524237E+00 -0.6308957643728299E+00 + -0.6291904021092484E+00 -0.6274752623015023E+00 -0.6257510208129137E+00 -0.6240183497169164E+00 -0.6222779163164849E+00 + -0.6205303821966133E+00 -0.6187764023100156E+00 -0.6170166240961311E+00 -0.6152516866334947E+00 -0.6134822198254523E+00 + -0.6117088436191340E+00 -0.6099321672576039E+00 -0.6081527885649929E+00 -0.6063712932644193E+00 -0.6045882543284419E+00 + -0.6028042313617739E+00 -0.6010197700159075E+00 -0.5992354014353167E+00 -0.5974516417348416E+00 -0.5956689915078388E+00 + -0.5938879353646483E+00 -0.5921089415009345E+00 -0.5903324612953872E+00 -0.5885589289362899E+00 -0.5867887610764325E+00 + -0.5850223565158195E+00 -0.5832600959116285E+00 -0.5815023415148403E+00 -0.5797494369329861E+00 -0.5780017069183963E+00 + -0.5762594571813876E+00 -0.5745229742277652E+00 -0.5727925252200571E+00 -0.5710683578618634E+00 -0.5693507003047140E+00 + -0.5676397610768275E+00 -0.5659357290331757E+00 -0.5642387733262232E+00 -0.5625490433967653E+00 -0.5608666689842511E+00 + -0.5591917601560096E+00 -0.5575244073547678E+00 -0.5558646814639211E+00 -0.5542126338899364E+00 -0.5525682966613572E+00 + -0.5509316825438423E+00 -0.5493027851706900E+00 -0.5476815791883145E+00 -0.5460680204161578E+00 -0.5444620460205136E+00 + -0.5428635747017666E+00 -0.5412725068945640E+00 -0.5396887249804451E+00 -0.5381120935124601E+00 -0.5365424594513395E+00 + -0.5349796524127961E+00 -0.5334234849255057E+00 -0.5318737526994184E+00 -0.5303302349039710E+00 -0.5287926944558559E+00 + -0.5272608783160018E+00 -0.5257345177954069E+00 -0.5242133288695329E+00 -0.5226970125009548E+00 -0.5211852549699725E+00 + -0.5196777282129478E+00 -0.5181740901680973E+00 -0.5166739851285399E+00 -0.5151770441023719E+00 -0.5136828851796083E+00 + -0.5121911139058056E+00 -0.5107013236622320E+00 -0.5092130960524547E+00 -0.5077260012952530E+00 -0.5062395986237541E+00 + -0.5047534366907523E+00 -0.5032670539801658E+00 -0.5017799792246062E+00 -0.5002917318290815E+00 -0.4988018223008544E+00 + -0.4973097526855100E+00 -0.4958150170093096E+00 -0.4943171017279344E+00 -0.4928154861817414E+00 -0.4913096430576898E+00 + -0.4897990388581003E+00 -0.4882831343764708E+00 -0.4867613851805592E+00 -0.4852332421030025E+00 -0.4836981517397486E+00 + -0.4821555569566233E+00 -0.4806048974043609E+00 -0.4790456100424820E+00 -0.4774771296724106E+00 -0.4758988894802721E+00 + -0.4743103215898168E+00 -0.4727108576259886E+00 -0.4710999292896421E+00 -0.4694769689439838E+00 -0.4678414102133217E+00 + -0.4661926885947614E+00 -0.4645302420834957E+00 -0.4628535118124025E+00 -0.4611619427066728E+00 -0.4594549841542420E+00 + -0.4577320906928324E+00 -0.4559927227144522E+00 -0.4542363471882220E+00 -0.4524624384024584E+00 -0.4506704787269636E+00 + -0.4488599593965099E+00 -0.4470303813165587E+00 -0.4451812558922650E+00 -0.4433121058818812E+00 -0.4414224662756842E+00 + -0.4395118852016028E+00 -0.4375799248587367E+00 -0.4356261624800019E+00 -0.4336501913251545E+00 -0.4316516217054698E+00 + -0.4296300820413793E+00 -0.4275852199543783E+00 -0.4255167033945205E+00 -0.4234242218048398E+00 -0.4213074873240124E+00 + -0.4191662360285776E+00 -0.4170002292160105E+00 -0.4148092547299044E+00 -0.4125931283284775E+00 -0.4103516950975684E+00 + -0.4080848309091941E+00 -0.4057924439266636E+00 -0.4034744761571206E+00 -0.4011309050522512E+00 -0.3987617451577198E+00 + -0.3963670498117089E+00 -0.3939469128927054E+00 -0.3915014706163934E+00 -0.3890309033812195E+00 -0.3865354376618079E+00 + -0.3840153479490107E+00 -0.3814709587348666E+00 -0.3789026465402212E+00 -0.3763108419821045E+00 -0.3736960318772730E+00 + -0.3710587613774890E+00 -0.3683996361312071E+00 -0.3657193244652975E+00 -0.3630185595792629E+00 -0.3602981417430927E+00 + -0.3575589404884341E+00 -0.3548018967810906E+00 -0.3520280251610328E+00 -0.3492384158340347E+00 -0.3464342366967726E+00 + -0.3436167352746726E+00 -0.3407872405489845E+00 -0.3379471646464616E+00 -0.3350980043615843E+00 -0.3322413424775305E+00 + -0.3293788488479631E+00 -0.3265122811972369E+00 -0.3236434855917447E+00 -0.3207743965298733E+00 -0.3179070365923667E+00 + -0.3150435155888747E+00 -0.3121860291300399E+00 -0.3093368565477600E+00 -0.3064983580792707E+00 -0.3036729712235190E+00 + -0.3008632061710796E+00 -0.2980716402017605E+00 -0.2953009109372595E+00 -0.2925537083300732E+00 -0.2898327652646850E+00 + -0.2871408466433073E+00 -0.2844807368267285E+00 -0.2818552253018305E+00 -0.2792670904519203E+00 -0.2767190813152813E+00 + -0.2742138972325089E+00 -0.2717541653057443E+00 -0.2693424156246247E+00 -0.2669810542566010E+00 -0.2646723340554829E+00 + -0.2624183234141169E+00 -0.2602208731776114E+00 -0.2580815820450847E+00 -0.2560017609230388E+00 -0.2539823968540338E+00 + -0.2520241173314579E+00 -0.2501271560242013E+00 -0.2482913211710008E+00 -0.2465159681564286E+00 -0.2447999780373049E+00 + -0.2431417440311489E+00 -0.2415391681797712E+00 -0.2399896705229777E+00 -0.2384902131086874E+00 -0.2370373409624846E+00 + -0.2356272416659091E+00 -0.2342558243668445E+00 -0.2329188177912029E+00 -0.2316118850938999E+00 -0.2303307511904072E+00 + -0.2290713356663495E+00 -0.2278298817525086E+00 -0.2266030696708936E+00 -0.2253881016292194E+00 -0.2241827467507004E+00 + -0.2229853380898954E+00 -0.2217947209120437E+00 -0.2206101607947411E+00 -0.2194312294160579E+00 -0.2182576912681023E+00 + -0.2170894123227367E+00 -0.2159263013992442E+00 -0.2147682815470252E+00 -0.2136152801508975E+00 -0.2124672267271450E+00 + -0.2113240526296465E+00 -0.2101856910076705E+00 -0.2090520767782083E+00 -0.2079231465985940E+00 -0.2067988388391586E+00 + -0.2056790935559256E+00 -0.2045638524633573E+00 -0.2034530589071708E+00 -0.2023466578372234E+00 -0.2012445957804879E+00 + -0.2001468208141218E+00 -0.1990532825386412E+00 -0.1979639320512100E+00 -0.1968787219190523E+00 -0.1957976061529950E+00 + -0.1947205401811518E+00 -0.1936474808227552E+00 -0.1925783862621419E+00 -0.1915132160229021E+00 -0.1904519309421991E+00 + -0.1893944931452612E+00 -0.1883408660200601E+00 -0.1872910141921747E+00 -0.1862449034998491E+00 -0.1852025009692512E+00 + -0.1841637747899360E+00 -0.1831286942905153E+00 -0.1820972299145447E+00 -0.1810693531966281E+00 -0.1800450367387435E+00 + -0.1790242541867973E+00 -0.1780069802074076E+00 -0.1769931904649212E+00 -0.1759828615986671E+00 -0.1749759712004503E+00 + -0.1739724977922888E+00 -0.1729724208043943E+00 -0.1719757205534020E+00 -0.1709823782208502E+00 -0.1699923758319090E+00 + -0.1690056962343670E+00 -0.1680223230778698E+00 -0.1670422407934179E+00 -0.1660654345731199E+00 -0.1650918903502081E+00 + -0.1641215947793118E+00 -0.1631545352169931E+00 -0.1621906997025439E+00 -0.1612300769390466E+00 -0.1602726562746950E+00 + -0.1593184276843816E+00 -0.1583673817515448E+00 -0.1574195096502818E+00 -0.1564748031277238E+00 -0.1555332544866742E+00 + -0.1545948565685086E+00 -0.1536596027363397E+00 -0.1527274868584397E+00 -0.1517985032919279E+00 -0.1508726468667154E+00 + -0.1499499128697113E+00 -0.1490302970292871E+00 -0.1481137954999969E+00 -0.1472004048475565E+00 -0.1462901220340763E+00 + -0.1453829444035485E+00 -0.1444788696675867E+00 -0.1435778958914185E+00 -0.1426800214801243E+00 -0.1417852451651289E+00 + -0.1408935659909356E+00 -0.1400049833021089E+00 -0.1391194967304976E+00 -0.1382371061827025E+00 -0.1373578118277804E+00 + -0.1364816140851888E+00 -0.1356085136129656E+00 -0.1347385112961426E+00 -0.1338716082353913E+00 -0.1330078057358998E+00 + -0.1321471052964751E+00 -0.1312895085988738E+00 -0.1304350174973551E+00 -0.1295836340084561E+00 -0.1287353603009860E+00 + -0.1278901986862372E+00 -0.1270481516084132E+00 -0.1262092216352652E+00 -0.1253734114489432E+00 -0.1245407238370528E+00 + -0.1237111616839186E+00 -0.1228847279620496E+00 -0.1220614257238084E+00 -0.1212412580932750E+00 -0.1204242282583109E+00 + -0.1196103394628140E+00 -0.1187995949991672E+00 -0.1179919982008737E+00 -0.1171875524353817E+00 -0.1163862610970906E+00 + -0.1155881276005403E+00 -0.1147931553737807E+00 -0.1140013478519165E+00 -0.1132127084708265E+00 -0.1124272406610577E+00 + -0.1116449478418844E+00 -0.1108658334155396E+00 -0.1100899007616072E+00 -0.1093171532315786E+00 -0.1085475941435698E+00 + -0.1077812267771939E+00 -0.1070180543685908E+00 -0.1062580801056096E+00 -0.1055013071231401E+00 -0.1047477384985937E+00 + -0.1039973772475303E+00 -0.1032502263194267E+00 -0.1025062885935886E+00 -0.1017655668751993E+00 -0.1010280638915064E+00 + -0.1002937822881413E+00 -0.9956272462557243E-01 -0.9883489337568613E-01 -0.9811029091849610E-01 -0.9738891953897792E-01 + -0.9667078142402649E-01 -0.9595587865953395E-01 -0.9524421322758671E-01 -0.9453578700377881E-01 -0.9383060175463867E-01 + -0.9312865913516950E-01 -0.9242996068649882E-01 -0.9173450783363590E-01 -0.9104230188333598E-01 -0.9035334402206746E-01 + -0.8966763531408090E-01 -0.8898517669957863E-01 -0.8830596899298146E-01 -0.8763001288129194E-01 -0.8695730892255034E-01 + -0.8628785754438455E-01 -0.8562165904264758E-01 -0.8495871358014560E-01 -0.8429902118545067E-01 -0.8364258175179907E-01 + -0.8298939503607108E-01 -0.8233946065785329E-01 -0.8169277809857793E-01 -0.8104934670074115E-01 -0.8040916566719632E-01 + -0.7977223406052095E-01 -0.7913855080245588E-01 -0.7850811467341570E-01 -0.7788092431206631E-01 -0.7725697821497177E-01 + -0.7663627473630474E-01 -0.7601881208762261E-01 -0.7540458833770475E-01 -0.7479360141245189E-01 -0.7418584909484364E-01 + -0.7358132902495440E-01 -0.7298003870002605E-01 -0.7238197547459475E-01 -0.7178713656067244E-01 -0.7119551902797848E-01 + -0.7060711980422413E-01 -0.7002193567544460E-01 -0.6943996328638005E-01 -0.6886119914090269E-01 -0.6828563960248966E-01 + -0.6771328089473920E-01 -0.6714411910192997E-01 -0.6657815016962187E-01 -0.6601536990529702E-01 -0.6545577397903950E-01 + -0.6489935792425362E-01 -0.6434611713841799E-01 -0.6379604688387538E-01 -0.6324914228865730E-01 -0.6270539834734140E-01 + -0.6216480992194123E-01 -0.6162737174282699E-01 -0.6109307840967654E-01 -0.6056192439245466E-01 -0.6003390403242120E-01 + -0.5950901154316545E-01 -0.5898724101166728E-01 -0.5846858639938206E-01 -0.5795304154335106E-01 -0.5744060015733360E-01 + -0.5693125583296245E-01 -0.5642500204092020E-01 -0.5592183213213570E-01 -0.5542173933900042E-01 -0.5492471677660394E-01 + -0.5443075744398622E-01 -0.5393985422540789E-01 -0.5345199989163673E-01 -0.5296718710124915E-01 -0.5248540840194668E-01 + -0.5200665623188704E-01 -0.5153092292102712E-01 -0.5105820069247997E-01 -0.5058848166388249E-01 -0.5012175784877501E-01 + -0.4965802115799089E-01 -0.4919726340105649E-01 -0.4873947628759936E-01 -0.4828465142876621E-01 -0.4783278033864765E-01 + -0.4738385443571101E-01 -0.4693786504423999E-01 -0.4649480339577959E-01 -0.4605466063058778E-01 -0.4561742779909139E-01 + -0.4518309586334694E-01 -0.4475165569850558E-01 -0.4432309809428110E-01 -0.4389741375642146E-01 -0.4347459330818220E-01 + -0.4305462729180289E-01 -0.4263750616998431E-01 -0.4222322032736679E-01 -0.4181176007201023E-01 -0.4140311563687321E-01 + -0.4099727718129280E-01 -0.4059423479246362E-01 -0.4019397848691562E-01 -0.3979649821199152E-01 -0.3940178384732158E-01 + -0.3900982520629698E-01 -0.3862061203754088E-01 -0.3823413402637604E-01 -0.3785038079629078E-01 -0.3746934191040018E-01 + -0.3709100687290486E-01 -0.3671536513054492E-01 -0.3634240607405034E-01 -0.3597211903958652E-01 -0.3560449331019496E-01 + -0.3523951811722967E-01 -0.3487718264178740E-01 -0.3451747601613299E-01 -0.3416038732511890E-01 -0.3380590560759827E-01 + -0.3345401985783308E-01 -0.3310471902689426E-01 -0.3275799202405693E-01 -0.3241382771818768E-01 -0.3207221493912545E-01 + -0.3173314247905550E-01 -0.3139659909387535E-01 -0.3106257350455455E-01 -0.3073105439848577E-01 -0.3040203043082867E-01 + -0.3007549022584622E-01 -0.2975142237823227E-01 -0.2942981545443215E-01 -0.2911065799395422E-01 -0.2879393851067332E-01 + -0.2847964549412637E-01 -0.2816776741079883E-01 -0.2785829270540316E-01 -0.2755120980214808E-01 -0.2724650710599997E-01 + -0.2694417300393482E-01 -0.2664419586618161E-01 -0.2634656404745713E-01 -0.2605126588819128E-01 -0.2575828971574435E-01 + -0.2546762384561452E-01 -0.2517925658263681E-01 -0.2489317622217316E-01 -0.2460937105129300E-01 -0.2432782934994559E-01 + -0.2404853939212278E-01 -0.2377148944701278E-01 -0.2349666778014561E-01 -0.2322406265452879E-01 -0.2295366233177469E-01 + -0.2268545507321884E-01 -0.2241942914102913E-01 -0.2215557279930686E-01 -0.2189387431517832E-01 -0.2163432195987824E-01 + -0.2137690400982439E-01 -0.2112160874768343E-01 -0.2086842446342893E-01 -0.2061733945539015E-01 -0.2036834203129333E-01 + -0.2012142050929418E-01 -0.1987656321900255E-01 -0.1963375850249907E-01 -0.1939299471534369E-01 -0.1915426022757691E-01 + -0.1891754342471287E-01 -0.1868283270872514E-01 -0.1845011649902528E-01 -0.1821938323343368E-01 -0.1799062136914412E-01 + -0.1776381938368037E-01 -0.1753896577584702E-01 -0.1731604906667307E-01 -0.1709505780034925E-01 -0.1687598054515926E-01 + -0.1665880589440464E-01 -0.1644352246732421E-01 -0.1623011891000752E-01 -0.1601858389630291E-01 -0.1580890612872058E-01 + -0.1560107433933019E-01 -0.1539507729065434E-01 -0.1519090377655698E-01 -0.1498854262312769E-01 -0.1478798268956219E-01 + -0.1458921286903872E-01 -0.1439222208959125E-01 -0.1419699931497929E-01 -0.1400353354555478E-01 -0.1381181381912668E-01 + -0.1362182921182277E-01 -0.1343356883894992E-01 -0.1324702185585244E-01 -0.1306217745876907E-01 -0.1287902488568931E-01 + -0.1269755341720873E-01 -0.1251775237738444E-01 -0.1233961113459019E-01 -0.1216311910237258E-01 -0.1198826574030775E-01 + -0.1181504055485940E-01 -0.1164343310023902E-01 -0.1147343297926770E-01 -0.1130502984424104E-01 -0.1113821339779698E-01 + -0.1097297339378707E-01 -0.1080929963815219E-01 -0.1064718198980239E-01 -0.1048661036150212E-01 -0.1032757472076096E-01 + -0.1017006509073034E-01 -0.1001407155110739E-01 -0.9859584239045534E-02 -0.9706593350073452E-02 -0.9555089139022180E-02 + -0.9405061920961404E-02 -0.9256502072145643E-02 -0.9109400030970487E-02 -0.8963746298940305E-02 -0.8819531441647413E-02 + -0.8676746089763751E-02 -0.8535380940045894E-02 -0.8395426756353708E-02 -0.8256874370684052E-02 -0.8119714684219669E-02 + -0.7983938668394324E-02 -0.7849537365975339E-02 -0.7716501892163617E-02 -0.7584823435712779E-02 -0.7454493260067761E-02 + -0.7325502704523865E-02 -0.7197843185407555E-02 -0.7071506197279220E-02 -0.6946483314159568E-02 -0.6822766190779977E-02 + -0.6700346563858386E-02 -0.6579216253401177E-02 -0.6459367164032316E-02 -0.6340791286350805E-02 -0.6223480698317331E-02 + -0.6107427566671246E-02 -0.5992624148378852E-02 -0.5879062792113993E-02 -0.5766735939772315E-02 -0.5655636128019704E-02 + -0.5545755989876484E-02 -0.5437088256338068E-02 -0.5329625758033137E-02 -0.5223361426920646E-02 -0.5118288298026128E-02 + -0.5014399511218785E-02 -0.4911688313029938E-02 -0.4810148058513781E-02 -0.4709772213151562E-02 -0.4610554354799431E-02 + -0.4512488175681280E-02 -0.4415567484426667E-02 -0.4319786208154660E-02 -0.4225138394604049E-02 -0.4131618214309937E-02 + -0.4039219962827338E-02 -0.3947938063001268E-02 -0.3857767067283620E-02 -0.3768701660096141E-02 -0.3680736660238960E-02 + -0.3593867023344052E-02 -0.3508087844372004E-02 -0.3423394360151161E-02 -0.3339781951956864E-02 -0.3257246148128755E-02 + -0.3175782626723511E-02 -0.3095387218199560E-02 -0.3016055908130390E-02 -0.2937784839941740E-02 -0.2860570317667780E-02 + -0.2784408808720544E-02 -0.2709296946665686E-02 -0.2635231533997301E-02 -0.2562209544902880E-02 -0.2490228128008725E-02 + -0.2419284609094953E-02 -0.2349376493767305E-02 -0.2280501470072159E-02 -0.2212657411038820E-02 -0.2145842377131630E-02 + -0.2080054618592456E-02 -0.2015292577651429E-02 -0.1951554890581906E-02 -0.1888840389572373E-02 -0.1827148104385303E-02 + -0.1766477263769774E-02 -0.1706827296590603E-02 -0.1648197832633426E-02 -0.1590588703040315E-02 -0.1533999940326040E-02 + -0.1478431777920006E-02 -0.1423884649172962E-02 -0.1370359185761869E-02 -0.1317856215419179E-02 -0.1266376758905965E-02 + -0.1215922026140108E-02 -0.1166493411382406E-02 -0.1118092487374301E-02 -0.1070720998310677E-02 -0.1024380851520841E-02 + -0.9790741077189988E-03 -0.9348029696732801E-03 -0.8915697691294780E-03 -0.8493769518112139E-03 -0.8082270603040555E-03 + -0.7681227146151712E-03 -0.7290665901840791E-03 -0.6910613931034242E-03 -0.6541098322911179E-03 -0.6182145883382149E-03 + -0.5833782787391545E-03 -0.5496034191941447E-03 -0.5168923806574943E-03 -0.4852473417906704E-03 -0.4546702364667819E-03 + -0.4251626959634362E-03 -0.3967259854759182E-03 -0.3693609345830440E-03 -0.3430678613055810E-03 -0.3178464894144324E-03 + -0.2936958586742664E-03 -0.2706142277521279E-03 -0.2485989695820504E-03 -0.2276464590608424E-03 -0.2077519530613687E-03 + -0.1889094628931880E-03 -0.1711116195232660E-03 -0.1543495320979493E-03 -0.1386126405900494E-03 -0.1238885637399120E-03 + -0.1101629438755946E-03 -0.9741929069423303E-04 -0.8563882667209854E-04 -0.7480033745236668E-04 -0.6488003134095919E-04 + -0.5585141292167375E-04 -0.4768517677466276E-04 -0.4034912832859186E-04 -0.3380813996360609E-04 -0.2802415155542768E-04 + -0.2295622562937124E-04 -0.1856066806040990E-04 -0.1479122565136393E-04 -0.1159937173437365E-04 -0.8934689902304919E-05 + -0.6745363761688971E-05 -0.4978776837729040E-05 -0.3582221071745688E-05 -0.2503704396851613E-05 -0.1692837474640400E-05 + -0.1101766951461853E-05 -0.6861082076102529E-06 -0.4058159914808505E-06 -0.2259190936022548E-06 -0.1170390843846189E-06 + -0.5561789832021472E-07 -0.2379962422071496E-07 -0.8951415949547709E-08 -0.2865311296782646E-08 -0.7469799452895257E-09 + -0.1491286872225022E-09 -0.2085937681520927E-10 -0.1788909961745903E-11 -0.7627333239967911E-13 -0.1139998169589491E-14 + -0.3184439268690364E-17 -0.4725628150249130E-21 -0.1979177475376566E-27 -0.3507608647733454E-40 -0.1993203231761145E-78 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.2092827306407022E+00 0.4057670184399992E+00 0.5898979350532600E+00 0.7621100296525628E+00 + 0.9228266176030425E+00 0.1072464703931703E+01 0.1211436937704310E+01 0.1340155639290343E+01 0.1459036896649656E+01 + 0.1568504688229295E+01 0.1668994708900562E+01 0.1760957569185768E+01 0.1844861052822834E+01 0.1921191152910295E+01 + 0.1990451661396074E+01 0.2053162158653891E+01 0.2109854336461265E+01 0.2161066684867483E+01 0.2207337676111377E+01 + 0.2249197680806415E+01 0.2287159946209046E+01 0.2321711046373938E+01 0.2353301272500611E+01 0.2382335462875013E+01 + 0.2409164771274074E+01 0.2434079838629096E+01 0.2457305766029753E+01 0.2478999191665430E+01 0.2499247656714136E+01 + 0.2518071314420061E+01 0.2535426902944383E+01 0.2551213776615215E+01 0.2565281681669818E+01 0.2577439879309795E+01 + 0.2587467166041904E+01 0.2595122320937184E+01 0.2600154520609984E+01 0.2602313301685621E+01 0.2601357711533437E+01 + 0.2597064364112607E+01 0.2589234201573016E+01 0.2577697846846366E+01 0.2562319511937518E+01 0.2542999496459417E+01 + 0.2519675368173886E+01 0.2492321960446077E+01 0.2460950350463687E+01 0.2425605997739516E+01 0.2386366226474959E+01 + 0.2343337229915742E+01 0.2296650762147126E+01 0.2246460665073238E+01 0.2192939357621151E+01 0.2136274392226351E+01 + 0.2076665161774061E+01 0.2014319819428672E+01 0.1949452454898987E+01 0.1882280554098696E+01 0.1813022755076766E+01 + 0.1741896901539862E+01 0.1669118386164077E+01 0.1594898769003028E+01 0.1519444651395879E+01 0.1442956782587889E+01 + 0.1365629374518453E+01 0.1287649599638170E+01 0.1209197246937915E+01 0.1130444512385982E+01 0.1051555901479737E+01 + 0.9726882234608905E+00 0.8939906587816835E+00 0.8156048835327433E+00 0.7376652366657381E+00 0.6602989178988580E+00 + 0.5836262061335374E+00 0.5077606900028175E+00 0.4328095037959179E+00 0.3588735634485049E+00 0.2860477985519050E+00 + 0.2144213774203916E+00 0.1440779231718307E+00 0.7509571953458535E-01 0.7547905706075591E-02 -0.5849733992897237E-01 + -0.1229766270456308E+00 -0.1858311911485266E+00 -0.2470067412388819E+00 -0.3064533166418045E+00 -0.3641251522021267E+00 + -0.4199805510487963E+00 -0.4739817641533713E+00 -0.5260948759595897E+00 -0.5762896954288581E+00 -0.6245396519239588E+00 + -0.6708216954350136E+00 -0.7151162007320108E+00 -0.7574068751038985E+00 -0.7976806694123654E+00 -0.8359276922467996E+00 + -0.8721411270148933E+00 -0.9063171518391930E+00 -0.9384548621556141E+00 -0.9685561959238236E+00 -0.9966258613642036E+00 + -0.1022671267132381E+01 -0.1046702454831763E+01 -0.1068732033749353E+01 -0.1088775117682357E+01 -0.1106849263704848E+01 + -0.1122974412708365E+01 -0.1137172831539331E+01 -0.1149469056553965E+01 -0.1159889838419920E+01 -0.1168464088017379E+01 + -0.1175222823334259E+01 -0.1180199117315087E+01 -0.1183428046714909E+01 -0.1184946642134393E+01 -0.1184793839575426E+01 + -0.1183010434064154E+01 -0.1179639036149073E+01 -0.1174724032402013E+01 -0.1168311551439714E+01 -0.1160449437451607E+01 + -0.1151187233775371E+01 -0.1140576179713346E+01 -0.1128669224538139E+01 -0.1115521063495940E+01 -0.1101188201577848E+01 + -0.1085729051876920E+01 -0.1069204076448596E+01 -0.1051675978683903E+01 -0.1033209957189757E+01 -0.1013874031892834E+01 + -0.9937394533112268E+00 -0.9728812053358954E+00 -0.9513786099635553E+00 -0.9293160385930985E+00 -0.9067837279225540E+00 + -0.8838786881577604E+00 -0.8607056760163188E+00 -0.8373781836996756E+00 -0.8140193666454354E+00 -0.7907627971280821E+00 + -0.7677528886053459E+00 -0.7451447902474176E+00 -0.7231035087242984E+00 -0.7018019856777432E+00 -0.6814178596116595E+00 + -0.6621286890901025E+00 -0.6441055293683786E+00 -0.6275049500959465E+00 -0.6124598554819389E+00 -0.5990697931249144E+00 + -0.5873917551816811E+00 -0.5774326999496706E+00 -0.5691450588850681E+00 -0.5624262731985009E+00 -0.5571229156877342E+00 + -0.5530392710790523E+00 -0.5499495211576281E+00 -0.5476120912055904E+00 -0.5457844127402661E+00 -0.5442364096307576E+00 + -0.5427613802609629E+00 -0.5411835048730576E+00 -0.5393618006932226E+00 -0.5371908460844405E+00 -0.5345989223491749E+00 + -0.5315443627327854E+00 -0.5280108835019925E+00 -0.5240025549054657E+00 -0.5195389048925442E+00 -0.5146504785947575E+00 + -0.5093750286076997E+00 -0.5037543971983343E+00 -0.4978320732717670E+00 -0.4916513597181557E+00 -0.4852540635555492E+00 + -0.4786796148269129E+00 -0.4719645242683226E+00 -0.4651420995758296E+00 -0.4582423523395834E+00 -0.4512920402678477E+00 + -0.4443148009770967E+00 -0.4373313437888304E+00 -0.4303596744600146E+00 -0.4234153346275730E+00 -0.4165116431348047E+00 + -0.4096599305448206E+00 -0.4028697612557244E+00 -0.3961491399203882E+00 -0.3895047005196642E+00 -0.3829418775915900E+00 + -0.3764650599017688E+00 -0.3700777273477470E+00 -0.3637825721974685E+00 -0.3575816059257799E+00 -0.3514762529766660E+00 + -0.3454674327743286E+00 -0.3395556312570763E+00 -0.3337409631312600E+00 -0.3280232259503844E+00 -0.3224019470255501E+00 + -0.3168764240734279E+00 -0.3114457604107825E+00 -0.3061088954126595E+00 -0.3008646308661068E+00 -0.2957116537733492E+00 + -0.2906485560879659E+00 -0.2856738518046101E+00 -0.2807859917668553E+00 -0.2759833765084032E+00 -0.2712643673995287E+00 + -0.2666272963328205E+00 -0.2620704741493222E+00 -0.2575921979776381E+00 -0.2531907576339031E+00 -0.2488644412092475E+00 + -0.2446115399531009E+00 -0.2404303525450218E+00 -0.2363191888342949E+00 -0.2322763731150775E+00 -0.2283002469950982E+00 + -0.2243891719075561E+00 -0.2205415313087940E+00 -0.2167557325982774E+00 -0.2130302087922870E+00 -0.2093634199784029E+00 + -0.2057538545741509E+00 -0.2022000304100722E+00 -0.1987004956548198E+00 -0.1952538295976336E+00 -0.1918586433016487E+00 + -0.1885135801398642E+00 -0.1852173162242242E+00 -0.1819685607370943E+00 -0.1787660561734181E+00 -0.1756085785009749E+00 + -0.1724949372454470E+00 -0.1694239755063514E+00 -0.1663945699093716E+00 -0.1634056305001383E+00 -0.1604561005841044E+00 + -0.1575449565168044E+00 -0.1546712074484661E+00 -0.1518338950266697E+00 -0.1490320930604994E+00 -0.1462649071494050E+00 + -0.1435314742798000E+00 -0.1408309623922306E+00 -0.1381625699217879E+00 -0.1355255253142844E+00 -0.1329190865205691E+00 + -0.1303425404712269E+00 -0.1277952025337876E+00 -0.1252764159544457E+00 -0.1227855512861943E+00 -0.1203220058051661E+00 + -0.1178852029168765E+00 -0.1154745915539778E+00 -0.1130896455670350E+00 -0.1107298631097586E+00 -0.1083947660200428E+00 + -0.1060838991980789E+00 -0.1037968299827469E+00 -0.1015331475274080E+00 -0.9929246217615594E-01 -0.9707440484152201E-01 + -0.9487862638456054E-01 -0.9270479699818115E-01 -0.9055260559454251E-01 -0.8842175919725527E-01 -0.8631198233909854E-01 + -0.8422301646589628E-01 -0.8215461934715129E-01 -0.8010656449399124E-01 -0.7807864058492887E-01 -0.7607065089990145E-01 + -0.7408241276301041E-01 -0.7211375699433867E-01 -0.7016452737119373E-01 -0.6823458009908026E-01 -0.6632378329267392E-01 + -0.6443201646703840E-01 -0.6255917003929234E-01 -0.6070514484090285E-01 -0.5886985164075899E-01 -0.5705321067914502E-01 + -0.5525515121271331E-01 -0.5347561107053028E-01 -0.5171453622124416E-01 -0.4997188035140731E-01 -0.4824760445495881E-01 + -0.4654167643385925E-01 -0.4485407070984989E-01 -0.4318476784728866E-01 -0.4153375418700541E-01 -0.3990102149109915E-01 + -0.3828656659858688E-01 -0.3669039109180319E-01 -0.3511250097343621E-01 -0.3355290635407111E-01 -0.3201162115010978E-01 + -0.3048866279191616E-01 -0.2898405194203557E-01 -0.2749781222332479E-01 -0.2602996995682040E-01 -0.2458055390917123E-01 + -0.2314959504944821E-01 -0.2173712631514516E-01 -0.2034318238717427E-01 -0.1896779947365720E-01 -0.1761101510230969E-01 + -0.1627286792121220E-01 -0.1495339750775495E-01 -0.1365264418554666E-01 -0.1237064884906971E-01 -0.1110745279586314E-01 + -0.9863097566016712E-02 -0.8637624788750709E-02 -0.7431076035862909E-02 -0.6243492681816734E-02 -0.5074915770246633E-02 + -0.3925385886656976E-02 -0.2794943037087542E-02 -0.1683626532521779E-02 -0.5914748788115108E-03 0.4814743281079707E-03 + 0.1535184501935395E-02 0.2569620160881108E-02 0.3584747017927284E-02 0.4580532066695804E-02 0.5556943663146154E-02 + 0.6513951603328201E-02 0.7451527197409622E-02 0.8369643340202203E-02 0.9268274578406274E-02 0.1014739717479459E-01 + 0.1100698916955656E-01 0.1184703043902031E-01 0.1266750275197406E-01 0.1346838982380348E-01 0.1424967736866517E-01 + 0.1501135314991321E-01 0.1575340702899826E-01 0.1647583101305540E-01 0.1717861930140175E-01 0.1786176833115984E-01 + 0.1852527682222726E-01 0.1916914582181181E-01 0.1979337874875210E-01 0.2039798143784515E-01 0.2098296218440263E-01 + 0.2154833178926046E-01 0.2209410360446425E-01 0.2262029357986047E-01 0.2312692031081800E-01 0.2361400508731372E-01 + 0.2408157194461195E-01 0.2452964771577501E-01 0.2495826208624157E-01 0.2536744765071304E-01 0.2575723997259286E-01 + 0.2612767764622501E-01 0.2647880236218226E-01 0.2681065897585869E-01 0.2712329557962571E-01 0.2741676357881194E-01 + 0.2769111777177585E-01 0.2794641643434182E-01 0.2818272140887457E-01 0.2840009819827491E-01 0.2859861606518020E-01 + 0.2877834813666253E-01 0.2893937151471862E-01 0.2908176739285332E-01 0.2920562117906286E-01 0.2931102262552834E-01 + 0.2939806596533533E-01 0.2946685005654058E-01 0.2951747853391014E-01 0.2955005996865805E-01 0.2956470803651828E-01 + 0.2956154169448472E-01 0.2954068536655733E-01 0.2950226913883336E-01 0.2944642896428323E-01 0.2937330687754944E-01 + 0.2928305122010533E-01 0.2917581687610584E-01 0.2905176551925757E-01 0.2891106587102654E-01 0.2875389397049235E-01 + 0.2858043345614350E-01 0.2839087585989199E-01 0.2818542091356523E-01 0.2796427686810767E-01 0.2772766082569555E-01 + 0.2747579908493241E-01 0.2720892749925168E-01 0.2692729184860401E-01 0.2663114822445014E-01 0.2632076342801500E-01 + 0.2599641538168244E-01 0.2565839355332355E-01 0.2530699939325154E-01 0.2494254678338238E-01 0.2456536249805061E-01 + 0.2417578667578270E-01 0.2377417330116236E-01 0.2336089069573457E-01 0.2293632201668000E-01 0.2250086576175244E-01 + 0.2205493627870053E-01 0.2159896427709156E-01 0.2113339734011533E-01 0.2065870043356471E-01 0.2017535640876495E-01 + 0.1968386649574995E-01 0.1918475078245607E-01 0.1867854867511944E-01 0.1816581933441314E-01 0.1764714208114318E-01 + 0.1712311676453094E-01 0.1659436408523645E-01 0.1606152586432164E-01 0.1552526524830300E-01 0.1498626683930028E-01 + 0.1444523673804386E-01 0.1390290248615655E-01 0.1336001289267242E-01 0.1281733772819916E-01 0.1227566726846887E-01 + 0.1173581166726628E-01 0.1119860013688112E-01 0.1066487991231793E-01 0.1013551497353980E-01 0.9611384498049214E-02 + 0.9093381014167966E-02 0.8582408223524964E-02 0.8079378459570645E-02 0.7585209747505587E-02 0.7100822429962137E-02 + 0.6627135322258290E-02 0.6165061361244632E-02 0.5715502712913672E-02 0.5279345306314358E-02 0.4857452765248114E-02 + 0.4450659715107746E-02 0.4059764450523725E-02 0.3685520960736674E-02 0.3328630324427772E-02 0.2989731504787848E-02 + 0.2669391599617415E-02 0.2368095630986141E-02 0.2086235995182996E-02 0.1824101737017772E-02 0.1581867863467087E-02 + 0.1359584970329603E-02 0.1157169521569523E-02 0.9743951931644752E-03 0.8108857691386213E-03 0.6661101530243749E-03 + 0.5393801270545922E-03 0.4298515449594449E-03 0.3365296699754433E-03 0.2582793513780087E-03 0.1938406504102719E-03 + 0.1418503565121643E-03 0.1008695525362177E-03 0.6941697110285677E-04 0.4600732088117413E-04 0.2919305903894978E-04 + 0.1760728677207078E-04 0.1000464291784026E-04 0.5296427334745831E-05 0.2575932371020878E-05 0.1130373835070578E-05 + 0.4371389867137730E-06 0.1443839527546615E-06 0.3903079296907923E-07 0.8136509367815676E-08 0.1200603994451306E-08 + 0.1103313091144371E-09 0.5169033352084336E-11 0.8862989414281884E-13 0.3078210235071099E-15 0.6727297563933329E-19 + 0.6350331239490211E-25 0.1073811882539351E-36 0.6326995303161769E-70 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 + 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 From ca96ecdc55d908bc005b24b3b48374cd3b24896c Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Thu, 19 Nov 2015 08:44:30 +0100 Subject: [PATCH 070/205] Recognise END statement in FORTRAN files. --- lib/linguist/heuristics.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 11f58b28..0a1ab912 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -131,7 +131,7 @@ module Linguist disambiguate ".for", ".f" do |data| if /^: /.match(data) Language["Forth"] - elsif /^([c*][^a-z]| (subroutine|program)\s|\s*!)/i.match(data) + elsif /^([c*][^abd-z]| (subroutine|program|end)\s|\s*!)/i.match(data) Language["FORTRAN"] end end From db64f192fa34258343983c8bdbb1f24737f302ed Mon Sep 17 00:00:00 2001 From: soc Date: Thu, 19 Nov 2015 15:25:55 +0100 Subject: [PATCH 071/205] Change Scala language color to Scala language's main color --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 373607db..eb36b17c 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3155,7 +3155,7 @@ Sass: Scala: type: programming ace_mode: scala - color: "#7dd3b0" + color: "#DC322F" extensions: - .scala - .sbt From 473e5db51f8ba214d6c5127dcced89d351aa3240 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Thu, 19 Nov 2015 20:24:23 -0600 Subject: [PATCH 072/205] Adding sample for Coffeescript too --- lib/linguist/languages.yml | 1 + samples/CoffeeScript/build.cake | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 samples/CoffeeScript/build.cake diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 02fe4881..b14b371e 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -569,6 +569,7 @@ CoffeeScript: extensions: - .coffee - ._coffee + - .cake - .cjsx - .cson - .iced diff --git a/samples/CoffeeScript/build.cake b/samples/CoffeeScript/build.cake new file mode 100644 index 00000000..b3f7df91 --- /dev/null +++ b/samples/CoffeeScript/build.cake @@ -0,0 +1,17 @@ +fs = require 'fs' + +{print} = require 'sys' +{spawn} = require 'child_process' + +build = (callback) -> + coffee = spawn 'coffee', ['-c', '-o', '.', '.'] + coffee.stderr.on 'data', (data) -> + process.stderr.write data.toString() + coffee.stdout.on 'data', (data) -> + print data.toString() + coffee.on 'exit', (code) -> + callback?() if code is 0 + +task 'build', 'Build from source', -> + build() + \ No newline at end of file From f72c337c5b64d47de325453b36b30842aeee606c Mon Sep 17 00:00:00 2001 From: Yuxin Wu Date: Sat, 21 Nov 2015 21:48:03 -0500 Subject: [PATCH 073/205] add jquery.fancybox.css to vendor list fancybox has both js and css --- lib/linguist/vendor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index ddbc6502..fb9f34c3 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -96,6 +96,7 @@ # jQuery fancyBox - jquery.fancybox.js +- jquery.fancybox.css # Fuel UX - fuelux.js From 8ab94a8643ab3747297fc3059ae5a8403fd9fd07 Mon Sep 17 00:00:00 2001 From: Yuxin Wu Date: Sat, 21 Nov 2015 21:55:08 -0500 Subject: [PATCH 074/205] Use one line for jquery fancybox in vendor (just another commit to pass CLA check --- lib/linguist/vendor.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index fb9f34c3..294f312b 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -95,8 +95,7 @@ - jquery.fn.gantt.js # jQuery fancyBox -- jquery.fancybox.js -- jquery.fancybox.css +- jquery.fancybox.(js|css) # Fuel UX - fuelux.js From d636eaf1e3811eefaa26a86fac79af253f0d4403 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Mon, 23 Nov 2015 17:12:18 +1100 Subject: [PATCH 075/205] Add example MAXScript files from Autodesk reference --- samples/MAXScript/macro-1.mcr | 29 ++++++++++++++ samples/MAXScript/macro-2.mcr | 53 +++++++++++++++++++++++++ samples/MAXScript/svg-renderer.ms | 64 +++++++++++++++++++++++++++++++ samples/MAXScript/volume-calc.ms | 22 +++++++++++ 4 files changed, 168 insertions(+) create mode 100644 samples/MAXScript/macro-1.mcr create mode 100644 samples/MAXScript/macro-2.mcr create mode 100644 samples/MAXScript/svg-renderer.ms create mode 100644 samples/MAXScript/volume-calc.ms diff --git a/samples/MAXScript/macro-1.mcr b/samples/MAXScript/macro-1.mcr new file mode 100644 index 00000000..fff41b51 --- /dev/null +++ b/samples/MAXScript/macro-1.mcr @@ -0,0 +1,29 @@ +-- Taken from an example from Autodesk's MAXScript reference: +-- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_84E24969_C175_4389_B9A6_3B2699B66785_htm + +macroscript MoveToSurface + category: "HowTo" +( + fn g_filter o = superclassof o == Geometryclass + fn find_intersection z_node node_to_z = ( + local testRay = ray node_to_z.pos [0,0,-1] + local nodeMaxZ = z_node.max.z + testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ + intersectRay z_node testRay + ) + + on isEnabled return selection.count > 0 + + on Execute do ( + target_mesh = pickObject message:"Pick Target Surface:" filter:g_filter + + if isValidNode target_mesh then ( + undo "MoveToSurface" on ( + for i in selection do ( + int_point = find_intersection target_mesh i + if int_point != undefined then i.pos = int_point.pos + )--end i loop + )--end undo + )--end if + )--end execute +)--end script diff --git a/samples/MAXScript/macro-2.mcr b/samples/MAXScript/macro-2.mcr new file mode 100644 index 00000000..e0a897cf --- /dev/null +++ b/samples/MAXScript/macro-2.mcr @@ -0,0 +1,53 @@ +-- Taken from an example from Autodesk's MAXScript reference: +-- http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_0876DF46_FAA3_4131_838D_5739A67FF2C1_htm + +macroscript FreeSpline category:"HowTo" tooltip:"FreeSpline" ( +local old_pos +local new_spline +local second_knot_set + +fn get_mouse_pos pen_pos old_pen_pos = ( + if old_pos == undefined then old_pos = old_pen_pos + if distance pen_pos old_pos > 10 then + ( + if second_knot_set then + addKnot new_spline 1 #smooth #curve pen_pos + else + ( + setKnotPoint new_spline 1 2 pen_pos + second_knot_set = true + ) + old_pos = pen_pos + updateShape new_spline + )-- end if +)-- end fn + +fn draw_new_line old_pen_pos = ( + pickPoint mouseMoveCallback:#(get_mouse_pos,old_pen_pos) +) + +undo"Free Spline"on( + new_spline = splineShape () + old_pen_pos = pickPoint () + + if old_pen_pos == #RightClick then + delete new_spline + else + ( + select new_spline + new_spline.pos = old_pen_pos + addNewSpline new_spline + addKnot new_spline 1 #smooth #curve old_pen_pos + addKnot new_spline 1 #smooth #curve old_pen_pos + second_knot_set = false + draw_new_line old_pen_pos + q = querybox "Close Spline?" title:"Free Spline" + if q then + ( + close new_spline 1 + updateshape new_spline + ) + select new_spline + )--end else +)--end undo +)--end script diff --git a/samples/MAXScript/svg-renderer.ms b/samples/MAXScript/svg-renderer.ms new file mode 100644 index 00000000..872334fe --- /dev/null +++ b/samples/MAXScript/svg-renderer.ms @@ -0,0 +1,64 @@ +-- Taken from a 3-part tutorial from Autodesk's MAXScript reference +-- Source: http://help.autodesk.com/view/3DSMAX/2016/ENU/?guid=__files_GUID_6B5EDC11_A154_4AA7_A972_A11AC36949E9_htm + +fn ColourToHex col = ( + local theComponents = #(bit.intAsHex col.r, bit.intAsHex col.g, bit.intAsHex col.b) + local theValue = "#" + for i in theComponents do + theValue += (if i.count == 1 then "0" else "") + i + theValue +) + +local st = timestamp() +local theFileName = (getDir #userscripts + "\\PolygonRendering3.svg") +local theSVGfile = createFile theFileName +format "\n" to:theSVGfile + +local theViewTM = viewport.getTM() +theViewTM.row4 = [0,0,0] + +local theViewTM2 = viewport.getTM() +local theViewSize = getViewSize() +local theViewScale = getViewSize() +theViewScale.x /= 1024.0 +theViewScale.y /= 1024.0 + +local theStrokeThickness = 3 + +gw.setTransform (matrix3 1) +for o in Geometry where not o.isHiddenInVpt and classof o != TargetObject do ( + local theStrokeColour = white + local theFillColour = o.wirecolor + + local theMesh = snapshotAsMesh o + for f = 1 to theMesh.numfaces do ( + local theNormal = normalize (getFaceNormal theMesh f) + + if (theNormal*theViewTM).z > 0 do + ( + local theFace = getFace theMesh f + local v1 = gw.transPoint (getVert theMesh theFace.x) + local v2 = gw.transPoint (getVert theMesh theFace.y) + local v3 = gw.transPoint (getVert theMesh theFace.z) + + v1.x /= theViewScale.x + v1.y /= theViewScale.y + v2.x /= theViewScale.x + v2.y /= theViewScale.y + v3.x /= theViewScale.x + v3.y /= theViewScale.y + + format "\t\n" (ColourToHex theStrokeColour) (ColourToHex theFillColour) theStrokeThickness to:theSVGfile + )--end if normal positive + )--end f loop +)--end o loop + +format "\n" to:theSVGfile +close theSVGfile +local theSVGMap = VectorMap vectorFile:theFileName alphasource:0 +local theBitmap = bitmap theViewSize.x theViewSize.y +renderMap theSVGMap into:theBitmap filter:true +display theBitmap +format "Render Time: % sec.\n" ((timestamp()-st)/1000.0) diff --git a/samples/MAXScript/volume-calc.ms b/samples/MAXScript/volume-calc.ms new file mode 100644 index 00000000..5e84e341 --- /dev/null +++ b/samples/MAXScript/volume-calc.ms @@ -0,0 +1,22 @@ +fn CalculateVolumeAndCentreOfMass obj = +( + local Volume= 0.0 + local Centre= [0.0, 0.0, 0.0] + local theMesh = snapshotasmesh obj + local numFaces = theMesh.numfaces + for i = 1 to numFaces do + ( + local Face= getFace theMesh i + local vert2 = getVert theMesh Face.z + local vert1 = getVert theMesh Face.y + local vert0 = getVert theMesh Face.x + local dV = Dot (Cross (vert1 - vert0) (vert2 - vert0)) vert0 + Volume+= dV + Centre+= (vert0 + vert1 + vert2) * dV + ) + delete theMesh + Volume /= 6 + Centre /= 24 + Centre /= Volume + #(Volume,Centre) +) From cdb5206def88932f43a33dfcb3c69603b9cb8515 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Mon, 23 Nov 2015 17:14:35 +1100 Subject: [PATCH 076/205] Define MAXScript's language traits The colour chosen to represent the language is taken from Autodesk's own colouring scheme, which should easily be recognised by their userbase. --- lib/linguist/languages.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index b14b371e..45f618de 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1956,6 +1956,15 @@ M: tm_scope: source.lisp ace_mode: lisp +MAXScript: + type: programming + color: "#00aaaa" + extensions: + - .ms + - .mcr + tm_scope: source.maxscript + ace_mode: text + MTML: type: markup color: "#b7e1f4" From 37174e1d2ccf4faba7af397bbbc41742f8cbb4f8 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Mon, 23 Nov 2015 17:34:43 +1100 Subject: [PATCH 077/205] Include MAXScript submodule in grammars directory --- .gitmodules | 3 +++ grammars.yml | 2 ++ vendor/grammars/language-maxscript | 1 + 3 files changed, 6 insertions(+) create mode 160000 vendor/grammars/language-maxscript diff --git a/.gitmodules b/.gitmodules index b164e010..da0effac 100644 --- a/.gitmodules +++ b/.gitmodules @@ -689,3 +689,6 @@ [submodule "vendor/grammars/FreeMarker.tmbundle"] path = vendor/grammars/FreeMarker.tmbundle url = https://github.com/freemarker/FreeMarker.tmbundle +[submodule "vendor/grammars/language-maxscript"] + path = vendor/grammars/language-maxscript + url = https://github.com/Alhadis/language-maxscript diff --git a/grammars.yml b/grammars.yml index 7f9c3f77..348f677f 100644 --- a/grammars.yml +++ b/grammars.yml @@ -345,6 +345,8 @@ vendor/grammars/language-javascript: vendor/grammars/language-jsoniq/: - source.jq - source.xq +vendor/grammars/language-maxscript: +- source.maxscript vendor/grammars/language-ncl: - source.ncl vendor/grammars/language-python: diff --git a/vendor/grammars/language-maxscript b/vendor/grammars/language-maxscript new file mode 160000 index 00000000..5d75d784 --- /dev/null +++ b/vendor/grammars/language-maxscript @@ -0,0 +1 @@ +Subproject commit 5d75d784a89448df87998638686cbbc85d6658f2 From d2e739ba8c22c721845fb0b3dafaf92e6e5aaa10 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Mon, 23 Nov 2015 19:02:50 +1100 Subject: [PATCH 078/205] Update MAXScript submodule to include license file See also: Alhadis/language-maxscript@96dbacf5b --- vendor/grammars/language-maxscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/grammars/language-maxscript b/vendor/grammars/language-maxscript index 5d75d784..96dbacf5 160000 --- a/vendor/grammars/language-maxscript +++ b/vendor/grammars/language-maxscript @@ -1 +1 @@ -Subproject commit 5d75d784a89448df87998638686cbbc85d6658f2 +Subproject commit 96dbacf5bfe16b6241b811e758e55ce853113b32 From f46e0536330e5b5bfd008169e2655d4f04654306 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Mon, 23 Nov 2015 19:04:09 +1100 Subject: [PATCH 079/205] Darken MAXScript's language colour Rake's tests are failing because #0AA is too similar to the colour being used by another language (Dart: #00B4AB). This commit increases contrast enough to satisfy the build (with 00A6A6 being the closest shade allowed by the current colour threshold). See also: github/linguist@3c96f9e --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 45f618de..e41f3868 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1958,7 +1958,7 @@ M: MAXScript: type: programming - color: "#00aaaa" + color: "#00a6a6" extensions: - .ms - .mcr From 68727f724a5930c05a2a15eb08cc357c2184c084 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Mon, 23 Nov 2015 13:53:53 -0600 Subject: [PATCH 080/205] Grammars update --- vendor/grammars/AutoHotkey | 2 +- vendor/grammars/InnoSetup | 2 +- vendor/grammars/SublimeClarion | 2 +- vendor/grammars/abap.tmbundle | 2 +- vendor/grammars/atom-fsharp | 2 +- vendor/grammars/elixir-tmbundle | 2 +- vendor/grammars/factor | 2 +- vendor/grammars/fancy-tmbundle | 2 +- vendor/grammars/html.tmbundle | 2 +- vendor/grammars/language-babel | 2 +- vendor/grammars/language-coffee-script | 2 +- vendor/grammars/language-javascript | 2 +- vendor/grammars/language-python | 2 +- vendor/grammars/language-yaml | 2 +- vendor/grammars/latex.tmbundle | 2 +- vendor/grammars/perl.tmbundle | 2 +- vendor/grammars/php-smarty.tmbundle | 2 +- vendor/grammars/sublime-pony | 2 +- vendor/grammars/sublime-typescript | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/vendor/grammars/AutoHotkey b/vendor/grammars/AutoHotkey index 8a9bb555..ad157bcf 160000 --- a/vendor/grammars/AutoHotkey +++ b/vendor/grammars/AutoHotkey @@ -1 +1 @@ -Subproject commit 8a9bb5559786af2373261999d14b8909fe6d0c97 +Subproject commit ad157bcfcd9ef86cc4f322011d42d362f851645e diff --git a/vendor/grammars/InnoSetup b/vendor/grammars/InnoSetup index 2853a397..9da37ae6 160000 --- a/vendor/grammars/InnoSetup +++ b/vendor/grammars/InnoSetup @@ -1 +1 @@ -Subproject commit 2853a397c7afc1368b74278e35d28c14bbc7c469 +Subproject commit 9da37ae690654daf8a2366cccb5ba1f5bac3acad diff --git a/vendor/grammars/SublimeClarion b/vendor/grammars/SublimeClarion index f070aadd..5823e7f4 160000 --- a/vendor/grammars/SublimeClarion +++ b/vendor/grammars/SublimeClarion @@ -1 +1 @@ -Subproject commit f070aadd26c5376be522bd0c9a135ff85bb76f13 +Subproject commit 5823e7f44704eabb08673a7e32b48836141a1f8e diff --git a/vendor/grammars/abap.tmbundle b/vendor/grammars/abap.tmbundle index 8ab33a89..5b7e30fd 160000 --- a/vendor/grammars/abap.tmbundle +++ b/vendor/grammars/abap.tmbundle @@ -1 +1 @@ -Subproject commit 8ab33a89780139f8ceb37cc412c30cef2f206a49 +Subproject commit 5b7e30fd8fb4bcaa78c14aaabebe98dda8ab7bbf diff --git a/vendor/grammars/atom-fsharp b/vendor/grammars/atom-fsharp index eb5553c3..2622af4d 160000 --- a/vendor/grammars/atom-fsharp +++ b/vendor/grammars/atom-fsharp @@ -1 +1 @@ -Subproject commit eb5553c3b96af24f38c7064acf1a26e74af11a30 +Subproject commit 2622af4d4fde621d8d25e85ce523a2d3c3d754bb diff --git a/vendor/grammars/elixir-tmbundle b/vendor/grammars/elixir-tmbundle index 25bf9332..4b502e43 160000 --- a/vendor/grammars/elixir-tmbundle +++ b/vendor/grammars/elixir-tmbundle @@ -1 +1 @@ -Subproject commit 25bf933246d306562790114d6fd0bccb78343161 +Subproject commit 4b502e436d150f6af97b085a763179941b3c3778 diff --git a/vendor/grammars/factor b/vendor/grammars/factor index a97f840d..e84e63fd 160000 --- a/vendor/grammars/factor +++ b/vendor/grammars/factor @@ -1 +1 @@ -Subproject commit a97f840daaaa9e0768b5d1b40ab5d01431c7db64 +Subproject commit e84e63fd0ce8871802c659cc6b77f5a1107ec88e diff --git a/vendor/grammars/fancy-tmbundle b/vendor/grammars/fancy-tmbundle index d48b6100..c9cdcd61 160000 --- a/vendor/grammars/fancy-tmbundle +++ b/vendor/grammars/fancy-tmbundle @@ -1 +1 @@ -Subproject commit d48b6100cc64621f68d4d59241e8d442fb9fcdff +Subproject commit c9cdcd61f52b2a20d7f4575ec5e6b17b83aa9d64 diff --git a/vendor/grammars/html.tmbundle b/vendor/grammars/html.tmbundle index 181a15de..a0bc0c47 160000 --- a/vendor/grammars/html.tmbundle +++ b/vendor/grammars/html.tmbundle @@ -1 +1 @@ -Subproject commit 181a15de244eb30f3d4df645dc1de38a7a420279 +Subproject commit a0bc0c479bde0d46bfec863f3262c06e768eec2d diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel index b5551805..d6cfe252 160000 --- a/vendor/grammars/language-babel +++ b/vendor/grammars/language-babel @@ -1 +1 @@ -Subproject commit b555180508e89f5bd5259b43380ad86d563df2b1 +Subproject commit d6cfe25210db89c287d8ddc63b62b15c120251be diff --git a/vendor/grammars/language-coffee-script b/vendor/grammars/language-coffee-script index cea48a62..54144829 160000 --- a/vendor/grammars/language-coffee-script +++ b/vendor/grammars/language-coffee-script @@ -1 +1 @@ -Subproject commit cea48a62ab0b33de7f28e1e11af189c8acf32ebe +Subproject commit 541448297eae6c4e9a71d60b74b18e63ca4c1b37 diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript index 91675412..efaa34df 160000 --- a/vendor/grammars/language-javascript +++ b/vendor/grammars/language-javascript @@ -1 +1 @@ -Subproject commit 9167541232bc330c0d7dd4b0f0de4cecd35c817b +Subproject commit efaa34df8b852b08af97ee85517e33235d6280e4 diff --git a/vendor/grammars/language-python b/vendor/grammars/language-python index 6d7b52b8..cdb699e7 160000 --- a/vendor/grammars/language-python +++ b/vendor/grammars/language-python @@ -1 +1 @@ -Subproject commit 6d7b52b8823954c33a698e5d10721cee326c5fa1 +Subproject commit cdb699e7a86fd9f9f84ae561abddb696aad777aa diff --git a/vendor/grammars/language-yaml b/vendor/grammars/language-yaml index 1f5a5b2d..7b2c3e09 160000 --- a/vendor/grammars/language-yaml +++ b/vendor/grammars/language-yaml @@ -1 +1 @@ -Subproject commit 1f5a5b2db026450d46c56c7263835634a4c886cc +Subproject commit 7b2c3e09b554c85453aea6942ac39ce1a77e3b51 diff --git a/vendor/grammars/latex.tmbundle b/vendor/grammars/latex.tmbundle index 0774651f..bb4edc2b 160000 --- a/vendor/grammars/latex.tmbundle +++ b/vendor/grammars/latex.tmbundle @@ -1 +1 @@ -Subproject commit 0774651f8704700e3e2cd866f5a2bab8a5a06e53 +Subproject commit bb4edc2b6af0d95c2084511ce3afc324a9c83da5 diff --git a/vendor/grammars/perl.tmbundle b/vendor/grammars/perl.tmbundle index fd81fe58..dedebdcf 160000 --- a/vendor/grammars/perl.tmbundle +++ b/vendor/grammars/perl.tmbundle @@ -1 +1 @@ -Subproject commit fd81fe586b928b4c2852b43472b37bdc45a6d074 +Subproject commit dedebdcfd43e7be93ea713c1932eb770fcbcea0d diff --git a/vendor/grammars/php-smarty.tmbundle b/vendor/grammars/php-smarty.tmbundle index 3e673e19..36c058a4 160000 --- a/vendor/grammars/php-smarty.tmbundle +++ b/vendor/grammars/php-smarty.tmbundle @@ -1 +1 @@ -Subproject commit 3e673e1980437e2fa394a3628258a61bf02d8ab7 +Subproject commit 36c058a467ba137e93a9f2cc691c268ac0b89c52 diff --git a/vendor/grammars/sublime-pony b/vendor/grammars/sublime-pony index 2b69dd3e..384ba3ed 160000 --- a/vendor/grammars/sublime-pony +++ b/vendor/grammars/sublime-pony @@ -1 +1 @@ -Subproject commit 2b69dd3e475244972c153b113fec87680e794529 +Subproject commit 384ba3ed980189f0cc140d3fb86455f880fffeb0 diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript index 51341e0a..edea3b9e 160000 --- a/vendor/grammars/sublime-typescript +++ b/vendor/grammars/sublime-typescript @@ -1 +1 @@ -Subproject commit 51341e0ae76e44c80885f70e5149ec62d593f833 +Subproject commit edea3b9e78d49a984378e21f515f6060883f9f38 From 48dfdd2dfe55f6d2ce3b38b1f89666eca376a4bc Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Mon, 23 Nov 2015 14:04:48 -0600 Subject: [PATCH 081/205] Bumping version to v4.7.2 --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index 7a91a24a..7a253190 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.7.1" + VERSION = "4.7.2" end From 73ef1bf156933b81409e7fd93cafe10b96654e67 Mon Sep 17 00:00:00 2001 From: Alhadis Date: Thu, 26 Nov 2015 05:56:37 +1100 Subject: [PATCH 082/205] Update MAXScript submodule to version v1.0 This is the first "real" version of the language package, which I pushed to Atom's packages repository earlier before. --- vendor/grammars/language-maxscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/grammars/language-maxscript b/vendor/grammars/language-maxscript index 96dbacf5..a465c9ca 160000 --- a/vendor/grammars/language-maxscript +++ b/vendor/grammars/language-maxscript @@ -1 +1 @@ -Subproject commit 96dbacf5bfe16b6241b811e758e55ce853113b32 +Subproject commit a465c9ca4adf71b8524021acb3cbe447db19753b From 24c7380765416842cc5c1ba569cf66275f22cd8b Mon Sep 17 00:00:00 2001 From: marcelo-ramires Date: Thu, 26 Nov 2015 02:55:39 -0200 Subject: [PATCH 083/205] Adding .ipynb (Jupyter Notebook) extension to python, and a sample file --- lib/linguist/languages.yml | 1 + samples/Python/JupyterNotebook.ipynb | 57 ++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 samples/Python/JupyterNotebook.ipynb diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index b14b371e..6b2801ff 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2783,6 +2783,7 @@ Python: - .tac - .wsgi - .xpy + - .ipynb filenames: - BUILD - SConscript diff --git a/samples/Python/JupyterNotebook.ipynb b/samples/Python/JupyterNotebook.ipynb new file mode 100644 index 00000000..7263209d --- /dev/null +++ b/samples/Python/JupyterNotebook.ipynb @@ -0,0 +1,57 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# HELLO LINGUIST\n", + "\n", + "** This is a sample notebook to be used by [Linguist](https://github.com/github/linguist) ** " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Here is the content: information\n" + ] + } + ], + "source": [ + "def showContent(content):\n", + " print(\"Here is the content: \" + content)\n", + "\n", + "showContent(\"information\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 06c049b8c0533add03d2412616bef316da770d8e Mon Sep 17 00:00:00 2001 From: Alhadis Date: Sat, 28 Nov 2015 04:40:29 +1100 Subject: [PATCH 084/205] Change ".ms" heuristic to accommodate MAXScript Linguist currently uses the presence of "move" commands to differentiate a GAS file from Groff. This is problematic with MAXScript, with includes a built-in function of that name. Furthermore, because of the language's exhaustive vocabulary, case insensitive nature and flexible syntax, it's difficult to impose rigid criteria on classifying it. This commit modifies the heuristic to assume the following flow: 1. If a line contains ".include" or ".global"/".globl" which doesn't follow a non-whitespace character, assume GAS. 2. Otherwise, if the line starts with a command like ".LG7E0" with a possible string of whitespace before it, assume it's also GAS. UNLESS either of the following conditions are true: 2a. The token is enclosed by a string or /* multiline comment */ 2b. The previous line ends with a backslash to denote a statement broken between lines, with possible whitespace and/or comment sequences between the backslash and the actual newline. 3. If neither of the above are met, assume the file is MAXScript. This approach may appear overly-inclusive, but given real-world usage of MAXScript includes writing brief files with few distinguishing keywords, it's reasonable to permit this leniency. --- lib/linguist/heuristics.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 0a1ab912..7c1c7db1 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -238,8 +238,10 @@ module Linguist disambiguate ".ms" do |data| if /^[.'][a-z][a-z](\s|$)/i.match(data) Language["Groff"] - elsif /((^|\s)move?[. ])|\.(include|globa?l)\s/.match(data) + elsif /(? Date: Wed, 2 Dec 2015 14:52:29 -0600 Subject: [PATCH 085/205] Adding elixir as an interpreter --- lib/linguist/languages.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index b14b371e..430fce67 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -887,6 +887,8 @@ Elixir: ace_mode: elixir filenames: - mix.lock + interpreters: + - elixir Elm: type: programming From ac559effaaa3477f74063f0606907ba5fe9c3ef0 Mon Sep 17 00:00:00 2001 From: Scott Lowe Date: Thu, 3 Dec 2015 20:49:59 +0000 Subject: [PATCH 086/205] Add octave as an alias for Matlab syntax Since Octave is a clone of Matlab, the syntax is exactly the same and hence it is desirable for highlighting to be exactly the same as well. Adding octave as an alias for Matlab will trivially provide support for highlighting Octave code, and will ensure the two languages always use the same syntax highlighting rules. --- lib/linguist/languages.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 430fce67..7e17a101 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2043,6 +2043,8 @@ Mathematica: Matlab: type: programming color: "#bb92ac" + aliases: + - octave extensions: - .matlab - .m From b802045c5c339ffe1e5a3b36d140e1d74a002dea Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Thu, 3 Dec 2015 17:27:17 -0600 Subject: [PATCH 087/205] Grammar updates --- vendor/grammars/AutoHotkey | 2 +- vendor/grammars/atom-fsharp | 2 +- vendor/grammars/atom-language-purescript | 2 +- vendor/grammars/carto-atom | 2 +- vendor/grammars/cmake.tmbundle | 2 +- vendor/grammars/factor | 2 +- vendor/grammars/haskell.tmbundle | 2 +- vendor/grammars/jade-tmbundle | 2 +- vendor/grammars/json.tmbundle | 2 +- vendor/grammars/language-babel | 2 +- vendor/grammars/language-clojure | 2 +- vendor/grammars/language-coffee-script | 2 +- vendor/grammars/language-javascript | 2 +- vendor/grammars/language-shellscript | 2 +- vendor/grammars/language-yaml | 2 +- vendor/grammars/make.tmbundle | 2 +- vendor/grammars/smali-sublime | 2 +- vendor/grammars/sublime-typescript | 2 +- vendor/grammars/sublimeprolog | 2 +- vendor/grammars/vue-syntax-highlight | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/vendor/grammars/AutoHotkey b/vendor/grammars/AutoHotkey index ad157bcf..77b8f2d7 160000 --- a/vendor/grammars/AutoHotkey +++ b/vendor/grammars/AutoHotkey @@ -1 +1 @@ -Subproject commit ad157bcfcd9ef86cc4f322011d42d362f851645e +Subproject commit 77b8f2d7857e9251e3a6b9047f3eca5f76f0be43 diff --git a/vendor/grammars/atom-fsharp b/vendor/grammars/atom-fsharp index 2622af4d..13a213e5 160000 --- a/vendor/grammars/atom-fsharp +++ b/vendor/grammars/atom-fsharp @@ -1 +1 @@ -Subproject commit 2622af4d4fde621d8d25e85ce523a2d3c3d754bb +Subproject commit 13a213e5fcd4a4ce11aa68d35f08d8a89d3e506e diff --git a/vendor/grammars/atom-language-purescript b/vendor/grammars/atom-language-purescript index 5fd5b646..21ed0c41 160000 --- a/vendor/grammars/atom-language-purescript +++ b/vendor/grammars/atom-language-purescript @@ -1 +1 @@ -Subproject commit 5fd5b6460e906045625fb5bbe7644425c73a3798 +Subproject commit 21ed0c417a143ca537afc5d65344acac3d88df94 diff --git a/vendor/grammars/carto-atom b/vendor/grammars/carto-atom index 98959093..08a80dc5 160000 --- a/vendor/grammars/carto-atom +++ b/vendor/grammars/carto-atom @@ -1 +1 @@ -Subproject commit 989590932359d32462c4904c5a71180aeda409d2 +Subproject commit 08a80dc54a9ca44c82e406e4f36cfbc8d7afa6f6 diff --git a/vendor/grammars/cmake.tmbundle b/vendor/grammars/cmake.tmbundle index 926867a4..1421c6ba 160000 --- a/vendor/grammars/cmake.tmbundle +++ b/vendor/grammars/cmake.tmbundle @@ -1 +1 @@ -Subproject commit 926867a414c1125abefa38161d82d71756f591a2 +Subproject commit 1421c6ba47ba697742d615e92852cfe106e0879e diff --git a/vendor/grammars/factor b/vendor/grammars/factor index e84e63fd..f730f81c 160000 --- a/vendor/grammars/factor +++ b/vendor/grammars/factor @@ -1 +1 @@ -Subproject commit e84e63fd0ce8871802c659cc6b77f5a1107ec88e +Subproject commit f730f81c0e7138c46e99272867304bc60fb5eb33 diff --git a/vendor/grammars/haskell.tmbundle b/vendor/grammars/haskell.tmbundle index c3137ccc..df3d5427 160000 --- a/vendor/grammars/haskell.tmbundle +++ b/vendor/grammars/haskell.tmbundle @@ -1 +1 @@ -Subproject commit c3137ccc287c096f6436a80d71b32348df1102cc +Subproject commit df3d54278a3ab3cfb30c37d94e06587478cc79ad diff --git a/vendor/grammars/jade-tmbundle b/vendor/grammars/jade-tmbundle index 6cde1da6..d27b61d1 160000 --- a/vendor/grammars/jade-tmbundle +++ b/vendor/grammars/jade-tmbundle @@ -1 +1 @@ -Subproject commit 6cde1da6888730b1b085487d1601929ddf863182 +Subproject commit d27b61d1780ff594b43d9ad04a9e896ea92b393b diff --git a/vendor/grammars/json.tmbundle b/vendor/grammars/json.tmbundle index 4100e5b0..06b38d55 160000 --- a/vendor/grammars/json.tmbundle +++ b/vendor/grammars/json.tmbundle @@ -1 +1 @@ -Subproject commit 4100e5b0162b3df7984b3b5532529b8ea78cbaa0 +Subproject commit 06b38d55326363b63c26943c6e0213988180dbca diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel index d6cfe252..3f3d2915 160000 --- a/vendor/grammars/language-babel +++ b/vendor/grammars/language-babel @@ -1 +1 @@ -Subproject commit d6cfe25210db89c287d8ddc63b62b15c120251be +Subproject commit 3f3d2915ecfeaf5e08433e9b6259ca1279f25587 diff --git a/vendor/grammars/language-clojure b/vendor/grammars/language-clojure index 3173abe9..12b73d41 160000 --- a/vendor/grammars/language-clojure +++ b/vendor/grammars/language-clojure @@ -1 +1 @@ -Subproject commit 3173abe9956a597944468fcef7b877b017149d50 +Subproject commit 12b73d41a0e0437b4899f73c5ac65caad74ac2c1 diff --git a/vendor/grammars/language-coffee-script b/vendor/grammars/language-coffee-script index 54144829..afa4f6f1 160000 --- a/vendor/grammars/language-coffee-script +++ b/vendor/grammars/language-coffee-script @@ -1 +1 @@ -Subproject commit 541448297eae6c4e9a71d60b74b18e63ca4c1b37 +Subproject commit afa4f6f157e02fd1a635357e8117e4c726a84542 diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript index efaa34df..b227486f 160000 --- a/vendor/grammars/language-javascript +++ b/vendor/grammars/language-javascript @@ -1 +1 @@ -Subproject commit efaa34df8b852b08af97ee85517e33235d6280e4 +Subproject commit b227486fc84c8af8f7439e96424c2f3724c26e44 diff --git a/vendor/grammars/language-shellscript b/vendor/grammars/language-shellscript index 331dbfea..bbaca532 160000 --- a/vendor/grammars/language-shellscript +++ b/vendor/grammars/language-shellscript @@ -1 +1 @@ -Subproject commit 331dbfea1f81ed1b82c0d638b08c8fe590a89c37 +Subproject commit bbaca532de373b77ec8073b6aa367301358d1199 diff --git a/vendor/grammars/language-yaml b/vendor/grammars/language-yaml index 7b2c3e09..dc68a99e 160000 --- a/vendor/grammars/language-yaml +++ b/vendor/grammars/language-yaml @@ -1 +1 @@ -Subproject commit 7b2c3e09b554c85453aea6942ac39ce1a77e3b51 +Subproject commit dc68a99edba8df12b54504d670df5522e92ce76d diff --git a/vendor/grammars/make.tmbundle b/vendor/grammars/make.tmbundle index 371a9e8a..e0d96dc1 160000 --- a/vendor/grammars/make.tmbundle +++ b/vendor/grammars/make.tmbundle @@ -1 +1 @@ -Subproject commit 371a9e8a56ec02289f129bb2172cb0bdc7ee6b44 +Subproject commit e0d96dc1d6ec8ef9ee421da9963d231256a2f22d diff --git a/vendor/grammars/smali-sublime b/vendor/grammars/smali-sublime index b9eba913..28a43364 160000 --- a/vendor/grammars/smali-sublime +++ b/vendor/grammars/smali-sublime @@ -1 +1 @@ -Subproject commit b9eba913977b95ac2880909d0c647003f1908172 +Subproject commit 28a4336421bff627d76c8dc27b991a4ed53a6747 diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript index edea3b9e..6540de45 160000 --- a/vendor/grammars/sublime-typescript +++ b/vendor/grammars/sublime-typescript @@ -1 +1 @@ -Subproject commit edea3b9e78d49a984378e21f515f6060883f9f38 +Subproject commit 6540de452eb08766d379fe10aba4bce9eb645ec0 diff --git a/vendor/grammars/sublimeprolog b/vendor/grammars/sublimeprolog index 9fd46df4..c71d8a1e 160000 --- a/vendor/grammars/sublimeprolog +++ b/vendor/grammars/sublimeprolog @@ -1 +1 @@ -Subproject commit 9fd46df4b63479a8672d184cd47374a044a11b11 +Subproject commit c71d8a1e0f162165cd93d0e41acb7a8984d0b30f diff --git a/vendor/grammars/vue-syntax-highlight b/vendor/grammars/vue-syntax-highlight index 3b5c4183..a2336ddc 160000 --- a/vendor/grammars/vue-syntax-highlight +++ b/vendor/grammars/vue-syntax-highlight @@ -1 +1 @@ -Subproject commit 3b5c4183bf1da404e019d3aad5bcba9d3d270067 +Subproject commit a2336ddc7ea01876caa31793f806250cad3b53e6 From ca348dd3731ac2e61ee26316919a9638507e7cf9 Mon Sep 17 00:00:00 2001 From: marcelo-ramires Date: Sat, 5 Dec 2015 03:25:38 -0200 Subject: [PATCH 088/205] Moving .ipynb extension from python language to a new language called Jupyter Notebook --- lib/linguist/languages.yml | 12 +++++++++++- .../JupyterNotebook.ipynb | 0 2 files changed, 11 insertions(+), 1 deletion(-) rename samples/{Python => Jupyter-Notebook}/JupyterNotebook.ipynb (100%) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 6b2801ff..937b971c 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1694,6 +1694,17 @@ Julia: color: "#a270ba" ace_mode: julia + Jupyter Notebook: + type: programming + ace_mode: json + color: "#F37626" + extensions: + - .ipynb + filenames: + - Notebook + aliases: + - IPython Notebook + KRL: type: programming color: "#28431f" @@ -2783,7 +2794,6 @@ Python: - .tac - .wsgi - .xpy - - .ipynb filenames: - BUILD - SConscript diff --git a/samples/Python/JupyterNotebook.ipynb b/samples/Jupyter-Notebook/JupyterNotebook.ipynb similarity index 100% rename from samples/Python/JupyterNotebook.ipynb rename to samples/Jupyter-Notebook/JupyterNotebook.ipynb From b1c057fa30657521cff59aceefdc95a2548270d6 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sat, 5 Dec 2015 13:58:14 +0100 Subject: [PATCH 089/205] Support for the Click router config language --- lib/linguist/languages.yml | 8 ++ samples/Click/sr2.click | 133 ++++++++++++++++++++++++++++++ samples/Click/thomer-nat.click | 142 +++++++++++++++++++++++++++++++++ 3 files changed, 283 insertions(+) create mode 100644 samples/Click/sr2.click create mode 100644 samples/Click/thomer-nat.click diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 14a28a12..bead453e 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -541,6 +541,14 @@ Clean: tm_scope: none ace_mode: text +Click: + type: programming + color: "#E4E6F3" + extensions: + - .click + tm_scope: none + ace_mode: text + Clojure: type: programming ace_mode: clojure diff --git a/samples/Click/sr2.click b/samples/Click/sr2.click new file mode 100644 index 00000000..52b55026 --- /dev/null +++ b/samples/Click/sr2.click @@ -0,0 +1,133 @@ +rates :: AvailableRates +elementclass sr2 { + $sr2_ip, $sr2_nm, $wireless_mac, $gateway, $probes| + + +arp :: ARPTable(); +lt :: LinkTable(IP $sr2_ip); + + +gw :: SR2GatewaySelector(ETHTYPE 0x062c, + IP $sr2_ip, + ETH $wireless_mac, + LT lt, + ARP arp, + PERIOD 15, + GW $gateway); + + +gw -> SR2SetChecksum -> [0] output; + +set_gw :: SR2SetGateway(SEL gw); + + +es :: SR2ETTStat(ETHTYPE 0x0641, + ETH $wireless_mac, + IP $sr2_ip, + PERIOD 30000, + TAU 300000, + ARP arp, + PROBES $probes, + ETT metric, + RT rates); + + +metric :: SR2ETTMetric(LT lt); + + +forwarder :: SR2Forwarder(ETHTYPE 0x0643, + IP $sr2_ip, + ETH $wireless_mac, + ARP arp, + LT lt); + + +querier :: SR2Querier(ETH $wireless_mac, + SR forwarder, + LT lt, + ROUTE_DAMPENING true, + TIME_BEFORE_SWITCH 5, + DEBUG true); + + +query_forwarder :: SR2MetricFlood(ETHTYPE 0x0644, + IP $sr2_ip, + ETH $wireless_mac, + LT lt, + ARP arp, + DEBUG false); + +query_responder :: SR2QueryResponder(ETHTYPE 0x0645, + IP $sr2_ip, + ETH $wireless_mac, + LT lt, + ARP arp, + DEBUG true); + + +query_responder -> SR2SetChecksum -> [0] output; +query_forwarder -> SR2SetChecksum -> SR2Print(forwarding) -> [0] output; +query_forwarder [1] -> query_responder; + +data_ck :: SR2SetChecksum() + +input [1] +-> host_cl :: IPClassifier(dst net $sr2_ip mask $sr2_nm, + -) +-> querier +-> data_ck; + + +host_cl [1] -> [0] set_gw [0] -> querier; + +forwarder[0] + -> dt ::DecIPTTL + -> data_ck + -> [2] output; + + +dt[1] +-> Print(ttl-error) +-> ICMPError($sr2_ip, timeexceeded, 0) +-> querier; + + +// queries +querier [1] -> [1] query_forwarder; +es -> SetTimestamp() -> [1] output; + + +forwarder[1] //ip packets to me + -> SR2StripHeader() + -> CheckIPHeader() + -> from_gw_cl :: IPClassifier(src net $sr2_ip mask $sr2_nm, + -) + -> [3] output; + +from_gw_cl [1] -> [1] set_gw [1] -> [3] output; + + input [0] + -> ncl :: Classifier( + 12/0643 , //sr2_forwarder + 12/0644 , //sr2 + 12/0645 , //replies + 12/0641 , //sr2_es + 12/062c , //sr2_gw + ); + + + ncl[0] -> SR2CheckHeader() -> [0] forwarder; + ncl[1] -> SR2CheckHeader() -> PrintSR(query) -> query_forwarder + ncl[2] -> SR2CheckHeader() -> query_responder; + ncl[3] -> es; + ncl[4] -> SR2CheckHeader() -> gw; + +} + + + +Idle -> s :: sr2(2.0.0.1, 255.0.0.0, 00:00:00:00:00:01, false, "12 60 12 1500") -> Discard; +Idle -> [1] s; +s[1] -> Discard; +s[2] -> Discard; +s[3] -> Discard; diff --git a/samples/Click/thomer-nat.click b/samples/Click/thomer-nat.click new file mode 100644 index 00000000..3523e8a7 --- /dev/null +++ b/samples/Click/thomer-nat.click @@ -0,0 +1,142 @@ +// This Click configuration implements a firewall and NAT, roughly based on the +// mazu-nat.click example. +// +// This example assumes there is one interface that is IP-aliased. In this +// example, eth0 and eth0:0 have IP addresses 66.68.65.90 and 192.168.1.1, +// respectively. There is a local network, 192.168.1.0/24, and an upstream +// gateway, 66.58.65.89. Traffic from the local network is NATed. +// +// Connections can be initiated from the NAT box itself, also. +// +// For bugs, suggestions, and, corrections, please email me. +// +// Author: Thomer M. Gil (click@thomer.com) + +AddressInfo( + eth0-in 192.168.1.1 192.168.1.0/24 00:0d:87:9d:1c:e9, + eth0-ex 66.58.65.90 00:0d:87:9d:1c:e9, + gw-addr 66.58.65.89 00:20:6f:14:54:c2 +); + + +elementclass SniffGatewayDevice { + $device | + from :: FromDevice($device) + -> t1 :: Tee + -> output; + input -> q :: Queue(1024) + -> t2 :: PullTee + -> to :: ToDevice($device); + t1[1] -> ToHostSniffers; + t2[1] -> ToHostSniffers($device); + ScheduleInfo(from .1, to 1); +} + + +device :: SniffGatewayDevice(eth0); +arpq_in :: ARPQuerier(eth0-in) -> device; +ip_to_extern :: GetIPAddress(16) + -> CheckIPHeader + -> EtherEncap(0x800, eth0-ex, gw-addr) + -> device; +ip_to_host :: EtherEncap(0x800, gw-addr, eth0-ex) + -> ToHost; +ip_to_intern :: GetIPAddress(16) + -> CheckIPHeader + -> arpq_in; + + +arp_class :: Classifier( + 12/0806 20/0001, // [0] ARP requests + 12/0806 20/0002, // [1] ARP replies to host + 12/0800); // [2] IP packets + +device -> arp_class; + +// ARP crap +arp_class[0] -> ARPResponder(eth0-in, eth0-ex) -> device; +arp_class[1] -> arp_t :: Tee; + arp_t[0] -> ToHost; + arp_t[1] -> [1]arpq_in; + + +// IP packets +arp_class[2] -> Strip(14) + -> CheckIPHeader + -> ipclass :: IPClassifier(dst host eth0-ex, + dst host eth0-in, + src net eth0-in); + +// Define pattern NAT +iprw :: IPRewriterPatterns(NAT eth0-ex 50000-65535 - -); + +// Rewriting rules for UDP/TCP packets +// output[0] rewritten to go into the wild +// output[1] rewritten to come back from the wild or no match +rw :: IPRewriter(pattern NAT 0 1, + pass 1); + +// Rewriting rules for ICMP packets +irw :: ICMPPingRewriter(eth0-ex, -); +irw[0] -> ip_to_extern; +irw[1] -> icmp_me_or_intern :: IPClassifier(dst host eth0-ex, -); + icmp_me_or_intern[0] -> ip_to_host; + icmp_me_or_intern[1] -> ip_to_intern; + +// Rewriting rules for ICMP error packets +ierw :: ICMPRewriter(rw irw); +ierw[0] -> icmp_me_or_intern; +ierw[1] -> icmp_me_or_intern; + + +// Packets directed at eth0-ex. +// Send it through IPRewriter(pass). If there was a mapping, it will be +// rewritten such that dst is eth0-in:net, otherwise dst will still be for +// eth0-ex. +ipclass[0] -> [1]rw; + +// packets that were rewritten, heading into the wild world. +rw[0] -> ip_to_extern; + +// packets that come back from the wild or are not part of an established +// connection. +rw[1] -> established_class :: IPClassifier(dst host eth0-ex, + dst net eth0-in); + + // not established yet or returning packets for a connection that was + // established from this host itself. + established_class[0] -> + firewall :: IPClassifier(dst tcp port ssh, + dst tcp port smtp, + dst tcp port domain, + dst udp port domain, + icmp type echo-reply, + proto icmp, + port > 4095, + -); + + firewall[0] -> ip_to_host; // ssh + firewall[1] -> ip_to_host; // smtp + firewall[2] -> ip_to_host; // domain (t) + firewall[3] -> ip_to_host; // domain (u) + firewall[4] -> [0]irw; // icmp reply + firewall[5] -> [0]ierw; // other icmp + firewall[6] -> ip_to_host; // port > 4095, probably for connection + // originating from host itself + firewall[7] -> Discard; // don't allow incoming for port <= 4095 + + // established connection + established_class[1] -> ip_to_intern; + +// To eth0-in. Only accept from inside network. +ipclass[1] -> IPClassifier(src net eth0-in) -> ip_to_host; + +// Packets from eth0-in:net either stay on local network or go to the wild. +// Those that go into the wild need to go through the appropriate rewriting +// element. (Either UDP/TCP rewriter or ICMP rewriter.) +ipclass[2] -> inter_class :: IPClassifier(dst net eth0-in, -); + inter_class[0] -> ip_to_intern; + inter_class[1] -> ip_udp_class :: IPClassifier(tcp or udp, + icmp type echo); + ip_udp_class[0] -> [0]rw; + ip_udp_class[1] -> [0]irw; From 5b9f9bc0e6b22e378523d341fcd055a505bb7ed7 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sat, 5 Dec 2015 14:03:02 +0100 Subject: [PATCH 090/205] Grammar for Click from Atom package --- .gitmodules | 3 +++ grammars.yml | 2 ++ lib/linguist/languages.yml | 2 +- vendor/grammars/language-click | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) create mode 160000 vendor/grammars/language-click diff --git a/.gitmodules b/.gitmodules index ee9600c0..bce8bb6f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -692,3 +692,6 @@ [submodule "vendor/grammars/FreeMarker.tmbundle"] path = vendor/grammars/FreeMarker.tmbundle url = https://github.com/freemarker/FreeMarker.tmbundle +[submodule "vendor/grammars/language-click"] + path = vendor/grammars/language-click + url = https://github.com/stenverbois/language-click.git diff --git a/grammars.yml b/grammars.yml index d812f05b..6b28c97d 100644 --- a/grammars.yml +++ b/grammars.yml @@ -324,6 +324,8 @@ vendor/grammars/kotlin-sublime-package: vendor/grammars/language-babel/: - source.js.jsx - source.regexp.babel +vendor/grammars/language-click/: +- source.click vendor/grammars/language-clojure: - source.clojure vendor/grammars/language-coffee-script: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index bead453e..0b7909c1 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -546,7 +546,7 @@ Click: color: "#E4E6F3" extensions: - .click - tm_scope: none + tm_scope: source.click ace_mode: text Clojure: diff --git a/vendor/grammars/language-click b/vendor/grammars/language-click new file mode 160000 index 00000000..1ee1fe01 --- /dev/null +++ b/vendor/grammars/language-click @@ -0,0 +1 @@ +Subproject commit 1ee1fe012be44973488d9f6666376ab72dbb024a From 7e647fd915cd25f64c17c386e2ab83b8fcd3dcf2 Mon Sep 17 00:00:00 2001 From: marcelo-ramires Date: Sat, 5 Dec 2015 18:48:17 -0200 Subject: [PATCH 091/205] Renaming the sample folder to match Jupyter Notebook's, making the language type markup, and adding a real sample file instead of a dummy one --- lib/linguist/languages.yml | 2 +- .../Jupyter Notebook/JupyterNotebook.ipynb | 210 ++++++++++++++++++ .../Jupyter-Notebook/JupyterNotebook.ipynb | 57 ----- 3 files changed, 211 insertions(+), 58 deletions(-) create mode 100644 samples/Jupyter Notebook/JupyterNotebook.ipynb delete mode 100644 samples/Jupyter-Notebook/JupyterNotebook.ipynb diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 937b971c..0eb97c5b 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1695,7 +1695,7 @@ Julia: ace_mode: julia Jupyter Notebook: - type: programming + type: markup ace_mode: json color: "#F37626" extensions: diff --git a/samples/Jupyter Notebook/JupyterNotebook.ipynb b/samples/Jupyter Notebook/JupyterNotebook.ipynb new file mode 100644 index 00000000..2ca74086 --- /dev/null +++ b/samples/Jupyter Notebook/JupyterNotebook.ipynb @@ -0,0 +1,210 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Morphological image operations\n", + "\n", + "** Bird Counting **\n", + "\n", + "I've used some simple morphological image operations from scipy.morphology module.\n", + "\n", + "The goal was to count how many birds were in an image\n", + "\n", + "Here are the steps taken :\n", + "\n", + "1. Load the image as an ndimage matrix object\n", + "2. Filter all pixels for those with a color tone less than 100/255\n", + "3. Get a binary representation of the pixels that satisfy the condition in step 2\n", + "4. Apply some dilation and erosion in order to get rid of noise and isolate the birds\n", + "5. Count all contiguous areas" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Original image:\n" + ] + }, + { + "data": { + "image/png": "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\nlQJahW0AAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import scipy.ndimage\n", + "%matplotlib inline\n", + "import matplotlib.pyplot as plt\n", + "import numpy\n", + "\n", + "\n", + "def plotImage(image, cmap='gray'):\n", + " birdsPlot = plt.imshow(image, cmap=cmap)\n", + " birdsPlot.axes.get_xaxis().set_visible(False)\n", + " birdsPlot.axes.get_yaxis().set_visible(False)\n", + " plt.show()\n", + "\n", + "birdsOriginal = scipy.ndimage.imread(\"images/birds.jpg\")\n", + "\n", + "print(\"Original image:\")\n", + "plotImage(birdsOriginal)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Binary image:\n" + ] + }, + { + "data": { + "image/png": "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\nkXQBQKP/AwtvTcpUtjvBAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "birdsColorMap = birdsOriginal < [100,100,100]\n", + "\n", + "r,g,b = birdsColorMap.T\n", + "\n", + "# Hack: Using the green channel, because in this particular image, when inverted, \n", + "# pixels with full green would mean it's a white pixel.\n", + "\n", + "binaryBirds = g.T\n", + "print(\"Binary image:\")\n", + "plotImage(binaryBirds)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADtCAYAAAAcNaZ2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAElxJREFUeJzt3X+IFGUcx/HvI5aemXfSoaeXIf2RhGKFEP1hZ4gZkpmS\nRkGEaNhF2T8FWYSaSGX1R2aQgT/+LRQsLLAOi7P6QzD16iiLpLzwOrvMuyO9k6ub/sjddvdmdmZ3\nZ57nmWfeL3jgbnZv5nu7M5977plnZpXneQIA0GOM6QIAIEsIXQDQiNAFAI0IXQDQiNAFAI0IXQDQ\naGy5B5VSzCcDgCp4nqf8ltPTBQCNCF0gRp7nybRp00yXAYsRukBMvvjiCxER6e7uNlwJbEboAjGZ\nP39+/uvVq1ebKwRWU+XuvcCJNCC60mNJKd/zKMiIxE6kccMcwN+4ceNMlwAL1RS606dPFxGCF/Az\nNDRkugRYKLYxXYIXAMLFeiJt6tSpca4OSL2+vj7TJcAysYZuT09PnKsDUq++vt50CbBM7FPGGGYA\ngGDM0wUStnXrVtMlwCKJhO4tt9ySxGoBERH58ccfxfM83wbYrqaLI6ZPny5nz54dtfzWW2+Vjo6O\n2qsDfEQNV90XJ4QcSxorgQ0SuTjCL3CBpCml5PPPPw99Hj1f2IgxXaTSwoULRSklbW1tZZ+nM3i/\n/PLLsnUwBAKRGkO3ubnZd/lDDz1Uy2qByBYvXiyfffaZ6TJEROTOO+80XQJSoOYb3kT5y814FpIW\ntB/aNK4rwrGQJcY+OYKdDLr19/eLUkrq6upGzW5Yt25dbNtZtmxZRbMnwoZCkBFBU2+u7ECeX7vr\nrru8KG6//Xbfn6fR4m5TpkzxPM/zOjo6QvfLOLZXLdOvE01f8wJyNfLwwuTJk+XPP/8MfG7Az1f0\nfKBa5fbjQnHtk0opGRkZGbX89OnTcuLECVm5cmXiNcBuXsDwQuTQjbpT+6yjqp8DgtiyL5bWUbj+\ncjV+/PHHsnTp0lhrgX2CQrfqMV2lVL6dP3++3Iar3QQwyt69e02XkJcL2b6+vooC/d57702qJKRA\n5NBVSsnff/+dD9pCjY2NZX92zZo11VUHWE4pJZMnT/ZdXk57e3tSJcFysX5GWsi6KlkVEMhvP8vt\nXzbtgzt37pTHH3888HGOCbfFPrzgZ9q0aXGuDvBVOMTQ0NBQFF4LFiwY9XzP84wEXGtrq/ZtIgWC\npjV4ZaaMhTU/Tz31lPEpHDT325kzZ6ybphVkcHDQeG20RN/32qaMVarcv4BAUsrNKDAp6DizpT7E\nT8vwQiF2Jpg0f/58q/ZBm2qBWYleBtzS0pLk6oFRcrNrvvrqK9OljKKUkjfffLNo2cDAgKFqYEpi\nwws5+/bty1+dw197QGTGjBnS1dWV/57jwk3ahxdyVq1aJc8++yw7FnDFr7/+mj8eent7DVcD3RLv\n6QJAFhnr6QIA/kfoAoBGhC4AaEToAoBGhC4AaEToAoBGhC4AaEToAoBGY00XEKTwog2uZgPgCit7\nupMmTSr6vuD+vgCQatZeBmzTx64AQKVSdxlwuWD1PE9+/vlnjdUAQDys7enmhA0r0OsFYKPU9XRz\nwkK1s7NTUyUAUDvre7oi9HYBpE9qe7oi5UP1hRde0FgJANQmFaFbzqJFi0yXAACRpWJ4QSR8iCGH\noQYANggaXrD2ijTARaWdBzoJ2WPd8MK6devyV6AVtiieeOKJhKsD4uV5nixdutR0GdDIuuGFai/3\npceANAjav9l/3ZPq2QtRvP/++6ZLAIBQzoTugw8+KPv37zddBhBo7dq1pkuABawbXujp6ZGpU6eW\n1iEiIgcOHJDly5eX/Xn+TYOtmIGTLakZXmhqasp/rZQq2gFXrFghhw4dMlEWULPHHnss0vNKOx1w\ni3U93SiCat69e3fkHRvQbXh4WMaODZ+lSU/XDUE9XadCl50Vtrl06ZLU1dVFfj77sDucujhCKcUn\nScBq1eyfBG42WDemWy12WKQdHYlscCZ0AZuUnvDNnRSmcwAnQpcdGbZZsmRJYNBy2W+2ORG6QJqc\nPHnSdAkwKPWhSy8XaXP27FlRSsm2bduKlrMvZ0Mqp4wBrsgdfwSue5yaMga4QiklL774oukyoBE9\nXQBIQGruvQAALiN0AUAjQhcANCJ0NZozZ47pEgAYxuwFTQpPWDI9CMgueroAoBGhq8GOHTuKvt+1\na5ehSgCYxjxdDfxeY4YYALcxTxcALEDoGsINq4FsInQBQCNCV4OPPvrId/m5c+c0VwLANEJXg19+\n+cV3+ZQpU/QWAsA4QhcANGLKmCZBrzNTxwA3MWUMACzAvRcM454MQLbQ09XgkUceMV0CAEvQ041Z\ntRc90MsFsoGergUI3HCe53EVH5xA6Gpy8uRJ0yWkUmnYrl692lwxQAyYMhaz0tezsBcb8lonVlOa\ncYc2pBVTxjRRShW1QoODg4aqAmALQlejCRMmBD72ww8/aKwkHX766Sff5evXr9dcCRAfhhc0Y4ih\nMlzJh7RieMESmzZtMl0CAIPo6RpA7y06XiuklfGebm7qT2trq65NAoB1tA8vvPPOO7o3aZ3rr7/e\ndAmw3KFDh0yXgIRoC91PPvkk/3XWryw6e/as7/KdO3dqriS9cv85ubgv9fT0yD333OPk7waNoTtj\nxoyi70+dOqVr01byG5O87777DFRityyeeGxqajJdAhKk7UQaVxb5K3cFW9aMHz++4gtIXH29uOVn\n+hk/keaHf584oApVGrjt7e0JVWLO5cuXOS4cZ7Sne2UbcW0i1TzPy/xrUU3YuPaa8R+hO6zs6YrQ\n283RfWDlTkK98cYbWrdbiaB7WBTKwv6Thd8xS4yHLsx65plnTJeQp5SSAwcO+AbtuXPnAn/utttu\nS7o0IDbGhxeubCeuzSCiwvfjpZdeks2bN5srJiLX9yGllIyMjAQ+hnSxdnhBRGTevHkyb94802Vk\nRml4pWVa1muvvWa6hESV+6OycuVKjZUgSdpC9+233w587NixY3Ls2DHxPC/wwgHEZ3h4eNSyNIwb\nPvfcc6ZLAGqmLXSj3gO1ubk54UrQ1dVluoSqBf2bnYY/GrWYNGmS6RIQk8THdK+++mq5fPlytGIY\nt9Im7VP4XJ1a5fq4dZYEjekm8hHs1fQ6gk4gAH6UUvm5za73cuGWREK3GmPGWHFODymStZ4flwa7\nQVvSbdmyJXRHoceiT0dHh+9yz/NS93ltYRdQpEnU36OxsTHhSpCYwlvklTYR8apppQofmzZt2qjH\ng55LS7aF2bVrl/Eas9aOHDkS+r5wnKSjBeZqEqF7ZYPehg0bAh8LMjQ0ZPzFykrjwDbb2traIgUs\n70s6m/bQLdd2797NTmWg7d+/3xsaGuLAtqRVy3TdtMjvrz2he6Ugdiq9O0BFHn74YeM1u96CrFmz\nxhsYGOD4SHkLylWjnwYctG1XTorYxO+1bm5ulu7ubt4HQ0pf98LXu9xxWfpc2Mmz8d4L+/btM7n5\nzMqd7e/u7i77vLADH7VRSsnmzZt9Z18w08ddRnu6IiIHDhyQ5cuXFy0bGBiQ+vr6pDeNAvR27UNv\nN92s7OmKiKxYscJ0CSiDHpU5YaHa1tamqRLEyXjoiozeubi5h370muy0devWwMcWLVqksRLExfjw\nQqHCWggBM/z2h6NHj8odd9xhoBqIiPzxxx9y3XXX+T42e/Zs+e677zRXhCiChhesCl2R/w76f/75\nR8aOtea2EJnjt0/wR9CskONUYyWIytox3VJKKQLXsNbWVtMloATB6g7rQhfmvfvuu6MOck6omVf4\nnjz//PP5r3lv0sW64QXY5eLFizJhwgRpa2uTxYsXmy4HBTgHYrfUjOkCiIbQtVtQ6DJ4CqQUQZtO\njOkCgEaELozJ3XUJyBJCF0YUhu2lS5cMVgLoxYk0GFHutoaAC1JzcQSyiWEGZAWhi0zLjSu3tLSY\nLgUZwfACjLDl/r3MdUVSGF4ASpw6dcp0CcggQheZNWvWrKLvC+9nACSF4QUUmTt3rnR0dOS/T+pf\nbhuGF7iFJZLEZcAIZcMMgpGRERkzhn/A4C72boiIyN69e32Xe54nN998c+zb+/77732Xm+5p3nDD\nDUa3D/cxvIC8sJ7u8ePHZd68eYltb86cOdLZ2Vm0LMkQtmGIA+7i1o7Iq3YYIe4wilqHy+PKcBdj\nuqhJrUFkS9ADpjGmi1C1nmB7+eWXq/o5AhcuInSRFxRyrobf4cOHfZdfuHBBcyXIlNy1535NRDya\nmy3n0Ucf9V1eqpZtNTQ0+K7z6NGjgdurdZuVvg4ma6C52YJylRNpKBKyP8S23ty66urqyt5PN6le\ndkdHh8ydOzf0ea728pG8oBNpDC9Ai8LwKvx6cHBQy/Y//fTTot4GgQtTCF0USTJolFK+6584cWJi\n28y5++67K3r+7t27E6oEWUfoYpRcOCqlZObMmSKS7B25Ll68GPhYueGOWrcxffr0wD8ya9eujWW7\nQClCF2WdOXNGlFKJXApcKOl/5SdOnChPPvlk0fZ+++23sj/z3nvvJVoTsokTabDKhg0b5JVXXila\npmNsNeg4YFwX1eJEGlLh1VdflS1btuS/37Nnj5btEq7QhZ4ucMX9998vH3zwQdGywjD2PI9wRmT0\ndIEQH374YdEN3EVETpw4ISL/Dz/EdWIP2UVPFyjR2dkps2fPzn+vlOIDLFExerpARHPmzJGlS5cG\nPk5vF7WgpwuEaGlpkfb29qJl9HYRJqinS+gCEfgdJwQvymF4AQAsQOgCIVpaWnyXX3PNNZorgQsY\nXgAi4Io1VIrhBVTs9ddfN10C4Bx6uvCV2y/oyf2Hni4qRU8XVWFOKhAvQjcmLoeTy79bVOvXr/dd\nnvskihtvvFFzRUgrhhdi8Ndff+XPZM+cOVPOnDljuKLale4Xvb29MmXKFEPV2CHsjw9DDSjExREJ\nCvrQxTTL+sUAlfbus/TaIBrGdIGICFwkidBNgKtjoF9//bXpEozaunWr73JX328kg+GFGimlZGRk\nxHd5mpWbIrV+/XrZsWOH5or0CrqVI1PHEBVjugkJCt0lS5bIoUOHDFQUjyi9tywGTcjxorES2I7Q\nTZCrvR8Cxp+r7zfixYk0hMrNOc21IFkPl/r6et/l8+fP11wJ0oiebgxc6PlUcjJo7ty58u233yZY\njf1ceM+RLIYXEuTCAVj6O/T390tDQ4MTv1tSsj6XGeUxvGCA53kybtw402VEUhgWSilpaGgo+/z+\n/v6kS7JeV1eX6RKQQvR0Y+Ly2X56u+XxScHwQ0/XsE2bNpkuAQkhaFEJeroVqvbqo7QfmIxfhmtq\napKenh7TZcAS9HQNciGcFixYYLoE6xG4iILQ1WDVqlWmS6jZkSNHTJcAOIHhhQr5vV7Lli2TgwcP\nZuKCAk4aAdEwvBCTyZMnF32vlJKDBw+KiMjp06cDf27FihWJ1qULQQvUhp5uFerr66Wvr883gLLQ\n2xX57/d06fcB4kZPN0b9/f2BgdPd3a25GjMIXKA6hG7MmpubAx9buHChxkoA2IjQTcDTTz/tu/zw\n4cOaKwFgG8Z0ExL3pbOF61u7dq3s2bOnqvUA0IO7jBkQ51Vc3P8ASBdOpBngd7+Fm266qap1BYVr\n2A3HAVim9NMCSj45wKPV1jZu3OiVqnZd27dvH7WuuNZNM9MeeOAB3jdHW2CuErrJt8LgvXDhQk3r\neuuttwhehxrvm7stKFcZ09XIi+mCgkuXLkldXV3g44zzpkfh8ed5nowZw4ifKzxOpLlleHhYxo4d\n6/sYoZsepccf7507gkKXP6spddVVV5kuAQko1wmCGwhdR0yaNCnfS/I8T4aHh+X8+fPyzTffGK4M\nQCGGF1Isaq+If1ntFfQe8p6lH8MLDjl27Jj8/vvvkZ7LwQvYxf9MDKxS7TgfgQvYh54uAGhE6Dps\n27ZtpksAUILQTSmlVL4FWb58ucaKEKf6+nrTJSAhhG4KFAbrxo0bI4/Vzpo1K6mSEJPt27fnv869\nt0op6evrky1bthisDElhypgDmHaUbp7nydDQkIwfPz7wObyX6cOUsYw5fvy46RIQorGxMf8Hs1zg\nwi30dB3g9x7SM7IPU/+yhZ5uhhw5csR0CYgJgeseeroO4E5V6eB3rA0NDcmMGTOkt7fX92d4L9Mr\nqKfLFWmO2blzp+kSEFGUQI3rHsywBz1dB/T19eXndXKA2i0oREOOwyRLQkK4iTlgsWuvvVYGBgZ8\nHyN004nQBSzHfGu3MHsBsBzhmg2ELmCR0uAliN1D6AKWyQUtgesmQhewEIHrLkIXADQidAFAI0IX\nADQidAFAI0IXADQqe0UaACBe9HQBQCNCFwA0InQBQCNCFwA0InQBQKN/Ae70yzlkyn1PAAAAAElF\nTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# I've chosen a disk-type structuring element so as to avoid birds' wings reaching out and touching others on dilation\n", + "struct = [[0, 0, 1, 1, 1, 0, 0],\n", + " [0, 1, 1, 1, 1, 1, 0],\n", + " [1, 1, 1, 1, 1, 1, 1],\n", + " [1, 1, 1, 1, 1, 1, 1],\n", + " [1, 1, 1, 1, 1, 1, 1],\n", + " [0, 1, 1, 1, 1, 1, 0],\n", + " [0, 0, 1, 1, 1, 0, 0]]\n", + "\n", + "\n", + "birdsImage = binaryBirds\n", + "\n", + "# Two erosions and two dilations to get rid of noise, and isolate bird structures.\n", + "birdsImage = scipy.ndimage.binary_erosion(birdsImage, struct, iterations=2).astype(birdsImage.dtype)\n", + "birdsImage = scipy.ndimage.binary_dilation(birdsImage, struct, iterations=2).astype(birdsImage.dtype)\n", + "\n", + "plotImage(birdsImage)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "18 birds have been detected.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "labeled_array, num_features = scipy.ndimage.label(birdsImage)\n", + "\n", + "print(\"%d birds have been detected.\" % num_features)\n", + "\n", + "# Plotting with a colorful color-map so as to demonstrate the contiguous areas detected\n", + "plotImage(labeled_array, 'Paired')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/samples/Jupyter-Notebook/JupyterNotebook.ipynb b/samples/Jupyter-Notebook/JupyterNotebook.ipynb deleted file mode 100644 index 7263209d..00000000 --- a/samples/Jupyter-Notebook/JupyterNotebook.ipynb +++ /dev/null @@ -1,57 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# HELLO LINGUIST\n", - "\n", - "** This is a sample notebook to be used by [Linguist](https://github.com/github/linguist) ** " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false, - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Here is the content: information\n" - ] - } - ], - "source": [ - "def showContent(content):\n", - " print(\"Here is the content: \" + content)\n", - "\n", - "showContent(\"information\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.4.3" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} From b5dfb40c7d9e301911c4ead4190be7f4ded679bd Mon Sep 17 00:00:00 2001 From: marcelo-ramires Date: Sat, 5 Dec 2015 18:57:40 -0200 Subject: [PATCH 092/205] Setting Jupyter Notebook's language property tm_scope to source.json --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 0eb97c5b..473b2e6a 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1697,6 +1697,7 @@ Julia: Jupyter Notebook: type: markup ace_mode: json + tm_scope: source.json color: "#F37626" extensions: - .ipynb From c2ca23d580e43654f4021ce3b0bc3856e365f890 Mon Sep 17 00:00:00 2001 From: marcelo-ramires Date: Sat, 5 Dec 2015 19:38:02 -0200 Subject: [PATCH 093/205] Removing extra leading space --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 473b2e6a..dc93ab2a 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1694,7 +1694,7 @@ Julia: color: "#a270ba" ace_mode: julia - Jupyter Notebook: +Jupyter Notebook: type: markup ace_mode: json tm_scope: source.json From 58191c10b352ebc6913d039aaf84888625d942e9 Mon Sep 17 00:00:00 2001 From: marcelo-ramires Date: Mon, 7 Dec 2015 14:00:18 -0200 Subject: [PATCH 094/205] Changing Jupyter Notebook color to make it more different from Mask's one --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index dc93ab2a..744af572 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1698,7 +1698,7 @@ Jupyter Notebook: type: markup ace_mode: json tm_scope: source.json - color: "#F37626" + color: "#F2650D" extensions: - .ipynb filenames: From ac81fc5da929d757f14295e1613eb929a9ba94fd Mon Sep 17 00:00:00 2001 From: marcelo-ramires Date: Mon, 7 Dec 2015 14:12:18 -0200 Subject: [PATCH 095/205] Changing Jupyter Notebook color to a further darker shade to make it even more different from Mask's one --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 744af572..d8329ce5 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1698,7 +1698,7 @@ Jupyter Notebook: type: markup ace_mode: json tm_scope: source.json - color: "#F2650D" + color: "#DA5B0B" extensions: - .ipynb filenames: From 16ea189aa69b755f8ae606449a7b26af74155bf0 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 8 Dec 2015 07:39:43 -0500 Subject: [PATCH 096/205] Colour switch --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index d8329ce5..aae3af98 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -142,7 +142,7 @@ Agda: Alloy: type: programming # 'modeling' would be more appropiate - color: "#cc5c24" + color: "#64C800" extensions: - .als ace_mode: text From 683925fcd5a6c5fdce18c25a32a1fc1f6058723b Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 8 Dec 2015 22:28:46 -0500 Subject: [PATCH 097/205] Updating grammars --- vendor/grammars/Elm.tmLanguage | 2 +- vendor/grammars/NimLime | 2 +- vendor/grammars/atom-fsharp | 2 +- vendor/grammars/factor | 2 +- vendor/grammars/language-babel | 2 +- vendor/grammars/language-gfm | 2 +- vendor/grammars/language-yaml | 2 +- vendor/grammars/matlab.tmbundle | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/vendor/grammars/Elm.tmLanguage b/vendor/grammars/Elm.tmLanguage index f17b1914..ab79692f 160000 --- a/vendor/grammars/Elm.tmLanguage +++ b/vendor/grammars/Elm.tmLanguage @@ -1 +1 @@ -Subproject commit f17b1914dd6447bb5f3168080d3aa8e95d051efb +Subproject commit ab79692fed628c9b08b7d11f21d9288cdf6b4e84 diff --git a/vendor/grammars/NimLime b/vendor/grammars/NimLime index 7aea8846..4e60e565 160000 --- a/vendor/grammars/NimLime +++ b/vendor/grammars/NimLime @@ -1 +1 @@ -Subproject commit 7aea8846e1ee162001393bbb4349388a35379767 +Subproject commit 4e60e5657fcddde6bf8b4bce0030ecb3154e7dfa diff --git a/vendor/grammars/atom-fsharp b/vendor/grammars/atom-fsharp index 13a213e5..500cdb5f 160000 --- a/vendor/grammars/atom-fsharp +++ b/vendor/grammars/atom-fsharp @@ -1 +1 @@ -Subproject commit 13a213e5fcd4a4ce11aa68d35f08d8a89d3e506e +Subproject commit 500cdb5f045ff6a121fa2732bbd56c4da18bdae1 diff --git a/vendor/grammars/factor b/vendor/grammars/factor index f730f81c..9d956025 160000 --- a/vendor/grammars/factor +++ b/vendor/grammars/factor @@ -1 +1 @@ -Subproject commit f730f81c0e7138c46e99272867304bc60fb5eb33 +Subproject commit 9d95602591cf231a3f2332269d81d60068d1aa76 diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel index 3f3d2915..4b0e9658 160000 --- a/vendor/grammars/language-babel +++ b/vendor/grammars/language-babel @@ -1 +1 @@ -Subproject commit 3f3d2915ecfeaf5e08433e9b6259ca1279f25587 +Subproject commit 4b0e9658e0a8bab71983ea5941f99b552cf00848 diff --git a/vendor/grammars/language-gfm b/vendor/grammars/language-gfm index 597d382a..e5b24d57 160000 --- a/vendor/grammars/language-gfm +++ b/vendor/grammars/language-gfm @@ -1 +1 @@ -Subproject commit 597d382a8c5a23a3f358f6edb81e3f0ff6e17a30 +Subproject commit e5b24d57e73463f747fae061d6e9d59a74b9f927 diff --git a/vendor/grammars/language-yaml b/vendor/grammars/language-yaml index dc68a99e..e1d62e5a 160000 --- a/vendor/grammars/language-yaml +++ b/vendor/grammars/language-yaml @@ -1 +1 @@ -Subproject commit dc68a99edba8df12b54504d670df5522e92ce76d +Subproject commit e1d62e5aff1c475ea3eedc3b03a52ce0e750ec89 diff --git a/vendor/grammars/matlab.tmbundle b/vendor/grammars/matlab.tmbundle index e1460dd9..2cdc1f84 160000 --- a/vendor/grammars/matlab.tmbundle +++ b/vendor/grammars/matlab.tmbundle @@ -1 +1 @@ -Subproject commit e1460dd9e71a9cb879a438ab31a18f31c2ced107 +Subproject commit 2cdc1f841443e4bc8b94f42f5e86431b31e04387 From d72114083bb64daf1c16202dc2daeb67643a435e Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 8 Dec 2015 22:30:17 -0500 Subject: [PATCH 098/205] Bumping version to v4.7.3 --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index 7a253190..b389c1c9 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.7.2" + VERSION = "4.7.3" end From 92ed2d189e26d73661d399271991d2cf16c2e838 Mon Sep 17 00:00:00 2001 From: Patrick Reynolds Date: Wed, 9 Dec 2015 23:24:32 -0600 Subject: [PATCH 099/205] Catch `ENOENT` in `clear_cache` There's no need for `clear_cache` to fail if the cache doesn't exist, either because we call `clear_cache` twice or because no cache was previously written on this particular repo. --- bin/git-linguist | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/git-linguist b/bin/git-linguist index 9541cf82..37d46b64 100755 --- a/bin/git-linguist +++ b/bin/git-linguist @@ -50,6 +50,7 @@ class GitLinguist def clear_language_stats File.unlink(cache_file) + rescue Errno::ENOENT end def disable_language_stats From 8522dc1d33c2ea3c293abedafd47a0eeb45e4316 Mon Sep 17 00:00:00 2001 From: William Claude Tumeo Date: Sun, 13 Dec 2015 00:16:09 -0200 Subject: [PATCH 100/205] Add Ren'Py language and grammars --- .gitmodules | 3 + grammars.yml | 2 + lib/linguist/languages.yml | 11 + samples/RenPy/example.rpy | 1427 ++++++++++++++++++++++++++++++++++++ 4 files changed, 1443 insertions(+) create mode 100644 samples/RenPy/example.rpy diff --git a/.gitmodules b/.gitmodules index 1c7b78a3..8234378a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -698,3 +698,6 @@ [submodule "vendor/grammars/language-maxscript"] path = vendor/grammars/language-maxscript url = https://github.com/Alhadis/language-maxscript +[submodule "vendor/grammars/language-renpy"] + path = vendor/grammars/language-renpy + url = https://github.com/williamd1k0/language-renpy.git diff --git a/grammars.yml b/grammars.yml index b3278e14..8f7b1173 100644 --- a/grammars.yml +++ b/grammars.yml @@ -358,6 +358,8 @@ vendor/grammars/language-python: - source.regexp.python - text.python.console - text.python.traceback +vendor/grammars/language-renpy: +- source.renpy vendor/grammars/language-shellscript: - source.shell - text.shell-session diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 364a6bf9..426ed070 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2991,6 +2991,17 @@ RenderScript: tm_scope: none ace_mode: text +Ren'Py: + type: programming + group: Python + aliases: + - renpy + color: "#ff7f7f" + extensions: + - .rpy + tm_scope: source.renpy + ace_mode: python + RobotFramework: type: programming extensions: diff --git a/samples/RenPy/example.rpy b/samples/RenPy/example.rpy new file mode 100644 index 00000000..90c3c286 --- /dev/null +++ b/samples/RenPy/example.rpy @@ -0,0 +1,1427 @@ +### Demo Script Example ### + +# This script, but not the artwork associated with it, is in the +# public domain. Feel free to use it as the basis for your own +# game. + +# If you're trying to understand this script, I recommend skipping +# down to the line beginning with 'label start:', at least on your +# first read-through. + +# This init block runs first, and sets up all sorts of things that +# are used by the rest of the game. Variables that are set in init +# blocks are _not_ saved, unless they are changed later on in the +# program. + +init: + + # Set up the size of the screen, and the window title. + $ config.screen_width = 800 + $ config.screen_height = 600 + $ config.window_title = "The Ren'Py Demo Game" + + # Declare the images that are used in the program. + + # Backgrounds. + image bg carillon = "carillon.jpg" + image bg whitehouse = "whitehouse.jpg" + image bg washington = "washington.jpg" + image bg onememorial = "1memorial.jpg" + image black = Solid((0, 0, 0, 255)) + + # Character pictures. + image eileen happy = "9a_happy.png" + image eileen vhappy = "9a_vhappy.png" + image eileen concerned = "9a_concerned.png" + + # A character object. This object lets us have the character say + # dialogue without us having to repeatedly type her name. It also + # lets us change the color of her name. + + $ e = Character('Eileen', color=(200, 255, 200, 255)) + +# The start label marks the place where the main menu jumps to to +# begin the actual game. + +label start: + + # The save_name variable sets the name of the save game. Like all + # variables declared outside of init blocks, this variable is + # saved and restored with a save file. + $ save_name = "Introduction" + + # This variable is only used by our game. If it's true, it means + # that we won the date. + $ date = False + + # Clear the game runtime timer, so it doesn't reflect time spent + # sitting at the main menu. + $ renpy.clear_game_runtime() + + # Start some music playing in the background. + $ renpy.music_start('sun-flower-slow-drag.mid') + + # Now, set up the first scene. We first fade in our washington + # background, and then we dissolve in the image of Eileen on top + # of it. + scene bg washington with fade + show eileen vhappy with dissolve + + # Store the current version of Ren'Py into a variable, so we can + # interpolate it into the next line. + $ version = renpy.version() + + # Display a line of dialogue. In this case, we manually specify + # who's saying the line of dialogue. We also interpolate in the + # version of Ren'Py we're using. + "Girl" "Hi, and welcome to the %(version)s demo program." + + # This instantly replaces the very happy picture of Eileen with + # one showing her merely happy. It demonstrates how the show + # statement lets characters change emotions. + show eileen happy + + # Another line of dialogue. + "Girl" "My name is Eileen, and while I plan to one day star in a + real game, for now I'm here to tell you about Ren'Py." + + # This line used the e character object, which displays Eileen's + # name in green. The use of a short name for a character object + # lets us save typing when writing the bulk of the dialogue. + e "Ren'Py is a language and engine for writing and playing visual + novel games." + + e "Our goal is to allow people to be able to write the script for + a game, and with very little effort, turn that script into + a working game." + + e "I can tell you about the features of Ren'Py games, or how to write + your own game. What do you want to know about?" + + # This variable is used to save the choices that have been made in + # the main menu. + $ seen_set = [ ] + +label choices: + + # We change the save name here. + $ save_name = "Question Menu" + + # This is the main menu, that lets the user decide what he wants + # to hear about. + menu: + + # The set menu clause ensures that each menu choice can only + # be chosen once. + set seen_set + + # This is a menu choice. When chosen, the statements in its + # block are executed. + "What are some user-visible features of Ren'Py games?": + + # We call the features label. The from clause needs to be + # here to ensure that save games work, even after we + # change the script. It was added automatically. + call features from _call_features_1 + + # When we're done talking about features, jump back up + # to choices. + jump choices + + # Another choice. + "How do I write my own games with it?": + call writing from _call_writing_1 + jump choices + + "Can you demonstrate more features to me?": + call demonstrate from _call_demonstrate_1 + jump choices + + # This choice has a condition associated with it. It is only + # displayed if the condition is true (in this case, if we have + # selected at least one other choice has been chosen.) + "Where can I find out more?" if seen_set: + call find_out_more from _call_find_out_more_1 + jump choices + + "Why are we in Washington, DC?": + call washington from _call_washington_1 + jump choices + + "I think I've heard enough." if seen_set: + jump ending + + +# This is the section on writing games. +label writing: + + # Change the title of the save games. + $ save_name = "Writing Games" + + # We start off with a bunch of dialogue. + e "If you want to write a game, we recommend that you read the + Ren'Py reference, which you can get from our web page, + http://www.bishoujo.us/renpy/." + + e "But here, we'll go over some of the basics of writing Ren'Py + scripts. It might make sense if you open the source for this + game." + + e "The source for this game can be found in the file + game/script.rpy." + + e "The goal of Ren'Py is to make writing the game similar to + typing up the script on the computer." + + e "For example, a line of dialogue is expressed by putting the + character's name next to the dialogue string." + + # A string by itself like this displays without a name associated + # with it. So it's useful for dialogue and narration. + "I somehow remember that strings by themselves are displayed as + thoughts or narration." + + e "The menu statement makes it easy to create menus." + + e "A number of statements let you control what is shown on the + screen." + + # This scene statement has a with clause associated with it. In + # this case (based on what is defined in the init clause at the + # top of this script), it causes a fade to black, and then back + # to the new scene. + scene bg whitehouse with fade + + e "The scene statement clears the scene list, which is the list of + things that are shown on the screen." + + # This shows an image, and dissolves it in. + show eileen happy with dissolve + + e "The show statement shows another image on the screen." + + # The at clause here, displays the character on the left side of + # the screen. The with clause causes us to slide from the old + # position to the new position. + show eileen happy at left with move + + e "Images can take at clauses that specify where on the screen + they are shown." + + show eileen vhappy at left + + e "Showing a new image with the same first part of the name + replaces the image in the scene list." + + hide eileen with dissolve + + e "Finally, the hide statement hides an image, which is useful + when a character leaves the scene." + + show eileen happy with dissolve + + e "Don't worry, I'm not going anywhere." + + e "The with statement is used to cause transitions to + happen. Transitions like fade..." + + # This statement hides the transient stuff from being included + # in the next fade. + with None + + # This with statement causes things to fade without changing the + # scene. + with fade + + e "... or dissolve ..." + + # In this block, the scene statement clears the scene list. So we + # have to reshow the eileen happy image, so that it appears that + # just the background is dissolving. Sneaky. + with None + scene bg washington + show eileen happy + with dissolve + + e "... are easily invoked." + + e "We now provide a series of user-interface functions, that allow + the programmer to create fairly complex interfaces." + + e "Ren'Py also includes a number of control statements, and even + lets you include python code." + + e "Rather than go into this here, you can read all about it in the + reference." + + e "You can see a number of features in action by asking me to + demonstrate them at the next menu." + + e "If you want to make changes, you can edit the script for this + game by editing game/script.rpy" + + e "When you've made a change, just re-run the game to see your + change in action." + + e "Would you like to know about something else?" + + # We return back up to the menu that lets the user pick a topic. + return + +# This ends the well-commented portion of this script. + +label features: + + $ save_name = "Features" + + e "Ren'Py provides a number of gameplay features, giving the user + a good experience while freeing up the game author to write his + game." + + e "What are some of these features? Well, first of all, we take + care of displaying the screen, as well as dialogue and menus." + + e "You can navigate through the game using the keyboard or the + mouse. If you've gotten this far, you've probably figured that + out already." + + e "Right-clicking or pressing escape will bring you to the game + menu." + + e "The game menu lets you save or load the game. Ren'Py doesn't + limit the number of save slots available. You can create as + many slots as you can stand." + + e "A preferences screen on the game menu lets you change the + fullscreen mode, control skipping, text speed, and + transitions, and turn sound and music on and off." + + e "The game menu also lets you restart or quit the game. But you + wouldn't want to do that, would you?" + + e "Finally, the game menu lets you set up the game + preferences. These preferences are saved between games." + + show eileen vhappy + + e "The next feature is really neat." + + show eileen happy + + menu rollback_menu: + "Would you like to hear about rollback?" + + "Yes.": + pass + + "No.": + jump after_rollback + + + e "Rollback is a feature that only Ren'Py has. It lets you go back + in time in a game." + + e "For example, you can go back to a menu and save or make a + different choice." + + e "You can access it by pressing page up or scrolling up on your + mouse wheel." + + e "Why don't you try it by going back to the last menu and + choosing 'No.' instead of 'Yes.'" + + e "Press page up or scroll up the mouse wheel." + + show eileen concerned + + e "Well, are you going to try it?" + + e "Your loss." + + e "Moving on." + +label after_rollback: + + show eileen happy + + e "Ren'Py gives you a few ways of skipping dialogue. Pressing + control quickly skips dialogue you've seen at least once." + + e "Pressing Tab toggles the skipping of dialogue you've seen at + least once." + + e "Pressing page down or scrolling the mouse wheel down will let + you skip dialogue you've seen this session. This is useful + after a rollback." + + e "If you want to try these, you might want to rollback a bit + first, so you can skip over something you've seen already." + + e "Finally, Ren'Py has predictive image loading, so you rarely + have to wait for a new image to load." + + e "Remember, all these features are built into the engine or + standard library. So every game written with Ren'Py has them." + + e "Is there anything else you'd like to know about?" + + return + + +label find_out_more: + + $ save_name = "Find Out More" + + e "There are a few places you can go to find out more about + Ren'Py." + + e "The Ren'Py homepage, http://www.bishoujo.us/renpy/, is probably + the best place to start." + + e "There, you can download new versions of Ren'Py, and read the + tutorial online." + + e "If you have questions, the best place to ask them is the Ren'Py + forum of the Lemmasoft forums." + + e "Just go to http://lemmasoft.renai.us/forums/, and click on + Ren'Py." + + e "We thank Blue Lemma for hosting our forum." + + e "Finally, feel free to email or IM us if you need help. You can + get the addresses to use from http://www.bishoujo.us/renpy/." + + e "We really want people to make their own games with Ren'Py, and + if there's anything we can do to help, just tell us." + + e "Is there anything I can help you with now?" + + return + +label washington: + + $ save_name = "Washington, DC" + + e "We're in Washington, DC because over Summer 2004 American + Bishoujo's home base was just outside of DC." + + scene bg whitehouse + show eileen happy at left + with fade + + e "Even though we've moved back to New York, we took a bunch of + pictures, and decided to use them." + + show eileen concerned at left + + e "It was easier than drawing new pictures for this demo." + + show eileen happy at left + + e "Do you have a favorite landmark in or around DC?" + + menu: + + "The White House.": + + e "I was supposed to go on a tour of the West Wing, once." + + show eileen concerned + + e "They wouldn't let us in." + + e "The secret service guy who was supposed to show us + around was out of town that day." + + e "Too bad." + + "The National Mall.": + + e "It's always fun to go down to the national mall." + + e "You can visit the monuments, or see one of the + museums." + + e "I guess you could run out of things to do after a while + but I didn't over the course of a summer." + + "The Netherlands Carillon.": + jump netherlands + + jump post_netherlands + +label netherlands: + + show eileen vhappy at left + + e "You've been to the Netherlands Carillon?" + + scene bg carillon + show eileen vhappy at left + with dissolve + + e "It may not be much to look at but the sound of the bells is + really neat." + + e "I love going there. Saturdays during the summer, they have + these recitals in the park where a guy comes and plays the + bells live." + + e "You can climb to the top and talk to him, if you're not afraid + of heights." + + e "Once, I saw a little girl there, maybe three or four years old. + The guy played the bumblebee song for here, and he even let her play the last + note. It was so cute!" + + e "I haven't been there for so long." + + menu: + "Would you like to go there sometime?": + + e "You mean, together?" + + e "Sure, why not. How does next Saturday sound?" + + e "It's a date." + + $ date = True + + "That sounds nice.": + + show eileen happy at left + + e "Well, it is." + +label post_netherlands: + + scene bg washington + show eileen happy + with fade + + e "Anyway, is there anything else you want to know about Ren'Py?" + + return + +label ending: + + $ save_name = "Ending" + + e "Well, that's okay." + + e "I hope you'll consider using Ren'Py for your next game + project." + + show eileen vhappy + + e "Thanks for viewing this demo!" + + if date: + e "And I'll see you on Saturday." + + scene black with dissolve + + "Ren'Py and the Ren'Py demo were written by PyTom." + + 'The background music is "Sun Flower Slow Drag" by S. Joplin + (1868-1917). Thanks to the Mutopia project for making it + available.' + + 'The author would like to thank everyone who makes original + English-language bishoujo games, and the people on the Lemmasoft forums + who encouraged him.' + + "We can't wait to see what you do with this. Good luck!" + + $ minutes, seconds = divmod(int(renpy.get_game_runtime()), 60) + "It took you %(minutes)d minutes and %(seconds)d seconds to + finish this demo." + + $ renpy.full_restart() + + +label speedtest: + + with None + scene bg whitehouse + show eileen happy + with dissolve + + e "Okay, I'm going to run the speedtest on your system." + + e "I'll only be testing the performance of the dissolve + transition. It taxes your system the most, as it needs to + redraw the entire screen each frame." + + $ frames = config.frames + + with None + scene bg washington + show eileen happy + with Dissolve(5.0) + + $ frames = config.frames - frames + $ fps = frames / 5.0 + + e "Well, your system displayed %(frames)d frames in five + seconds. That's %(fps).1f fps." + + e "Remember, this is the worst-case speed, as usually we can just + draw the parts of the screen that have changed." + + e "Thanks for viewing the secret speed test." + + return + +# Setup the secret key for the speedtest. +init: + python: + config.keymap['speedtest'] = [ 'S' ] + config.underlay.append(renpy.Keymap(speedtest=renpy.curried_call_in_new_context('speedtest'))) + + +init: + + # This is just some example code to show the ui functions in + # action. You probably want to delete this (and the call to + # day_planner above) from your game. This code isn't really all + # that useful except as an example. + + python: + def day_planner(): + + periods = [ 'Morning', 'Afternoon', 'Evening' ] + choices = [ 'Study', 'Exercise', + 'Eat', 'Drink', 'Be Merry' ] + + plan = { 'Morning' : 'Eat', + 'Afternoon' : 'Drink', + 'Evening' : 'Be Merry' } + + day = 'March 25th' + + stats = [ + ('Strength', 100, 10), + ('Intelligence', 100, 25), + ('Moxie', 100, 100), + ('Chutzpah', 100, 75), + ] + + editing = None + + def button(text, selected, returns, **properties): + style = 'button' + style_text = 'button_text' + + if selected: + style='selected_button' + style_text='selected_button_text' + + ui.button(clicked=ui.returns(returns), + style=style, **properties) + ui.text(text, style=style_text) + + + while True: + + # Stats Window + ui.window(xpos=0, + ypos=0, + xanchor='left', + yanchor='top', + xfill=True, + yminimum=200, + ) + + ui.vbox() + + ui.text('Statistics') + ui.null(height=20) + + for name, range, value in stats: + + ui.hbox() + ui.text(name, minwidth=150) + ui.bar(600, 22, range, value, ypos=0.5, yanchor='center') + ui.close() + + ui.close() + + + + + # Period Selection Window. + ui.window(xpos=0, + ypos=200, + xanchor='left', + yanchor='top', + xfill=False, + xminimum=300 + ) + + ui.vbox(xpos=0.5, xanchor='center') + ui.text(day, xpos=0.5, xanchor='center', textalign=0.5) + ui.null(height=20) + + for i in periods: + face = i + ": " + plan[i] + button(face, editing == i, ("edit", i)) + + ui.null(height=20) + ui.textbutton("Continue", clicked=ui.returns(("done", True))) + ui.null(height=20) + ui.close() + + + # Choice window. + if editing: + ui.window(xpos=300, + ypos=200, + xanchor='left', + yanchor='top', + xfill=False, + xminimum=500 + ) + + ui.vbox() + ui.text("What will you do in the %s?" % editing.lower()) + ui.null(height=20) + + for i in choices: + button(i, plan[editing] == i, ("set", i), + xpos=0, xanchor='left') + + ui.close() + + # Window at the bottom. + ui.window() + ui.vbox() + ui.text("To get to the next screen, click the 'Continue' button.") + ui.close() + + type, value = ui.interact() + + if type == "done": + break + + if type == "edit": + editing = value + + if type == "set": + plan[editing] = value + editing = None + + return plan + +init: + image movie = Movie() + + python: + povname = "" + pov = DynamicCharacter("povname", color=(255, 0, 0, 255)) + + $ ectc = Character('Eileen', color=(200, 255, 200, 255), + ctc = anim.Blink("arrow.png")) + + $ ectcf = Character('Eileen', color=(200, 255, 200, 255), + ctc = anim.Blink("arrow.png", xpos=760, ypos=560), + ctc_position="fixed") + + image eileen animated = Animation( + "9a_vhappy.png", 1.0, + "9a_happy.png", 1.0) + + image smanim = anim.SMAnimation( + "r", + anim.State("r", Solid((255, 0, 0, 255))), + anim.State("g", Solid((0, 255, 0, 255))), + anim.State("b", Solid((0, 0, 255, 255))), + + anim.Edge("r", .5, "g", dissolve), + anim.Edge("r", .5, "b", dissolve), + + anim.Edge("g", .5, "r", dissolve), + anim.Edge("g", .5, "b", dissolve), + + anim.Edge("b", .5, "r", dissolve), + anim.Edge("b", .5, "g", dissolve), + ) + + image cyan base = Image("cyan.png") + + image cyan crop = im.Crop("cyan.png", 100, 0, 100, 200) + + image cyan composite = im.Composite((200, 300), + (0, 0), "cyan.png", + (0, 50), "cyan.png", + (0, 100), "cyan.png") + + image cyan green = im.Map("cyan.png", bmap=im.ramp(0, 0)) + + image cyan alpha = im.Alpha("cyan.png", 0.5) + image eileen alpha = im.Alpha("9a_happy.png", 0.5) + + $ cyanpos = Position(xpos=700, xanchor='right', ypos=100, yanchor='top') + +init: + + $ slowcirciris = ImageDissolve("circiris.png", 5.0, 8) + $ circirisout = ImageDissolve("circiris.png", 1.0, 8) + $ circirisin = ImageDissolve("circiris.png", 1.0, 8, reverse=True) + $ demotrans = ImageDissolve("demotrans.png", 3.0, 128) + + image circiris = "circiris.png" + +label demonstrate: + + scene bg washington + show eileen happy + + e "I can give you a demonstration of some of the features in + Ren'Py, but you'll have to tell me what it is you'd like to + have demonstrated." + + menu demo_menu: + + "Simple transitions, updated in 4.8.5": + + e "Okay, I can tell you about simple transitions. We call + them simple because they aren't that flexible." + + e "But don't let that get you down, since they're the + transitions you'll probably use the most." + + with None + scene bg whitehouse + show eileen happy + with dissolve + + e "The dissolve transition is probably the most useful, + blending one scene into another." + + with None + with fade + + e "The fade transition fades to black, and then fades back + in to the new scene." + + e "If you're going to stay at a black screen, you'll + probably want to use dissolve rather than fade." + + with None + scene bg washington + show eileen happy + with pixellate + + e "The pixellate transition pixellates out the old scene, + switches to the new scene, and then unpixellates that." + + e "It's probably not appropriate for most games, but we + think it's kind of neat." + + e "Finally, we can point out that motions can be used as + transitions." + + "..." + + "......" + + $ renpy.play('punch.wav') + with vpunch + + e "Hey! Pay attention." + + e "I was about to demonstrate vpunch... well, I guess I just + did." + + $ renpy.play('punch.wav') + with hpunch + + e "We can also shake the screen horizontally, with hpunch." + + "ImageDissolve transitions, added in 4.8.7.": + + e "ImageDissolve allows us to have dissolve transitions that are + controlled by images." + + e "This lets us specify very complex transitions, fairly + simply." + + e "Let's try some, and then I'll show how they work." + + e "There are two ImageDissolve transitions present by + default in the standard library." + + scene black with blinds + scene bg washington + show eileen happy + with blinds + + e "The blinds transition opens and closes what looks like + vertical blinds." + + scene black with squares + scene bg washington + show eileen happy + with squares + + e "The squares transition uses these squares to show + things." + + e "I'm not sure why anyone would want to use it, but it + was used in some translated games, so we added it." + + e "There are also a few transitions that aren't in the + standard library." + + e "These ones require images the size of the screen, and + so we couldn't include them as the size of the screen + can change from game to game." + + e "You can find them defined in the source of the demo + script." + + scene black with circirisin + + e "We can hide things with a circirisin..." + + with None + scene bg washington + show eileen happy + with circirisout + + e "... and show them again with a circirisout." + + e "It's even possible to have weird custom transitions." + + scene circiris with demotrans + + e "What we're showing here is the picture that's used in + the circiris transitions." + + e "If you take a look, the center of it is white, while + the edges are darker." + + e "When we use an ImageDissolve, the white will dissolve + in first, followed by progressively darker colors." + + e "Let's try it." + + with None + scene bg washington + show eileen happy + with slowcirciris + + + e "It's also possible to reverse the transition, so that + the black pixels are dissolved in first." + + "CropMove transitions, added in 4.5.": + + e "The CropMove transition class lets us provide a wide + range of transition effects." + + hide eileen with dissolve + + e "I'll stand offscreen, so you can see some of its modes. I'll read + out the mode name after each transition." + + scene bg whitehouse with wiperight + + e "We first have wiperight..." + + scene bg washington with wipeleft + + e "...followed by wipeleft... " + + scene bg whitehouse with wipeup + + e "...wipeup..." + + scene bg washington with wipedown + + e "...and wipedown." + + e "Next, the slides." + + scene bg whitehouse with slideright + + e "Slideright..." + + scene bg washington with slideleft + + e "...slideleft..." + + scene bg whitehouse with slideup + + e "...slideup..." + + scene bg washington with slidedown + + e "and slidedown." + + e "While the slide transitions slide in the new scene, the + slideaways slide out the old scene." + + scene bg whitehouse with slideawayright + + e "Slideawayright..." + + scene bg washington with slideawayleft + + e "...slideawayleft..." + + scene bg whitehouse with slideawayup + + e "...slideawayup..." + + scene bg washington with slideawaydown + + e "and slideawaydown." + + e "We also have a couple of transitions that use a + rectangular iris." + + scene bg whitehouse with irisout + + e "There's irisout..." + + with None + scene bg washington + show eileen happy + with irisin + + e "... and irisin." + + e "It's enough to make you feel a bit dizzy." + + "Positions and movement, updated in 4.8.": + + e "I'm not stuck standing in the middle of the screen, + even though I like being the center of attention." + + e "Positions, given with an at clause, specify where I'm + standing." + + e "The move transition moves around images that have + changed position." + + e "For example..." + + show eileen happy at offscreenleft with move + + e "I can move over to the offscreenleft position, just off + the left side of the screen." + + show eileen happy at left with move + + e "The left position has my left side border the left + margin of the screen." + + show eileen happy at center with move + + e "I can also move to the center..." + + show eileen happy at right with move + + e "... the right ..." + + show eileen happy at offscreenright with move + + e "... or even to offscreenright, off the right-hand side + of the screen." + + show eileen happy at right with move + + e "We don't limit you to these five positions either. You + can always create your own Position objects." + + # This is necessary to restart the time at which we are + # shown. + hide eileen happy + + show eileen happy at Move((1.0, 1.0, 'right', 'bottom'), + (0.0, 1.0, 'left', 'bottom'), + 4.0, repeat=True, bounce=True) + + e "It's also possible to have a movement happen while + showing dialogue on the screen, using the Move function." + + e "Move can repeat a movement, and even have it bounce + back and forth, like I'm doing now." + + scene bg onememorial at Pan((0, 800), (0, 0), 10.0) with dissolve + + e "Finally, we can pan around an image larger than the + screen, using the Pan function in an at + clause." + + e "That's what we're doing now, panning up a picture of + the memorial to the Big Red One." + + with None + scene bg washington + show eileen happy + with dissolve + + "Animation, updated in 4.8.5": + + e "Ren'Py supports a number of ways of creating + animations." + + e "These animations let you vary images, independent of + the user's clicks." + + show eileen animated + + e "For example, I'm switching my expression back and + forth, once a second." + + e "Even though you clicked, I'm still doing it." + + e "This is an example of the Animation function at work." + + show eileen happy + + e "The Animation function is limited to simple lists of + images, with fixed delays between them." + + e "The sequence can repeat, or can stop after one + go-through." + + e "If you want more control, you can use the + anim.SMAnimation function." + + e "It can randomly change images, and even apply + transitions to changes." + + with None + scene smanim + show eileen happy + with dissolve + + e "Here, we randomly dissolve the background between red, + green, and blue images." + + e "Psychadelic." + + with None + scene bg washington + show eileen happy + with dissolve + + e "It's probably best if we stop here, before somebody's + brain explodes." + + "Text tags, updated in 5.1.4.": + + e "Text tags let us control the appearance of text that is + shown to the user." + + e "Text tags can make text {b}bold{/b}, {i}italic{/i}, or + {u}underlined{/u}." + + e "They can make the font size {size=+12}bigger{/size} or + {size=-8}smaller{/size}." + + e "They let you pause{w} the display of the text, + optionally with{p}line breaks." + + e "They let you include {image=slider_idle.png} images + inside text." + + e "They can even change the + {color=#f00}color{/color} + {color=#ff0}of{/color} + {color=#0f0}the{/color} + {color=#0ff}text{/color}." + + e "There are also bold, italic, and underline style properties, which can + be styled onto any text." + + e "If you find yourself using text tags on every line, you + should probably look at style properties instead." + + e "Used with care, text tags can enhance {b}your{/b} game." + + e "{u}Used{/u} with {i}abandon,{/i} they {b}can{/b} make {b}your{/b} + game {color=#333}hard{/color} {color=#888}to{/color} {color=#ccc}read{/color}." + + e "With great power comes great responsibility, after all." + + e "And we want to give you all the power you need." + + + "Music, sound and movies, updated in 4.5.": + + e "Ren'Py supports a number of multimedia functions." + + e "You're probably hearing music playing in the + background." + + + $ renpy.music_stop(fadeout=0.5) + e "We can stop it..." + + + $ renpy.music_start('sun-flower-slow-drag.mid') + e "... and start it playing again." + + # This plays a sound effect. + $ renpy.play("18005551212.wav") + + e "We can also play up to eight channels of sound effects + on top of the music." + + e "We ship, in the extras/ directory, code to support + characters having voice." + + e "Finally, we support playing mpeg movies." + + if renpy.exists('Eisenhow1952.mpg'): + + e "Since you downloaded the Eisenhower commercial, I can show + it to you as a cutscene." + + e "You can click to continue if it gets on your nerves too + much." + + $ renpy.movie_cutscene('Eisenhow1952.mpg', 63.0) + + hide eileen + show movie at Position(xpos=420, ypos=25, xanchor='left', yanchor='top') + show eileen happy + + $ renpy.movie_start_displayable('Eisenhow1952.mpg', (352, 240)) + + e "Ren'Py can even overlay rendered images on top of a movie, + although that's more taxing for your CPU." + + e "It's like I'm some sort of newscaster or something." + + $ renpy.movie_stop() + hide movie + + else: + + e "You haven't downloaded the Eisenhower commercial, so we + can't demonstrate it." + + e "That's it for multimedia." + + "Image Operations, added in 4.8.5": + + e "Image operations allow one to manipulate images as they + are loaded in." + + e "These are efficent, as they are only evaluated when an + image is first loaded." + + e "This way, there's no extra work that needs to be done + when each frame is drawn to the screen." + + show eileen happy at left with move + show cyan base at cyanpos with dissolve + + e "Let me show you a test image, a simple cyan circle." + + e "We'll be applying some image operations to it, to see + how they can be used." + + show cyan crop at cyanpos with dissolve + + e "The im.Crop operation can take the image, and chop it + up into a smaller image." + + show cyan composite at cyanpos with dissolve + + e "The im.Composite operation lets us take multiple images, + and draw them into a single image." + + e "While you can do this by showing multiple images, this + is more efficent, if more complex." + + show cyan green at cyanpos with dissolve + + e "The im.Map operation lets us mess with the red, green, + blue, and alpha channels of an image." + + e "In this case, we removed all the blue from the image, + leaving only the green component of cyan." + + show cyan alpha at cyanpos with dissolve + + e "The im.Alpha operation can adjust the alpha channel on + an image, making things partially transparent." + + show eileen alpha at left with dissolve + + e "It's useful if a character just happens to be ghost." + + with None + hide cyan + show eileen happy at left + with dissolve + + e "But that's not the case with me." + + show eileen happy with move + + + "User interaction.": + + e "Ren'Py gives a number of ways of interacting with the + user." + + e "You've already seen say statements and menus." + + e "We can also prompt the user to enter some text." + + $ povname = renpy.input("What is your name?") + + pov "My name is %(povname)s." + + + e "Imagemaps let the user click on an image to make a + choice." + + # This is an imagemap. It consists of two images, and a list of + # hotspots. For each hotspot we give the coordinates of the left, + # top, right, and bottom sides, and the value to return if it is + # picked. + + $ result = renpy.imagemap("ground.png", "selected.png", [ + (100, 100, 300, 400, "eileen"), + (500, 100, 700, 400, "lucy") + ]) + + # We've assigned the chosen result from the imagemap to the + # result variable. We can use an if statement to vary what + # happens based on the user's choice. + + if result == "eileen": + show eileen vhappy + e "You picked me!" + + elif result == "lucy": + show eileen concerned + e "It looks like you picked Lucy." + + # Eileen is being a bit possesive here. :-P + if date: + e "You can forget about Saturday." + $ date = False + + show eileen happy + + e "While these constructs are probably enough for most + visual novels, dating simulations may be more + complicated." + + e "The ui functions allow you to create quite complicated + interfaces." + + e "For example, try the following scheduling and stats screen, + which could be used by a stat-based dating simulation." + + $ day_planner() + + e "The ui functions can be used to rewrite many parts of + the interface." + + e "Hopefully, this gives you enough power to write any + visual novel you want." + + "Potpourri, added in 5.1.2.": + + e "Welcome to the potpourri section of the demo." + + e "Here, we demonstrate features that don't fit in any of + the other sections, but don't warrant their own + section." + + ectc "Here, we demonstrate a click to continue + indicator. In this example, it's nestled in with the + text." + + ectc "This also demonstrates the use of the anim.Blink + function." + + ectcf "A click to continue image can also be placed at a + fixed location on the screen." + + e "That's it for now." + + + " " # Empty, so we have a blank line. + + "That's enough for me.": + + return + + e "Is there anything else you want demonstrated?" + + jump demo_menu + + +# Here, are a number of customizations that make the game look +# better. We place them down here at the bottom, to make the first few +# lines of the script look better. +# +# These can be deleted without issue, if you do not want them. + +init: + + # Change some styles, to add images in the background of + # the menus and windows. + $ style.mm_root_window.background = Image("mainmenu.jpg") + $ style.gm_root_window.background = Image("gamemenu.jpg") + $ style.window.background = Frame("frame.png", 25, 25) + + # Change the look of the slider. + $ style.bar.left_gutter = 10 + $ style.bar.right_gutter = 12 + $ style.bar.left_bar = Frame("slider_full.png", 10, 0) + $ style.bar.right_bar = Frame("slider_empty.png", 12, 0) + $ style.bar.thumb = Image("slider_idle.png") + $ style.bar.hover_thumb = Image("slider_hover.png") + $ style.bar.thumb_shadow = Image("slider_shadow.png") + $ style.bar.thumb_offset = -10 + + # Change some styles involving the margins and padding of the + # default window. (We need this, as we use a frame image that + # includes a drop-shadow.) + $ style.window.xmargin = 0 + $ style.window.ymargin = 0 + $ style.window.xpadding = 20 + $ style.window.top_padding = 5 + $ style.window.bottom_padding = 15 + + # Interface sounds, just for the heck of it. + $ style.button.activate_sound = 'click.wav' + $ style.imagemap.activate_sound = 'click.wav' + $ library.enter_sound = 'click.wav' + $ library.exit_sound = 'click.wav' + $ library.sample_sound = "18005551212.wav" + + # Select the transitions that are used when entering and exiting + # the game menu. + $ library.enter_transition = pixellate + $ library.exit_transition = pixellate + +# The splashscreen is called, if it exists, before the main menu is +# shown the first time. It is not called if the game has restarted. + +# We'll comment it out for now. +# +# label splashscreen: +# scene black +# show text "American Bishoujo Presents..." with dissolve +# $ renpy.pause(1.0) +# hide text with dissolve +# +# return + + +Return to the tutorial. From 59d02e5138e0138d5fded195e940c239216dc3d3 Mon Sep 17 00:00:00 2001 From: William Claude Tumeo Date: Sun, 13 Dec 2015 00:20:25 -0200 Subject: [PATCH 101/205] Add language-renpy submodule --- vendor/grammars/language-renpy | 1 + 1 file changed, 1 insertion(+) create mode 160000 vendor/grammars/language-renpy diff --git a/vendor/grammars/language-renpy b/vendor/grammars/language-renpy new file mode 160000 index 00000000..00e92d74 --- /dev/null +++ b/vendor/grammars/language-renpy @@ -0,0 +1 @@ +Subproject commit 00e92d7450a97c33b40931113b64034bac27e010 From d3c525645bf1e2d801628a0fdae767772998481e Mon Sep 17 00:00:00 2001 From: William Claude Tumeo Date: Sun, 13 Dec 2015 15:58:14 -0200 Subject: [PATCH 102/205] Fix sample folder name and language order --- lib/linguist/languages.yml | 16 ++++++++-------- samples/{RenPy => Ren'Py}/example.rpy | 0 2 files changed, 8 insertions(+), 8 deletions(-) rename samples/{RenPy => Ren'Py}/example.rpy (100%) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 426ed070..7a33cf1f 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2983,14 +2983,6 @@ Redcode: tm_scope: none ace_mode: text -RenderScript: - type: programming - extensions: - - .rs - - .rsh - tm_scope: none - ace_mode: text - Ren'Py: type: programming group: Python @@ -3002,6 +2994,14 @@ Ren'Py: tm_scope: source.renpy ace_mode: python +RenderScript: + type: programming + extensions: + - .rs + - .rsh + tm_scope: none + ace_mode: text + RobotFramework: type: programming extensions: diff --git a/samples/RenPy/example.rpy b/samples/Ren'Py/example.rpy similarity index 100% rename from samples/RenPy/example.rpy rename to samples/Ren'Py/example.rpy From b82f563c3854f6393c27a28e177f39cbdba8cf2c Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Tue, 15 Dec 2015 13:33:03 -0500 Subject: [PATCH 103/205] Add Mathematica test file extension: .mt --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 7a33cf1f..c5eb9e6a 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2061,6 +2061,7 @@ Mathematica: - .cdf - .m - .ma + - .mt - .nb - .nbp - .wl From 0473af368f049e7a89812fa93068a567c877cc04 Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Tue, 15 Dec 2015 13:37:55 -0500 Subject: [PATCH 104/205] Add sample Mathematica test files. --- samples/Mathematica/TestArithmetic.mt | 1 + samples/Mathematica/TestString.mt | 1 + samples/Mathematica/TestSuite.mt | 5 +++++ 3 files changed, 7 insertions(+) create mode 100644 samples/Mathematica/TestArithmetic.mt create mode 100644 samples/Mathematica/TestString.mt create mode 100644 samples/Mathematica/TestSuite.mt diff --git a/samples/Mathematica/TestArithmetic.mt b/samples/Mathematica/TestArithmetic.mt new file mode 100644 index 00000000..40cbe122 --- /dev/null +++ b/samples/Mathematica/TestArithmetic.mt @@ -0,0 +1 @@ +Test[1 + 2, 3, TestID -> "One plus two"] diff --git a/samples/Mathematica/TestString.mt b/samples/Mathematica/TestString.mt new file mode 100644 index 00000000..c0d61036 --- /dev/null +++ b/samples/Mathematica/TestString.mt @@ -0,0 +1 @@ +Test[1"a" <> "b", "ab", TestID -> "Concat \"a\" and \"b\""] diff --git a/samples/Mathematica/TestSuite.mt b/samples/Mathematica/TestSuite.mt new file mode 100644 index 00000000..b18ae062 --- /dev/null +++ b/samples/Mathematica/TestSuite.mt @@ -0,0 +1,5 @@ +TestSuite[ + { "TestArithmetic.mt" + , "TestString.mt" + } +] From aa2e3000cd79c19f08b1eb62ca4dc413d857df5f Mon Sep 17 00:00:00 2001 From: Siraaj Khandkar Date: Wed, 16 Dec 2015 14:00:48 -0500 Subject: [PATCH 105/205] Remove copypasta artifact. --- samples/Mathematica/TestString.mt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/Mathematica/TestString.mt b/samples/Mathematica/TestString.mt index c0d61036..20539407 100644 --- a/samples/Mathematica/TestString.mt +++ b/samples/Mathematica/TestString.mt @@ -1 +1 @@ -Test[1"a" <> "b", "ab", TestID -> "Concat \"a\" and \"b\""] +Test["a" <> "b", "ab", TestID -> "Concat \"a\" and \"b\""] From 00a436f1757c8e0f13ee4de6fa390b13059a53fd Mon Sep 17 00:00:00 2001 From: Syed Humza Shah Date: Fri, 18 Dec 2015 01:24:05 +0000 Subject: [PATCH 106/205] used proper 'if/elsif/end' syntax --- lib/linguist.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/linguist.rb b/lib/linguist.rb index 3929efb9..589869c6 100644 --- a/lib/linguist.rb +++ b/lib/linguist.rb @@ -13,8 +13,8 @@ class << Linguist def instrument(*args, &bk) if instrumenter instrumenter.instrument(*args, &bk) - else - yield if block_given? + elsif block_given? + yield end end end From 97afedd86114caf1dc5f8c2e7f991a5009747107 Mon Sep 17 00:00:00 2001 From: Syed Humza Shah Date: Fri, 18 Dec 2015 01:27:58 +0000 Subject: [PATCH 107/205] removed usage of keyword as variable this was done mainly to fix annoying syntax highlighting --- lib/linguist/lazy_blob.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/linguist/lazy_blob.rb b/lib/linguist/lazy_blob.rb index 28fb78f3..5418eeae 100644 --- a/lib/linguist/lazy_blob.rb +++ b/lib/linguist/lazy_blob.rb @@ -86,8 +86,8 @@ module Linguist protected # Returns true if the attribute is present and not the string "false". - def boolean_attribute(attr) - attr != "false" + def boolean_attribute(attrbute) + attribute != "false" end def load_blob! From a3613dc4380ee5f3bea0bf5b1d3fb292347780a5 Mon Sep 17 00:00:00 2001 From: Syed Humza Shah Date: Fri, 18 Dec 2015 01:43:01 +0000 Subject: [PATCH 108/205] fixed a typo --- lib/linguist/lazy_blob.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/lazy_blob.rb b/lib/linguist/lazy_blob.rb index 5418eeae..e828dca6 100644 --- a/lib/linguist/lazy_blob.rb +++ b/lib/linguist/lazy_blob.rb @@ -86,7 +86,7 @@ module Linguist protected # Returns true if the attribute is present and not the string "false". - def boolean_attribute(attrbute) + def boolean_attribute(attribute) attribute != "false" end From 71dfac26fe4e6d1541f1e5390e566965d6850aed Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sun, 20 Dec 2015 13:09:00 +0100 Subject: [PATCH 109/205] .wiki extension as Mediawiki --- lib/linguist/languages.yml | 1 + samples/MediaWiki/README.wiki | 694 ++++++++++++++++++++++++++++++++++ 2 files changed, 695 insertions(+) create mode 100644 samples/MediaWiki/README.wiki diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index c5eb9e6a..c20a549f 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2108,6 +2108,7 @@ MediaWiki: wrap: true extensions: - .mediawiki + - .wiki tm_scope: text.html.mediawiki ace_mode: text diff --git a/samples/MediaWiki/README.wiki b/samples/MediaWiki/README.wiki new file mode 100644 index 00000000..546c3290 --- /dev/null +++ b/samples/MediaWiki/README.wiki @@ -0,0 +1,694 @@ += Name = + +'''nginx_tcp_proxy_module''' - support TCP proxy with Nginx + += Installation = + +Download the latest stable version of the release tarball of this module from [http://github.com/yaoweibin/nginx_tcp_proxy_module github] + +Grab the nginx source code from [http://nginx.org/ nginx.org], for example, the version 1.2.1 (see nginx compatibility), and then build the source with this module: + + + $ wget 'http://nginx.org/download/nginx-1.2.1.tar.gz' + $ tar -xzvf nginx-1.2.1.tar.gz + $ cd nginx-1.2.1/ + $ patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch + + $ ./configure --add-module=/path/to/nginx_tcp_proxy_module + + $ make + $ make install + + + += Synopsis = + + +http { + + server { + listen 80; + + location /status { + tcp_check_status; + } + } +} + + + + +#You can also include tcp_proxy.conf file individually + +#include /path/to/tcp_proxy.conf; + +tcp { + + upstream cluster { + # simple round-robin + server 192.168.0.1:80; + server 192.168.0.2:80; + + check interval=3000 rise=2 fall=5 timeout=1000; + + #check interval=3000 rise=2 fall=5 timeout=1000 type=ssl_hello; + + #check interval=3000 rise=2 fall=5 timeout=1000 type=http; + #check_http_send "GET / HTTP/1.0\r\n\r\n"; + #check_http_expect_alive http_2xx http_3xx; + } + + server { + listen 8888; + + proxy_pass cluster; + } +} + + += Description = + +This module actually include many modules: ngx_tcp_module, ngx_tcp_core_module, ngx_tcp_upstream_module, ngx_tcp_proxy_module, ngx_tcp_websocket_module, ngx_tcp_ssl_module, ngx_tcp_upstream_ip_hash_module. All these modules work together to support TCP proxy with Nginx. I also added other features: ip_hash, upstream server health check, status monitor. + +The motivation of writing these modules is Nginx's high performance and robustness. At first, I developed this module just for general TCP proxy. And now, this module is frequently used in websocket reverse proxying. + +Note, You can't use the same listening port with HTTP modules. + += Directives = + +== ngx_tcp_moodule == + +=== tcp === + +'''syntax:''' ''tcp {...}'' + +'''default:''' ''none'' + +'''context:''' ''main'' + +'''description:''' All the tcp related directives are contained in the tcp block. + + +'''ngx_tcp_core_moodule''' + +=== server === + +'''syntax:''' ''server {...}'' + +'''default:''' ''none'' + +'''context:''' ''tcp'' + +'''description:''' All the specific server directives are contained in the server block. + +=== listen === + +'''syntax:''' ''listen address:port [ bind | ssl | default]'' + +'''default:''' ''none'' + +'''context:''' ''server'' + +'''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#listen listen]. The parameter of default means the default server if you have several server blocks with the same port. + +=== access_log === + +'''syntax:''' ''access_log path [buffer=size] | off'' + +'''default:''' ''access_log logs/tcp_access.log'' + +'''context:''' ''tcp, server'' + +'''description:''' Set the access.log. Each record's format is like this: + +
+
+log_time worker_process_pid client_ip host_ip accept_time upstream_ip bytes_read bytes_write
+
+2011/08/02 06:19:07 [5972] 127.0.0.1 0.0.0.0:1982 2011/08/02 06:18:19 172.19.0.129:80 80 236305
+
+
+ +* ''log_time'': The current time when writing this log. The log action is called when the proxy session is closed. +* ''worker_process_pid'': the pid of worker process +* ''client_ip'': the client ip +* ''host_ip'': the server ip and port +* ''accept_time'': the time when the server accepts client's connection +* ''upstream_ip'': the upstream server's ip +* ''bytes_read'': the bytes read from client +* ''bytes_write'': the bytes written to client + +=== allow === + +'''syntax:''' ''allow [ address | CIDR | all ]'' + +'''default:''' ''none'' + +'''context:''' ''server'' + +'''description:''' Directive grants access for the network or addresses indicated. + +=== deny === + +'''syntax:''' ''deny [ address | CIDR | all ]'' + +'''default:''' ''none'' + +'''context:''' ''server'' + +'''description:''' Directive grants access for the network or addresses indicated. + +=== so_keepalive === + +'''syntax:''' ''so_keepalive on|off'' + +'''default:''' ''off'' + +'''context:''' ''main, server'' + +'''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#so_keepalive so_keepalive]. + +=== tcp_nodelay === + +'''syntax:''' ''tcp_nodelay on|off'' + +'''default:''' ''on'' + +'''context:''' ''main, server'' + +'''description:''' The same as [http://wiki.nginx.org/NginxHttpCoreModule#tcp_nodelay tcp_nodelay]. + +=== timeout === + +'''syntax:''' ''timeout milliseconds'' + +'''default:''' ''60000'' + +'''context:''' ''main, server'' + +'''description:''' set the timeout value with clients. + +=== server_name === + +'''syntax:''' ''server_name name'' + +'''default:''' ''The name of the host, obtained through gethostname()'' + +'''context:''' ''tcp, server'' + +'''description:''' The same as [http://wiki.nginx.org/NginxMailCoreModule#server_name server_name]. You can specify several server name in different server block with the same port. They can be used in websocket module. + +=== resolver === + +'''syntax:''' ''resolver address'' + +'''default:''' ''none'' + +'''context:''' ''tcp, server'' + +'''description:''' DNS server + +=== resolver_timeout === + +'''syntax:''' ''resolver_timeout time'' + +'''default:''' ''30s'' + +'''context:''' ''tcp, server'' + +'''description:''' Resolver timeout in seconds. + + +== ngx_tcp_upstream_module == + +=== upstream === + +'''syntax:''' ''upstream {...}'' + +'''default:''' ''none'' + +'''context:''' ''tcp'' + +'''description:''' All the upstream directives are contained in this block. The upstream server will be dispatched with round robin by default. + +=== server === + +'''syntax:''' ''server name [parameters]'' + +'''default:''' ''none'' + +'''context:''' ''upstream'' + +'''description:''' Most of the parameters are the same as [http://wiki.nginx.org/NginxHttpUpstreamModule#server server]. Default port is 80. + +=== check === + +'''syntax:''' ''check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [type=tcp|ssl_hello|smtp|mysql|pop3|imap]'' + +'''default:''' ''none, if parameters omitted, default parameters are interval=30000 fall=5 rise=2 timeout=1000'' + +'''context:''' ''upstream'' + +'''description:''' Add the health check for the upstream servers. At present, the check method is a simple tcp connect. + +The parameters' meanings are: + +* ''interval'': the check request's interval time. +* ''fall''(fall_count): After fall_count check failures, the server is marked down. +* ''rise''(rise_count): After rise_count check success, the server is marked up. +* ''timeout'': the check request's timeout. +* ''type'': the check protocol type: +# ''tcp'' is a simple tcp socket connect and peek one byte. +# ''ssl_hello'' sends a client ssl hello packet and receives the server ssl hello packet. +# ''http'' sends a http request packet, receives and parses the http response to diagnose if the upstream server is alive. +# ''smtp'' sends a smtp request packet, receives and parses the smtp response to diagnose if the upstream server is alive. The response begins with '2' should be an OK response. +# ''mysql'' connects to the mysql server, receives the greeting response to diagnose if the upstream server is alive. +# ''pop3'' receives and parses the pop3 response to diagnose if the upstream server is alive. The response begins with '+' should be an OK response. +# ''imap'' connects to the imap server, receives the greeting response to diagnose if the upstream server is alive. + +=== check_http_send === + +'''syntax:''' ''check_http_send http_packet'' + +'''default:''' ''"GET / HTTP/1.0\r\n\r\n"'' + +'''context:''' ''upstream'' + +'''description:''' If you set the check type is http, then the check function will sends this http packet to check the upstream server. + +=== check_http_expect_alive === + +'''syntax:''' ''check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]'' + +'''default:''' ''http_2xx | http_3xx'' + +'''context:''' ''upstream'' + +'''description:''' These status codes indicate the upstream server's http response is OK, the backend is alive. + +=== check_smtp_send === + +'''syntax:''' ''check_smtp_send smtp_packet'' + +'''default:''' ''"HELO smtp.localdomain\r\n"'' + +'''context:''' ''upstream'' + +'''description:''' If you set the check type is smtp, then the check function will sends this smtp packet to check the upstream server. + +=== check_smtp_expect_alive === + +'''syntax:''' ''check_smtp_expect_alive [smtp_2xx | smtp_3xx | smtp_4xx | smtp_5xx]'' + +'''default:''' ''smtp_2xx'' + +'''context:''' ''upstream'' + +'''description:''' These status codes indicate the upstream server's smtp response is OK, the backend is alive. + +=== check_shm_size === + +'''syntax:''' ''check_shm_size size'' + +'''default:''' ''(number_of_checked_upstream_blocks + 1) * pagesize'' + +'''context:''' ''tcp'' + +'''description:''' If you store hundreds of servers in one upstream block, the shared memory for health check may be not enough, you can enlarged it by this directive. + +=== tcp_check_status === + +'''syntax:''' ''tcp_check_status'' + +'''default:''' ''none'' + +'''context:''' ''location'' + +'''description:''' Display the health checking servers' status by HTTP. This directive is set in the http block. + +The table field meanings are: + +* ''Index'': The server index in the check table +* ''Name'' : The upstream server name +* ''Status'': The marked status of the server. +* ''Busyness'': The number of connections which are connecting to the server. +* ''Rise counts'': Count the successful checking +* ''Fall counts'': Count the unsuccessful checking +* ''Access counts'': Count the times accessing to this server +* ''Check type'': The type of the check packet + + +'''ngx_tcp_upstream_busyness_module''' + +=== busyness === + +'''syntax:''' ''busyness'' + +'''default:''' ''none'' + +'''context:''' ''upstream'' + +'''description:''' the upstream server will be dispatched by backend servers' busyness. + + +'''ngx_tcp_upstream_ip_hash_module''' + +=== ip_hash === + +'''syntax:''' ''ip_hash'' + +'''default:''' ''none'' + +'''context:''' ''upstream'' + +'''description:''' the upstream server will be dispatched by ip_hash. + + +== ngx_tcp_proxy_module == + +=== proxy_pass === + +'''syntax:''' ''proxy_pass host:port'' + +'''default:''' ''none'' + +'''context:''' ''server'' + +'''description:''' proxy the request to the backend server. Default port is 80. + +=== proxy_buffer === + +'''syntax:''' ''proxy_buffer size'' + +'''default:''' ''4k'' + +'''context:''' ''tcp, server'' + +'''description:''' set the size of proxy buffer. + +=== proxy_connect_timeout === + +'''syntax:''' ''proxy_connect_timeout miliseconds'' + +'''default:''' ''60000'' + +'''context:''' ''tcp, server'' + +'''description:''' set the timeout value of connection to backends. + +=== proxy_read_timeout === + +'''syntax:''' ''proxy_read_timeout miliseconds'' + +'''default:''' ''60000'' + +'''context:''' ''tcp, server'' + +'''description:''' set the timeout value of reading from backends. + +=== proxy_send_timeout === + +'''syntax:''' ''proxy_send_timeout miliseconds'' + +'''default:''' ''60000'' + +'''context:''' ''tcp, server'' + +'''description:''' set the timeout value of sending to backends. + + +== ngx_tcp_websocket_module == + +=== websocket_pass === + +'''syntax:''' ''websocket_pass [path] host:port'' + +'''default:''' ''none'' + +'''context:''' ''server'' + +'''description:''' proxy the websocket request to the backend server. Default port is 80. You can specify several different paths in the same server block. + +=== websocket_buffer === + +'''syntax:''' ''websocket_buffer size'' + +'''default:''' ''4k'' + +'''context:''' ''tcp, server'' + +'''description:''' set the size of proxy buffer. + +=== websocket_connect_timeout === + +'''syntax:''' ''websocket_connect_timeout miliseconds'' + +'''default:''' ''60000'' + +'''context:''' ''tcp, server'' + +'''description:''' set the timeout value of connection to backends. + +=== websocket_read_timeout === + +'''syntax:''' ''websocket_read_timeout miliseconds'' + +'''default:''' ''60000'' + +'''context:''' ''tcp, server'' + +'''description:''' set the timeout value of reading from backends. Your timeout will be the minimum of this and the *timeout* parameter, so if you want a long timeout for your websockets, make sure to set both paramaters. + +=== websocket_send_timeout === + +'''syntax:''' ''websocket_send_timeout miliseconds'' + +'''default:''' ''60000'' + +'''context:''' ''tcp, server'' + +'''description:''' set the timeout value of sending to backends. + + +== ngx_tcp_ssl_module == + +The default config file includes this ngx_tcp_ssl_module. If you want to just compile nginx without ngx_tcp_ssl_module, copy the ngx_tcp_proxy_module/config_without_ssl to ngx_tcp_proxy_module/config, reconfigrure and compile nginx. + +=== ssl === + +'''syntax:''' ''ssl [on|off] '' + +'''default:''' ''ssl off'' + +'''context:''' ''tcp, server'' + +Enables SSL for a server. + +=== ssl_certificate === + +'''syntax:''' ''ssl_certificate file'' + +'''default:''' ''ssl_certificate cert.pem'' + +'''context:''' ''tcp, server'' + +This directive specifies the file containing the certificate, in PEM format. This file can contain also other certificates and the server private key. + +=== ssl_certificate_key === + +'''syntax:''' ''ssl_certificate_key file'' + +'''default:''' ''ssl_certificate_key cert.pem'' + +'''context:''' ''tcp, server'' + +This directive specifies the file containing the private key, in PEM format. + +=== ssl_client_certificate === + +'''syntax:''' ''ssl_client_certificate file'' + +'''default:''' ''none'' + +'''context:''' ''tcp, server'' + +This directive specifies the file containing the CA (root) certificate, in PEM format, that is used for validating client certificates. + +=== ssl_dhparam === + +'''syntax:''' ''ssl_dhparam file'' + +'''default:''' ''none'' + +'''context:''' ''tcp, server'' + +This directive specifies a file containing Diffie-Hellman key agreement protocol cryptographic parameters, in PEM format, utilized for exchanging session keys between server and client. + +=== ssl_ciphers === + +'''syntax:''' ''ssl_ciphers openssl_cipherlist_spec'' + +'''default:''' ''ssl_ciphers HIGH:!aNULL:!MD5'' + +'''context:''' ''tcp, server'' + +This directive describes the list of cipher suites the server supports for establishing a secure connection. Cipher suites are specified in the [http://openssl.org/docs/apps/ciphers.html OpenSSL] cipherlist format, for example: + + +ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; + + +The complete cipherlist supported by the currently installed version of OpenSSL in your platform can be obtained by issuing the command: +
+openssl ciphers
+
+ +=== ssl_crl === + +'''syntax:''' ''ssl_crl file'' + +'''default:''' ''none'' + +'''context:''' ''tcp, server'' + +This directive specifies the filename of a Certificate Revocation List, in PEM format, which is used to check the revocation status of certificates. + +=== ssl_prefer_server_ciphers === + +'''syntax:''' ''ssl_prefer_server_ciphers [on|off] '' + +'''default:''' ''ssl_prefer_server_ciphers off'' + +'''context:''' ''tcp, server'' + +The server requires that the cipher suite list for protocols SSLv3 and TLSv1 are to be preferred over the client supported cipher suite list. + +=== ssl_protocols === + +'''syntax:''' ''ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]'' + +'''default:''' ''ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2'' + +'''context:''' ''tcp, server'' + +This directive enables the protocol versions specified. + +=== ssl_verify_client === + +'''syntax:''' ''ssl_verify_client on|off|optional'' + +'''default:''' ''ssl_verify_client off'' + +'''context:''' ''tcp, server'' + +This directive enables the verification of the client identity. Parameter 'optional' checks the client identity using its certificate in case it was made available to the server. + +=== ssl_verify_depth === + +'''syntax:''' ''ssl_verify_depth number'' + +'''default:''' ''ssl_verify_depth 1'' + +'''context:''' ''tcp, server'' + +This directive sets how deep the server should go in the client provided certificate chain in order to verify the client identity. + +=== ssl_session_cache === + +'''syntax:''' ''ssl_session_cache off|none|builtin:size and/or shared:name:size'' + +'''default:''' ''ssl_session_cache off'' + +'''context:''' ''tcp, server'' + +The directive sets the types and sizes of caches to store the SSL sessions. + +The cache types are: + +* off -- Hard off: nginx says explicitly to a client that sessions can not reused. +* none -- Soft off: nginx says to a client that session can be resued, but nginx actually never reuses them. This is workaround for some mail clients as ssl_session_cache may be used in mail proxy as well as in HTTP server. +* builtin -- the OpenSSL builtin cache, is used inside one worker process only. The cache size is assigned in the number of the sessions. Note: there appears to be a memory fragmentation issue using this method, please take that into consideration when using this. See "References" below. +* shared -- the cache is shared between all worker processes. The size of the cache is assigned in bytes: 1 MB cache can contain roughly 4000 sessions. Each shared cache must be given an arbitrary name. A shared cache with a given name can be used in several virtual hosts. +It's possible to use both types of cache — builtin and shared — simultaneously, for example: + + +ssl_session_cache builtin:1000 shared:SSL:10m; + + +Bear in mind however, that using only shared cache, i.e., without builtin, should be more effective. + +=== ssl_session_timeout === + +'''syntax:''' ''ssl_session_timeout time'' + +'''default:''' ''ssl_session_timeout 5m'' + +'''context:''' ''tcp, server'' + +This directive defines the maximum time during which the client can re-use the previously negotiated cryptographic parameters of the secure session that is stored in the SSL cache. + += Compatibility = + +* My test bed is 0.7.65+ + += Notes = + +The http_response_parse.rl and smtp_response_parse.rl are [http://www.complang.org/ragel/ ragel] scripts , you can edit the script and compile it like this: + + + $ ragel -G2 http_response_parse.rl + $ ragel -G2 smtp_response_parse.rl + + += TODO = + +* refact this module, make it more extendable for adding third-party modules +* manipulate header like http module's proxy_set_header +* built-in variable support +* custom log format +* syslog support +* FTP/IRC proxying + += Known Issues = + +* This module can't use the same listening port with the HTTP module. + += Changelogs = + +== v0.2.0 == + +* add ssl proxy module +* add websocket proxy module +* add upstream busyness module +* add tcp access log module + +== v0.19 == + +* add many check methods + +== v0.1 == + +* first release + += Authors = + +Weibin Yao(姚伟斌) ''yaoweibin at gmail dot com'' + += Copyright & License = + +This README template copy from [http://github.com/agentzh agentzh]. + +I borrowed a lot of code from upstream and mail module from the nginx 0.7.* core. This part of code is copyrighted by Igor Sysoev. And the health check part is borrowed the design of Jack Lindamood's healthcheck module [http://github.com/cep21/healthcheck_nginx_upstreams healthcheck_nginx_upstreams]; + +This module is licensed under the BSD license. + +Copyright (C) 2013 by Weibin Yao . + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 189b2d684b5ea6d3663697846be5013552e07a98 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sun, 20 Dec 2015 16:21:11 +0100 Subject: [PATCH 110/205] .rst.txt and .rest.txt as reStructuredText extensions --- HACKING.rst.txt | 329 +++++++++++++++++++++++++++++++++++++ lib/linguist/languages.yml | 2 + 2 files changed, 331 insertions(+) create mode 100644 HACKING.rst.txt diff --git a/HACKING.rst.txt b/HACKING.rst.txt new file mode 100644 index 00000000..6e078204 --- /dev/null +++ b/HACKING.rst.txt @@ -0,0 +1,329 @@ +Contributing to SciPy +===================== + +This document aims to give an overview of how to contribute to SciPy. It +tries to answer commonly asked questions, and provide some insight into how the +community process works in practice. Readers who are familiar with the SciPy +community and are experienced Python coders may want to jump straight to the +`git workflow`_ documentation. + + +Contributing new code +--------------------- + +If you have been working with the scientific Python toolstack for a while, you +probably have some code lying around of which you think "this could be useful +for others too". Perhaps it's a good idea then to contribute it to SciPy or +another open source project. The first question to ask is then, where does +this code belong? That question is hard to answer here, so we start with a +more specific one: *what code is suitable for putting into SciPy?* +Almost all of the new code added to scipy has in common that it's potentially +useful in multiple scientific domains and it fits in the scope of existing +scipy submodules. In principle new submodules can be added too, but this is +far less common. For code that is specific to a single application, there may +be an existing project that can use the code. Some scikits (`scikit-learn`_, +`scikits-image`_, `statsmodels`_, etc.) are good examples here; they have a +narrower focus and because of that more domain-specific code than SciPy. + +Now if you have code that you would like to see included in SciPy, how do you +go about it? After checking that your code can be distributed in SciPy under a +compatible license (see FAQ for details), the first step is to discuss on the +scipy-dev mailing list. All new features, as well as changes to existing code, +are discussed and decided on there. You can, and probably should, already +start this discussion before your code is finished. + +Assuming the outcome of the discussion on the mailing list is positive and you +have a function or piece of code that does what you need it to do, what next? +Before code is added to SciPy, it at least has to have good documentation, unit +tests and correct code style. + +1. Unit tests + In principle you should aim to create unit tests that exercise all the code + that you are adding. This gives some degree of confidence that your code + runs correctly, also on Python versions and hardware or OSes that you don't + have available yourself. An extensive description of how to write unit + tests is given in the NumPy `testing guidelines`_. + +2. Documentation + Clear and complete documentation is essential in order for users to be able + to find and understand the code. Documentation for individual functions + and classes -- which includes at least a basic description, type and + meaning of all parameters and returns values, and usage examples in + `doctest`_ format -- is put in docstrings. Those docstrings can be read + within the interpreter, and are compiled into a reference guide in html and + pdf format. Higher-level documentation for key (areas of) functionality is + provided in tutorial format and/or in module docstrings. A guide on how to + write documentation is given in `how to document`_. + +3. Code style + Uniformity of style in which code is written is important to others trying + to understand the code. SciPy follows the standard Python guidelines for + code style, `PEP8`_. In order to check that your code conforms to PEP8, + you can use the `pep8 package`_ style checker. Most IDEs and text editors + have settings that can help you follow PEP8, for example by translating + tabs by four spaces. Using `pyflakes`_ to check your code is also a good + idea. + +At the end of this document a checklist is given that may help to check if your +code fulfills all requirements for inclusion in SciPy. + +Another question you may have is: *where exactly do I put my code*? To answer +this, it is useful to understand how the SciPy public API (application +programming interface) is defined. For most modules the API is two levels +deep, which means your new function should appear as +``scipy.submodule.my_new_func``. ``my_new_func`` can be put in an existing or +new file under ``/scipy//``, its name is added to the ``__all__`` +dict in that file (which lists all public functions in the file), and those +public functions are then imported in ``/scipy//__init__.py``. Any +private functions/classes should have a leading underscore (``_``) in their +name. A more detailed description of what the public API of SciPy is, is given +in `SciPy API`_. + +Once you think your code is ready for inclusion in SciPy, you can send a pull +request (PR) on Github. We won't go into the details of how to work with git +here, this is described well in the `git workflow`_ section of the NumPy +documentation and in the Github help pages. When you send the PR for a new +feature, be sure to also mention this on the scipy-dev mailing list. This can +prompt interested people to help review your PR. Assuming that you already got +positive feedback before on the general idea of your code/feature, the purpose +of the code review is to ensure that the code is correct, efficient and meets +the requirements outlined above. In many cases the code review happens +relatively quickly, but it's possible that it stalls. If you have addressed +all feedback already given, it's perfectly fine to ask on the mailing list +again for review (after a reasonable amount of time, say a couple of weeks, has +passed). Once the review is completed, the PR is merged into the "master" +branch of SciPy. + +The above describes the requirements and process for adding code to SciPy. It +doesn't yet answer the question though how decisions are made exactly. The +basic answer is: decisions are made by consensus, by everyone who chooses to +participate in the discussion on the mailing list. This includes developers, +other users and yourself. Aiming for consensus in the discussion is important +-- SciPy is a project by and for the scientific Python community. In those +rare cases that agreement cannot be reached, the `maintainers`_ of the module +in question can decide the issue. + + +Contributing by helping maintain existing code +---------------------------------------------- + +The previous section talked specifically about adding new functionality to +SciPy. A large part of that discussion also applies to maintenance of existing +code. Maintenance means fixing bugs, improving code quality or style, +documenting existing functionality better, adding missing unit tests, keeping +build scripts up-to-date, etc. The SciPy `Trac`_ bug tracker contains all +reported bugs, build/documentation issues, etc. Fixing issues described in +Trac tickets helps improve the overall quality of SciPy, and is also a good way +of getting familiar with the project. You may also want to fix a bug because +you ran into it and need the function in question to work correctly. + +The discussion on code style and unit testing above applies equally to bug +fixes. It is usually best to start by writing a unit test that shows the +problem, i.e. it should pass but doesn't. Once you have that, you can fix the +code so that the test does pass. That should be enough to send a PR for this +issue. Unlike when adding new code, discussing this on the mailing list may +not be necessary - if the old behavior of the code is clearly incorrect, no one +will object to having it fixed. It may be necessary to add some warning or +deprecation message for the changed behavior. This should be part of the +review process. + + +Other ways to contribute +------------------------ + +There are many ways to contribute other than contributing code. Participating +in discussions on the scipy-user and scipy-dev *mailing lists* is a contribution +in itself. The `scipy.org`_ *website* contains a lot of information on the +SciPy community and can always use a new pair of hands. A redesign of this +website is ongoing, see `scipy.github.com`_. The redesigned website is a +static site based on Sphinx, the sources for it are +also on Github at `scipy.org-new`_. + +The SciPy *documentation* is constantly being improved by many developers and +users. You can contribute by sending a PR on Github that improves the +documentation, but there's also a `documentation wiki`_ that is very convenient +for making edits to docstrings (and doesn't require git knowledge). Anyone can +register a username on that wiki, ask on the scipy-dev mailing list for edit +rights and make edits. The documentation there is updated every day with the +latest changes in the SciPy master branch, and wiki edits are regularly +reviewed and merged into master. Another advantage of the documentation wiki +is that you can immediately see how the reStructuredText (reST) of docstrings +and other docs is rendered as html, so you can easily catch formatting errors. + +Code that doesn't belong in SciPy itself or in another package but helps users +accomplish a certain task is valuable. `SciPy Central`_ is the place to share +this type of code (snippets, examples, plotting code, etc.). + + +Useful links, FAQ, checklist +---------------------------- + +Checklist before submitting a PR +```````````````````````````````` + + - Are there unit tests with good code coverage? + - Do all public function have docstrings including examples? + - Is the code style correct (PEP8, pyflakes) + - Is the new functionality tagged with ``.. versionadded:: X.Y.Z`` (with + X.Y.Z the version number of the next release - can be found in setup.py)? + - Is the new functionality mentioned in the release notes of the next + release? + - Is the new functionality added to the reference guide? + - In case of larger additions, is there a tutorial or more extensive + module-level description? + - In case compiled code is added, is it integrated correctly via setup.py + (and preferably also Bento/Numscons configuration files)? + - If you are a first-time contributor, did you add yourself to THANKS.txt? + Please note that this is perfectly normal and desirable - the aim is to + give every single contributor credit, and if you don't add yourself it's + simply extra work for the reviewer (or worse, the reviewer may forget). + - Did you check that the code can be distributed under a BSD license? + + +Useful SciPy documents +`````````````````````` + + - The `how to document`_ guidelines + - NumPy/SciPy `testing guidelines`_ + - `SciPy API`_ + - SciPy `maintainers`_ + - NumPy/SciPy `git workflow`_ + + +FAQ +``` + +*I based my code on existing Matlab/R/... code I found online, is this OK?* + +It depends. SciPy is distributed under a BSD license, so if the code that you +based your code on is also BSD licensed or has a BSD-compatible license (MIT, +Apache, ...) then it's OK. Code which is GPL-licensed, has no clear license, +requires citation or is free for academic use only can't be included in SciPy. +Therefore if you copied existing code with such a license or made a direct +translation to Python of it, your code can't be included. See also `license +compatibility`_. + + +*How do I set up SciPy so I can edit files, run the tests and make commits?* + +The simplest method is setting up an in-place build. To create your local git +repo and do the in-place build:: + + $ git clone https://github.com/scipy/scipy.git scipy + $ cd scipy + $ python setup.py build_ext -i + +Then you need to either set up a symlink in your site-packages or add this +directory to your PYTHONPATH environment variable, so Python can find it. Some +IDEs (Spyder for example) have utilities to manage PYTHONPATH. On Linux and OS +X, you can for example edit your .bash_login file to automatically add this dir +on startup of your terminal. Add the line:: + + export PYTHONPATH="$HOME/scipy:${PYTHONPATH}" + +Alternatively, to set up the symlink, use (prefix only necessary if you want to +use your local instead of global site-packages dir):: + + $ python setupegg.py develop --prefix=${HOME} + +To test that everything works, start the interpreter (not inside the scipy/ +source dir) and run the tests:: + + $ python + >>> import scipy as sp + >>> sp.test() + +Now editing a Python source file in SciPy allows you to immediately test and +use your changes, by simply restarting the interpreter. + +Note that while the above procedure is the most straightforward way to get +started, you may want to look into using Bento or numscons for faster and more +flexible building, or virtualenv to maintain development environments for +multiple Python versions. + + +*How do I set up a development version of SciPy in parallel to a released +version that I use to do my job/research?* + +One simple way to achieve this is to install the released version in +site-packages, by using a binary installer or pip for example, and set up the +development version with an in-place build in a virtualenv. First install +`virtualenv`_ and `virtualenvwrapper`_, then create your virtualenv (named +scipy-dev here) with:: + + $ mkvirtualenv scipy-dev + +Now, whenever you want to switch to the virtual environment, you can use the +command ``workon scipy-dev``, while the command ``deactivate`` exits from the +virtual environment and brings back your previous shell. With scipy-dev +activated, follow the in-place build with the symlink install above to actually +install your development version of SciPy. + + +*Can I use a programming language other than Python to speed up my code?* + +Yes. The languages used in SciPy are Python, Cython, C, C++ and Fortran. All +of these have their pros and cons. If Python really doesn't offer enough +performance, one of those languages can be used. Important concerns when +using compiled languages are maintainability and portability. For +maintainability, Cython is clearly preferred over C/C++/Fortran. Cython and C +are more portable than C++/Fortran. A lot of the existing C and Fortran code +in SciPy is older, battle-tested code that was only wrapped in (but not +specifically written for) Python/SciPy. Therefore the basic advice is: use +Cython. If there's specific reasons why C/C++/Fortran should be preferred, +please discuss those reasons first. + + +*There's overlap between Trac and Github, which do I use for what?* + +Trac_ is the bug tracker, Github_ the code repository. Before the SciPy code +repository moved to Github, the preferred way to contribute code was to create +a patch and attach it to a Trac ticket. The overhead of this approach is much +larger than sending a PR on Github, so please don't do this anymore. Use Trac +for bug reports, Github for patches. + + +.. _scikit-learn: http://scikit-learn.org + +.. _scikits-image: http://scikits-image.org/ + +.. _statsmodels: http://statsmodels.sourceforge.net/ + +.. _testing guidelines: https://github.com/numpy/numpy/blob/master/doc/TESTS.rst.txt + +.. _how to document: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt + +.. _PEP8: http://www.python.org/dev/peps/pep-0008/ + +.. _pep8 package: http://pypi.python.org/pypi/pep8 + +.. _pyflakes: http://pypi.python.org/pypi/pyflakes + +.. _SciPy API: http://docs.scipy.org/doc/scipy/reference/api.html + +.. _git workflow: http://docs.scipy.org/doc/numpy/dev/gitwash/index.html + +.. _maintainers: https://github.com/scipy/scipy/blob/master/doc/MAINTAINERS.rst.txt + +.. _Trac: http://projects.scipy.org/scipy/timeline + +.. _Github: https://github.com/scipy/scipy + +.. _scipy.org: http://scipy.org/ + +.. _scipy.github.com: http://scipy.github.com/ + +.. _scipy.org-new: https://github.com/scipy/scipy.org-new + +.. _documentation wiki: http://docs.scipy.org/scipy/Front%20Page/ + +.. _SciPy Central: http://scipy-central.org/ + +.. _license compatibility: http://www.scipy.org/License_Compatibility + +.. _doctest: http://www.doughellmann.com/PyMOTW/doctest/ + +.. _virtualenv: http://www.virtualenv.org/ + +.. _virtualenvwrapper: http://www.doughellmann.com/projects/virtualenvwrapper/ + diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index c20a549f..4ca2fa33 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3967,6 +3967,8 @@ reStructuredText: extensions: - .rst - .rest + - .rest.txt + - .rst.txt ace_mode: text wisp: From 9a070d7bb3c7f1fa1a5958ed42cf5e30606db652 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 23 Dec 2015 21:43:55 +0100 Subject: [PATCH 111/205] Reorder Perl heuristic rules Order heuristic rules by accuracy Heuristic rules which are expected to generated less false positives should be tested first --- lib/linguist/heuristics.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 7c1c7db1..01be4e33 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -276,20 +276,20 @@ module Linguist end disambiguate ".pl" do |data| - if /^(use v6|(my )?class|module)/.match(data) - Language["Perl6"] + if /^[^#]+:-/.match(data) + Language["Prolog"] elsif /use strict|use\s+v?5\./.match(data) Language["Perl"] - elsif /^[^#]+:-/.match(data) - Language["Prolog"] + elsif /^(use v6|(my )?class|module)/.match(data) + Language["Perl6"] end end disambiguate ".pm", ".t" do |data| - if /^(use v6|(my )?class|module)/.match(data) - Language["Perl6"] - elsif /use strict|use\s+v?5\./.match(data) + if /use strict|use\s+v?5\./.match(data) Language["Perl"] + elsif /^(use v6|(my )?class|module)/.match(data) + Language["Perl6"] end end From 7a709310661cfa481adc9ada7fa47551084230f6 Mon Sep 17 00:00:00 2001 From: jrnold Date: Thu, 24 Dec 2015 15:55:00 -0800 Subject: [PATCH 112/205] add Stan to languages --- lib/linguist/languages.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index c5eb9e6a..d352be07 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3355,6 +3355,12 @@ Squirrel: tm_scope: source.c++ ace_mode: c_cpp +Stan: + type: programming + extensions: + - .stan + ace_mode: text + Standard ML: type: programming color: "#dc566d" From 5329b967937fa05197caf95cb68caa2892b8ba3e Mon Sep 17 00:00:00 2001 From: jrnold Date: Thu, 24 Dec 2015 15:55:14 -0800 Subject: [PATCH 113/205] add Stan samples --- samples/Stan/congress.stan | 14 ++++++++++++++ samples/Stan/dogs.stan | 31 +++++++++++++++++++++++++++++++ samples/Stan/schools.stan | 26 ++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 samples/Stan/congress.stan create mode 100644 samples/Stan/dogs.stan create mode 100644 samples/Stan/schools.stan diff --git a/samples/Stan/congress.stan b/samples/Stan/congress.stan new file mode 100644 index 00000000..6e7408e5 --- /dev/null +++ b/samples/Stan/congress.stan @@ -0,0 +1,14 @@ +data { + int N; + vector[N] incumbency_88; + vector[N] vote_86; + vector[N] vote_88; +} +parameters { + vector[3] beta; + real sigma; +} +model { + vote_88 ~ normal(beta[1] + beta[2] * vote_86 + + beta[3] * incumbency_88,sigma); +} diff --git a/samples/Stan/dogs.stan b/samples/Stan/dogs.stan new file mode 100644 index 00000000..ebca16d7 --- /dev/null +++ b/samples/Stan/dogs.stan @@ -0,0 +1,31 @@ +data { + int n_dogs; + int n_trials; + int y[n_dogs,n_trials]; +} +parameters { + vector[3] beta; +} +transformed parameters { + matrix[n_dogs,n_trials] n_avoid; + matrix[n_dogs,n_trials] n_shock; + matrix[n_dogs,n_trials] p; + + for (j in 1:n_dogs) { + n_avoid[j,1] <- 0; + n_shock[j,1] <- 0; + for (t in 2:n_trials) { + n_avoid[j,t] <- n_avoid[j,t-1] + 1 - y[j,t-1]; + n_shock[j,t] <- n_shock[j,t-1] + y[j,t-1]; + } + for (t in 1:n_trials) + p[j,t] <- beta[1] + beta[2] * n_avoid[j,t] + beta[3] * n_shock[j,t]; + } +} +model { + beta ~ normal(0, 100); + for (i in 1:n_dogs) { + for (j in 1:n_trials) + y[i,j] ~ bernoulli_logit(p[i,j]); + } +} diff --git a/samples/Stan/schools.stan b/samples/Stan/schools.stan new file mode 100644 index 00000000..171864a1 --- /dev/null +++ b/samples/Stan/schools.stan @@ -0,0 +1,26 @@ +data { + int N; + vector[N] y; + vector[N] sigma_y; +} +parameters { + vector[N] eta; + real mu_theta; + real sigma_eta; + real xi; +} +transformed parameters { + real sigma_theta; + vector[N] theta; + + theta <- mu_theta + xi * eta; + sigma_theta <- fabs(xi) / sigma_eta; +} +model { + mu_theta ~ normal(0, 100); + sigma_eta ~ inv_gamma(1, 1); //prior distribution can be changed to uniform + + eta ~ normal(0, sigma_eta); + xi ~ normal(0, 5); + y ~ normal(theta,sigma_y); +} From f141abbc730bfbf25f18dae64e69057d47729b43 Mon Sep 17 00:00:00 2001 From: jrnold Date: Thu, 24 Dec 2015 16:05:06 -0800 Subject: [PATCH 114/205] add tm_scope for Stan --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index d352be07..94f9f330 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3360,6 +3360,7 @@ Stan: extensions: - .stan ace_mode: text + tm_scope: none Standard ML: type: programming From 8144438f398ed15f90b5634cc4788d8b28d9fadb Mon Sep 17 00:00:00 2001 From: jrnold Date: Sun, 27 Dec 2015 18:50:43 -0800 Subject: [PATCH 115/205] Add color for Stan Use the brick-red color of the [Stan logo](https://raw.githubusercontent.com/stan-dev/logos/master/logo.png). --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 94f9f330..319c445e 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3357,6 +3357,7 @@ Squirrel: Stan: type: programming + color: "#b2011d" extensions: - .stan ace_mode: text From 1ac16cbec7b41bbdf76131352a4eec9bb29d2079 Mon Sep 17 00:00:00 2001 From: jrnold Date: Mon, 28 Dec 2015 22:31:49 -0800 Subject: [PATCH 116/205] add vendor for Stan --- .gitmodules | 3 +++ grammars.yml | 2 ++ vendor/grammars/atom-language-stan | 1 + 3 files changed, 6 insertions(+) create mode 160000 vendor/grammars/atom-language-stan diff --git a/.gitmodules b/.gitmodules index 8234378a..cde3e37b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -701,3 +701,6 @@ [submodule "vendor/grammars/language-renpy"] path = vendor/grammars/language-renpy url = https://github.com/williamd1k0/language-renpy.git +[submodule "vendor/grammars/atom-language-stan"] + path = vendor/grammars/atom-language-stan + url = git@github.com:jrnold/atom-language-stan.git diff --git a/grammars.yml b/grammars.yml index 8f7b1173..0319774a 100644 --- a/grammars.yml +++ b/grammars.yml @@ -187,6 +187,8 @@ vendor/grammars/atom-fsharp/: - source.fsharp.fsx vendor/grammars/atom-language-purescript/: - source.purescript +vendor/grammars/atom-language-stan/: +- source.stan vendor/grammars/atom-salt: - source.python.salt - source.yaml.salt diff --git a/vendor/grammars/atom-language-stan b/vendor/grammars/atom-language-stan new file mode 160000 index 00000000..72c626ae --- /dev/null +++ b/vendor/grammars/atom-language-stan @@ -0,0 +1 @@ +Subproject commit 72c626ae96792809447ed4b4e20b8792025b7b95 From 24a89d2d75d3840a78b274f028a2ff85d05ca74b Mon Sep 17 00:00:00 2001 From: jrnold Date: Mon, 28 Dec 2015 22:32:53 -0800 Subject: [PATCH 117/205] add tm_grammar for Stan --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 319c445e..7d0b4ac3 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3361,7 +3361,7 @@ Stan: extensions: - .stan ace_mode: text - tm_scope: none + tm_scope: source.stan Standard ML: type: programming From 6f197bacc74337c696ece542f2f3c93b762d46ef Mon Sep 17 00:00:00 2001 From: Nicholas Wolverson Date: Tue, 29 Dec 2015 23:22:51 +0000 Subject: [PATCH 118/205] Update PureScript submodule (moved repo, grammar tweak) Updated grammar to support triple-quoted strings properly: https://github.com/purescript-contrib/atom-language-purescript/commit/0c53f8162e40f2942d3df53c928c8ce597be3e12 atom-language-purescript repo has been moved to purescript-contrib org, update the URL. --- .gitmodules | 2 +- vendor/grammars/atom-language-purescript | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 8234378a..53ff80c7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -658,7 +658,7 @@ url = https://github.com/rpavlick/language-ncl.git [submodule "vendor/grammars/atom-language-purescript"] path = vendor/grammars/atom-language-purescript - url = https://github.com/freebroccolo/atom-language-purescript + url = https://github.com/purescript-contrib/atom-language-purescript [submodule "vendor/grammars/vue-syntax-highlight"] path = vendor/grammars/vue-syntax-highlight url = https://github.com/vuejs/vue-syntax-highlight diff --git a/vendor/grammars/atom-language-purescript b/vendor/grammars/atom-language-purescript index 21ed0c41..bd2b59f1 160000 --- a/vendor/grammars/atom-language-purescript +++ b/vendor/grammars/atom-language-purescript @@ -1 +1 @@ -Subproject commit 21ed0c417a143ca537afc5d65344acac3d88df94 +Subproject commit bd2b59f14eb4bd3b1f6d53eee959d7a6b523c073 From 70068f74f1f9c7dcd1133366749421a1acb28b41 Mon Sep 17 00:00:00 2001 From: AQNOUCH Mohammed Date: Fri, 1 Jan 2016 01:53:09 +0000 Subject: [PATCH 119/205] Updated copyright to 2016 --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index c0a52444..ca0844d1 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2011-2015 GitHub, Inc. +Copyright (c) 2011-2016 GitHub, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation From 048496723b1da98ab02b4b6d06174d107650c4c9 Mon Sep 17 00:00:00 2001 From: Andrew Plotkin Date: Fri, 1 Jan 2016 16:15:03 -0500 Subject: [PATCH 120/205] Include lots more forms of Inform7 syntax. Including embedded Inform6 syntax. --- samples/Inform 7/Trivial Extension.i7x | 69 +++++++++++++++++++++++++- samples/Inform 7/story.ni | 52 ++++++++++++++++++- 2 files changed, 119 insertions(+), 2 deletions(-) diff --git a/samples/Inform 7/Trivial Extension.i7x b/samples/Inform 7/Trivial Extension.i7x index 1aae1b85..1ba8316d 100644 --- a/samples/Inform 7/Trivial Extension.i7x +++ b/samples/Inform 7/Trivial Extension.i7x @@ -1,6 +1,73 @@ -Version 1 of Trivial Extension by Andrew Plotkin begins here. +Version 2 of Trivial Extension by Andrew Plotkin begins here. + +"This is the rubric of the extension." + +"provided for the Linguist package by Andrew Plotkin" + +[Note the two special quoted lines above.] A cow is a kind of animal. A cow can be purple. +Understand "cow" as a cow. +Understand "purple" as a purple cow. + +Check pushing a cow: + instead say "Cow-tipping, at your age?[paragraph break]Inconceivable." + +[Here are the possible levels of heading:] + +Volume One + +Text-line is always "A line of text." + +Book 2 + + Part the third - indented headings still count + +Chapter IV - not for release + +[Heading labels are case-insensitive.] + +section foobar + +[A line beginning "Volume" that does not have blank lines before and after it is *not* a header line. So the following is part of section foobar:] + +Measure is a kind of value. +Volume is a measure. Length is a measure. +Area is a measure. + +[And now some Inform 6 inclusions.] + +To say em -- running on: + (- style underline; -). +To say /em -- running on: + (- style roman; -). + +Include (- + +! Inform 6 comments start with ! marks and run to the end of the line. +Global cowcount; + +[ inform6func arg; + print "Here is some text; ", (address) 'dictword', ".^"; + cowcount++; ! increment this variable +]; + +Object i6cow + with name 'cow' 'animal', + with description "It looks like a cow."; + has animate scenery; + +-) after "Global Variables" in "Output.i6t". + Trivial Extension ends here. +---- DOCUMENTATION ---- + +Everything after the "---- DOCUMENTATION ----" line is documentation, so it should have the comment style. + +However, tab-indented lines are sample Inform code within the documentation: + + Horns are a kind of thing. Every cow has horns. + +So we need to allow for that. diff --git a/samples/Inform 7/story.ni b/samples/Inform 7/story.ni index f8873369..4fd774b5 100644 --- a/samples/Inform 7/story.ni +++ b/samples/Inform 7/story.ni @@ -2,11 +2,61 @@ Include Trivial Extension by Andrew Plotkin. +Volume 1 - overview + +Chapter - setting the scene + The Kitchen is a room. -[This kitchen is modelled after the one in Zork, although it lacks the detail to establish this to the player.] +[Comment: this kitchen is modelled after the one in Zork, although it lacks the detail to establish this to the player.] + +Section - the kitchen table + +The spicerack is a container in the Kitchen. + +Table of Spices +Name Flavor +"cinnamon" 5 +"nutmeg" 4 +"szechuan pepper" 8 + +The description of the spicerack is "It's mostly empty." + +Chapter - a character A purple cow called Gelett is in the Kitchen. +[This comment spans multiple lines.. + +...and this line contains [nested square[] brackets]... + +...which is legal in Inform 7.] + Instead of examining Gelett: say "You'd rather see than be one." + +Instead of examining Gelett: + say "You'd rather see than be one." + +Check smelling Gelett: + say "This text contains several lines. + +A blank line is displayed as a paragraph break, +but a simple line break is not."; + stop the action. + +Section - cow catching + +Gelett has a number called the mooness. + +Instead of taking Gelett: + increment the mooness of Gelett; + if the mooness of Gelett is one: + say "Gelett moos once."; + else: + say "Gelett moos [mooness of Gelett in words] times."; + +Volume 2 - the turn cycle + +Every turn: + say "A turn passes[one of][or] placidly[or] idly[or] tediously[at random]." From 0f4cf11294b9ab029e6832c699419ccef3b4fcac Mon Sep 17 00:00:00 2001 From: Andrew Plotkin Date: Fri, 1 Jan 2016 16:34:23 -0500 Subject: [PATCH 121/205] Wrong semicolon. --- samples/Inform 7/Trivial Extension.i7x | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/Inform 7/Trivial Extension.i7x b/samples/Inform 7/Trivial Extension.i7x index 1ba8316d..8b7e14cd 100644 --- a/samples/Inform 7/Trivial Extension.i7x +++ b/samples/Inform 7/Trivial Extension.i7x @@ -55,7 +55,7 @@ Global cowcount; Object i6cow with name 'cow' 'animal', - with description "It looks like a cow."; + with description "It looks like a cow.", has animate scenery; -) after "Global Variables" in "Output.i6t". From 7060b116f46c465f4879c3e644042846263173dd Mon Sep 17 00:00:00 2001 From: Andrew Plotkin Date: Fri, 1 Jan 2016 16:54:55 -0500 Subject: [PATCH 122/205] Reword a little. --- samples/Inform 7/Trivial Extension.i7x | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/Inform 7/Trivial Extension.i7x b/samples/Inform 7/Trivial Extension.i7x index 8b7e14cd..df0412c3 100644 --- a/samples/Inform 7/Trivial Extension.i7x +++ b/samples/Inform 7/Trivial Extension.i7x @@ -45,7 +45,7 @@ To say /em -- running on: Include (- -! Inform 6 comments start with ! marks and run to the end of the line. +! Inform 6 comments start with a ! mark and run to the end of the line. Global cowcount; [ inform6func arg; From f488b9b9f793e0bddd45d29cdc770c4c5d9490ff Mon Sep 17 00:00:00 2001 From: Andrew Plotkin Date: Fri, 1 Jan 2016 17:22:06 -0500 Subject: [PATCH 123/205] Test strings and substs in a doc comment. --- samples/Inform 7/Trivial Extension.i7x | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/Inform 7/Trivial Extension.i7x b/samples/Inform 7/Trivial Extension.i7x index df0412c3..e748c820 100644 --- a/samples/Inform 7/Trivial Extension.i7x +++ b/samples/Inform 7/Trivial Extension.i7x @@ -69,5 +69,6 @@ Everything after the "---- DOCUMENTATION ----" line is documentation, so it shou However, tab-indented lines are sample Inform code within the documentation: Horns are a kind of thing. Every cow has horns. + say "Moo[if the noun is purple] indigo[end if]." So we need to allow for that. From c0b9e2c3f416eb8605cac9a27c0ab4300fa7ec78 Mon Sep 17 00:00:00 2001 From: Andrew Plotkin Date: Fri, 1 Jan 2016 21:52:51 -0500 Subject: [PATCH 124/205] Update comment. --- samples/Inform 7/Trivial Extension.i7x | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/Inform 7/Trivial Extension.i7x b/samples/Inform 7/Trivial Extension.i7x index e748c820..40f53dab 100644 --- a/samples/Inform 7/Trivial Extension.i7x +++ b/samples/Inform 7/Trivial Extension.i7x @@ -30,7 +30,7 @@ Chapter IV - not for release section foobar -[A line beginning "Volume" that does not have blank lines before and after it is *not* a header line. So the following is part of section foobar:] +[A line beginning "Volume" that does not have blank lines before and after it is *not* a header line. So the following should all be part of section foobar. Sadly, the "Volume is..." line gets colored as a header, because Atom's regexp model can't recognize "thing with blank lines before and after"!] Measure is a kind of value. Volume is a measure. Length is a measure. From 537b83c75935b8b8b2cc5aa48af87d9e13edc304 Mon Sep 17 00:00:00 2001 From: Andrew Plotkin Date: Fri, 1 Jan 2016 22:23:01 -0500 Subject: [PATCH 125/205] Switch from Sublime-Inform grammar to language-inform7 grammar for Inform 7 source code. --- .gitmodules | 3 +++ grammars.yml | 4 ++-- lib/linguist/languages.yml | 2 +- vendor/grammars/language-inform7 | 1 + 4 files changed, 7 insertions(+), 3 deletions(-) create mode 160000 vendor/grammars/language-inform7 diff --git a/.gitmodules b/.gitmodules index 8234378a..726e5e12 100644 --- a/.gitmodules +++ b/.gitmodules @@ -701,3 +701,6 @@ [submodule "vendor/grammars/language-renpy"] path = vendor/grammars/language-renpy url = https://github.com/williamd1k0/language-renpy.git +[submodule "vendor/grammars/language-inform7"] + path = vendor/grammars/language-inform7 + url = https://github.com/erkyrath/language-inform7 diff --git a/grammars.yml b/grammars.yml index 8f7b1173..bca5a898 100644 --- a/grammars.yml +++ b/grammars.yml @@ -103,8 +103,6 @@ vendor/grammars/Sublime-Coq: - source.coq vendor/grammars/Sublime-HTTP: - source.httpspec -vendor/grammars/Sublime-Inform: -- source.Inform7 vendor/grammars/Sublime-Lasso: - file.lasso vendor/grammars/Sublime-Logos: @@ -342,6 +340,8 @@ vendor/grammars/language-gfm: - source.gfm vendor/grammars/language-hy: - source.hy +vendor/grammars/language-inform7: +- source.inform7 vendor/grammars/language-javascript: - source.js - source.js.regexp diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index c5eb9e6a..257cd7fc 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1510,7 +1510,7 @@ Inform 7: extensions: - .ni - .i7x - tm_scope: source.Inform7 + tm_scope: source.inform7 aliases: - i7 - inform7 diff --git a/vendor/grammars/language-inform7 b/vendor/grammars/language-inform7 new file mode 160000 index 00000000..b953a1ef --- /dev/null +++ b/vendor/grammars/language-inform7 @@ -0,0 +1 @@ +Subproject commit b953a1efedcff21091ba3b7e7fbcd1040c1f02bb From b790a49282d970f0123965c31c484469eb6dc53a Mon Sep 17 00:00:00 2001 From: Andrew Plotkin Date: Fri, 1 Jan 2016 22:25:11 -0500 Subject: [PATCH 126/205] Remove the old Sublime-Inform grammar from the submodules list. --- .gitmodules | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 726e5e12..f52dc313 100644 --- a/.gitmodules +++ b/.gitmodules @@ -25,9 +25,6 @@ [submodule "vendor/grammars/Sublime-REBOL"] path = vendor/grammars/Sublime-REBOL url = https://github.com/Oldes/Sublime-REBOL -[submodule "vendor/grammars/Sublime-Inform"] - path = vendor/grammars/Sublime-Inform - url = https://github.com/PogiNate/Sublime-Inform [submodule "vendor/grammars/autoitv3-tmbundle"] path = vendor/grammars/autoitv3-tmbundle url = https://github.com/Red-Nova-Technologies/autoitv3-tmbundle From 5d4cad639430ae917653da29fcfca79566019fb9 Mon Sep 17 00:00:00 2001 From: Andrew Plotkin Date: Fri, 1 Jan 2016 22:40:23 -0500 Subject: [PATCH 127/205] Remove the old submodule entry. --- vendor/grammars/Sublime-Inform | 1 - 1 file changed, 1 deletion(-) delete mode 160000 vendor/grammars/Sublime-Inform diff --git a/vendor/grammars/Sublime-Inform b/vendor/grammars/Sublime-Inform deleted file mode 160000 index 8db129b8..00000000 --- a/vendor/grammars/Sublime-Inform +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 8db129b8389044a6660ca232566651c8fe3ab646 From 3e665099ac84e0b2307c034aa4d2da7a1726e60e Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Sat, 2 Jan 2016 22:04:16 -0500 Subject: [PATCH 128/205] Updating Python grammars --- grammars.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/grammars.yml b/grammars.yml index 004f9cb0..2b7b5c8d 100644 --- a/grammars.yml +++ b/grammars.yml @@ -69,6 +69,9 @@ vendor/grammars/Lean.tmbundle: - source.lean vendor/grammars/LiveScript.tmbundle: - source.livescript +vendor/grammars/MagicPython: +- source.python +- source.regexp.python vendor/grammars/Modelica/: - source.modelica vendor/grammars/NSIS: @@ -355,10 +358,7 @@ vendor/grammars/language-maxscript: - source.maxscript vendor/grammars/language-ncl: - source.ncl -vendor/grammars/MagicPython: -- source.python vendor/grammars/language-python: -- source.regexp.python - text.python.console - text.python.traceback vendor/grammars/language-renpy: From a944769d61795e2d7aea17e502996dbf250f261c Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Sat, 2 Jan 2016 22:18:27 -0500 Subject: [PATCH 129/205] Grammars update --- vendor/grammars/Elm.tmLanguage | 2 +- vendor/grammars/Handlebars | 2 +- vendor/grammars/MagicPython | 2 +- vendor/grammars/abap.tmbundle | 2 +- vendor/grammars/atom-fsharp | 2 +- vendor/grammars/atom-language-stan | 2 +- vendor/grammars/ats.sublime | 2 +- vendor/grammars/c.tmbundle | 2 +- vendor/grammars/elixir-tmbundle | 2 +- vendor/grammars/factor | 2 +- vendor/grammars/html.tmbundle | 2 +- vendor/grammars/json.tmbundle | 2 +- vendor/grammars/language-babel | 2 +- vendor/grammars/language-clojure | 2 +- vendor/grammars/language-javascript | 2 +- vendor/grammars/language-maxscript | 2 +- vendor/grammars/latex.tmbundle | 2 +- vendor/grammars/make.tmbundle | 2 +- vendor/grammars/sas.tmbundle | 2 +- vendor/grammars/sublime-mask | 2 +- vendor/grammars/sublime-text-ox | 2 +- vendor/grammars/sublime-typescript | 2 +- vendor/grammars/sublime_cobol | 2 +- vendor/grammars/swift.tmbundle | 2 +- vendor/grammars/verilog.tmbundle | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/vendor/grammars/Elm.tmLanguage b/vendor/grammars/Elm.tmLanguage index ab79692f..494145bd 160000 --- a/vendor/grammars/Elm.tmLanguage +++ b/vendor/grammars/Elm.tmLanguage @@ -1 +1 @@ -Subproject commit ab79692fed628c9b08b7d11f21d9288cdf6b4e84 +Subproject commit 494145bded21fd6e18454d9d9d5aa8b67ced1b96 diff --git a/vendor/grammars/Handlebars b/vendor/grammars/Handlebars index 60309828..7e5396d9 160000 --- a/vendor/grammars/Handlebars +++ b/vendor/grammars/Handlebars @@ -1 +1 @@ -Subproject commit 6030982880f95b887daebf1ccb30ad1c615e0fc2 +Subproject commit 7e5396d9be8b05c705be614afb022f755a7edc17 diff --git a/vendor/grammars/MagicPython b/vendor/grammars/MagicPython index 13bf5348..d7855f98 160000 --- a/vendor/grammars/MagicPython +++ b/vendor/grammars/MagicPython @@ -1 +1 @@ -Subproject commit 13bf534834036911c57d15c40242e45783aad1ba +Subproject commit d7855f98ce6fbe0703c2753b0deae263a27fd8f8 diff --git a/vendor/grammars/abap.tmbundle b/vendor/grammars/abap.tmbundle index 5b7e30fd..e4e71dee 160000 --- a/vendor/grammars/abap.tmbundle +++ b/vendor/grammars/abap.tmbundle @@ -1 +1 @@ -Subproject commit 5b7e30fd8fb4bcaa78c14aaabebe98dda8ab7bbf +Subproject commit e4e71dee51b1fe6973e11d6a617de72991be4ecb diff --git a/vendor/grammars/atom-fsharp b/vendor/grammars/atom-fsharp index 500cdb5f..4376748e 160000 --- a/vendor/grammars/atom-fsharp +++ b/vendor/grammars/atom-fsharp @@ -1 +1 @@ -Subproject commit 500cdb5f045ff6a121fa2732bbd56c4da18bdae1 +Subproject commit 4376748ed29b5e104cd0dd807c8c9f09a09ec361 diff --git a/vendor/grammars/atom-language-stan b/vendor/grammars/atom-language-stan index 72c626ae..f6911bef 160000 --- a/vendor/grammars/atom-language-stan +++ b/vendor/grammars/atom-language-stan @@ -1 +1 @@ -Subproject commit 72c626ae96792809447ed4b4e20b8792025b7b95 +Subproject commit f6911bef091e155098f113ec5aaa89bd55283705 diff --git a/vendor/grammars/ats.sublime b/vendor/grammars/ats.sublime index 1ecc2b01..a3f24abb 160000 --- a/vendor/grammars/ats.sublime +++ b/vendor/grammars/ats.sublime @@ -1 +1 @@ -Subproject commit 1ecc2b011ed9d58bd5435b7440697e300591a23d +Subproject commit a3f24abbe7043adc0ad798711467edae33cf89f0 diff --git a/vendor/grammars/c.tmbundle b/vendor/grammars/c.tmbundle index f6048afe..f1424d49 160000 --- a/vendor/grammars/c.tmbundle +++ b/vendor/grammars/c.tmbundle @@ -1 +1 @@ -Subproject commit f6048afe693e50adf47d46aba791f95c9138823e +Subproject commit f1424d49dd879f6c5a67d3afe6c48a17f538345a diff --git a/vendor/grammars/elixir-tmbundle b/vendor/grammars/elixir-tmbundle index 4b502e43..13d94e0e 160000 --- a/vendor/grammars/elixir-tmbundle +++ b/vendor/grammars/elixir-tmbundle @@ -1 +1 @@ -Subproject commit 4b502e436d150f6af97b085a763179941b3c3778 +Subproject commit 13d94e0ec98c2447adc80230708afa94012ec825 diff --git a/vendor/grammars/factor b/vendor/grammars/factor index 9d956025..7b289493 160000 --- a/vendor/grammars/factor +++ b/vendor/grammars/factor @@ -1 +1 @@ -Subproject commit 9d95602591cf231a3f2332269d81d60068d1aa76 +Subproject commit 7b289493316955db1649eb2745a2db7a78a4c9f9 diff --git a/vendor/grammars/html.tmbundle b/vendor/grammars/html.tmbundle index a0bc0c47..36b90bc1 160000 --- a/vendor/grammars/html.tmbundle +++ b/vendor/grammars/html.tmbundle @@ -1 +1 @@ -Subproject commit a0bc0c479bde0d46bfec863f3262c06e768eec2d +Subproject commit 36b90bc113cdd59dcaeb0885103f9b6a773939e1 diff --git a/vendor/grammars/json.tmbundle b/vendor/grammars/json.tmbundle index 06b38d55..0762cbdc 160000 --- a/vendor/grammars/json.tmbundle +++ b/vendor/grammars/json.tmbundle @@ -1 +1 @@ -Subproject commit 06b38d55326363b63c26943c6e0213988180dbca +Subproject commit 0762cbdcb34dd98801b6323e75332cd4c9dbc07e diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel index 4b0e9658..20c649bc 160000 --- a/vendor/grammars/language-babel +++ b/vendor/grammars/language-babel @@ -1 +1 @@ -Subproject commit 4b0e9658e0a8bab71983ea5941f99b552cf00848 +Subproject commit 20c649bcc79b9fd9a72e4b6e1fa11e14d553a9d8 diff --git a/vendor/grammars/language-clojure b/vendor/grammars/language-clojure index 12b73d41..a0193ad2 160000 --- a/vendor/grammars/language-clojure +++ b/vendor/grammars/language-clojure @@ -1 +1 @@ -Subproject commit 12b73d41a0e0437b4899f73c5ac65caad74ac2c1 +Subproject commit a0193ad2a9797033649e665083f09249d2d098fc diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript index b227486f..162309ab 160000 --- a/vendor/grammars/language-javascript +++ b/vendor/grammars/language-javascript @@ -1 +1 @@ -Subproject commit b227486fc84c8af8f7439e96424c2f3724c26e44 +Subproject commit 162309ab8525c0f1b8602514e6aa347c9889437e diff --git a/vendor/grammars/language-maxscript b/vendor/grammars/language-maxscript index a465c9ca..56f89d27 160000 --- a/vendor/grammars/language-maxscript +++ b/vendor/grammars/language-maxscript @@ -1 +1 @@ -Subproject commit a465c9ca4adf71b8524021acb3cbe447db19753b +Subproject commit 56f89d27153d27f3fed5f8b50fda8fa728fa2911 diff --git a/vendor/grammars/latex.tmbundle b/vendor/grammars/latex.tmbundle index bb4edc2b..3be8cd92 160000 --- a/vendor/grammars/latex.tmbundle +++ b/vendor/grammars/latex.tmbundle @@ -1 +1 @@ -Subproject commit bb4edc2b6af0d95c2084511ce3afc324a9c83da5 +Subproject commit 3be8cd9208fb2aa5e9fe4ebd0074f55433bca7e0 diff --git a/vendor/grammars/make.tmbundle b/vendor/grammars/make.tmbundle index e0d96dc1..1a1827da 160000 --- a/vendor/grammars/make.tmbundle +++ b/vendor/grammars/make.tmbundle @@ -1 +1 @@ -Subproject commit e0d96dc1d6ec8ef9ee421da9963d231256a2f22d +Subproject commit 1a1827da81e20fdce56e2658451340c070ca44b7 diff --git a/vendor/grammars/sas.tmbundle b/vendor/grammars/sas.tmbundle index 30fa23fc..3759a197 160000 --- a/vendor/grammars/sas.tmbundle +++ b/vendor/grammars/sas.tmbundle @@ -1 +1 @@ -Subproject commit 30fa23fc34cf5147bcfd0759a4cbf83cd987337d +Subproject commit 3759a19719d3c4c4979087be12adbcaa02a7bca3 diff --git a/vendor/grammars/sublime-mask b/vendor/grammars/sublime-mask index 819f743e..8b2a4b33 160000 --- a/vendor/grammars/sublime-mask +++ b/vendor/grammars/sublime-mask @@ -1 +1 @@ -Subproject commit 819f743efdcfa0d90a5b935cfaad799bd4ca7e6a +Subproject commit 8b2a4b3300ef30f293218521cd2aa94335cad114 diff --git a/vendor/grammars/sublime-text-ox b/vendor/grammars/sublime-text-ox index ed96fb6a..5cbc2c65 160000 --- a/vendor/grammars/sublime-text-ox +++ b/vendor/grammars/sublime-text-ox @@ -1 +1 @@ -Subproject commit ed96fb6afc0321c7d3ce219d69b56c591f0938a0 +Subproject commit 5cbc2c655b4b771d34b75bbe962964455510644b diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript index 6540de45..d2c76b8c 160000 --- a/vendor/grammars/sublime-typescript +++ b/vendor/grammars/sublime-typescript @@ -1 +1 @@ -Subproject commit 6540de452eb08766d379fe10aba4bce9eb645ec0 +Subproject commit d2c76b8c8262c9a848d4814662a0c8e13d1e2a6a diff --git a/vendor/grammars/sublime_cobol b/vendor/grammars/sublime_cobol index 19ae2ba3..ad15734a 160000 --- a/vendor/grammars/sublime_cobol +++ b/vendor/grammars/sublime_cobol @@ -1 +1 @@ -Subproject commit 19ae2ba33ebc0b439051a499888acd4f916f83b9 +Subproject commit ad15734a4a9798a006525f53a968565fee1411b1 diff --git a/vendor/grammars/swift.tmbundle b/vendor/grammars/swift.tmbundle index 75a3dea1..e6375f4d 160000 --- a/vendor/grammars/swift.tmbundle +++ b/vendor/grammars/swift.tmbundle @@ -1 +1 @@ -Subproject commit 75a3dea1841cd153c71101fa30841a269ab3c6a7 +Subproject commit e6375f4dbb9c5a715e1924b1e9fc1056f0b3dee7 diff --git a/vendor/grammars/verilog.tmbundle b/vendor/grammars/verilog.tmbundle index 7627ae50..f55a9859 160000 --- a/vendor/grammars/verilog.tmbundle +++ b/vendor/grammars/verilog.tmbundle @@ -1 +1 @@ -Subproject commit 7627ae507278edd9534c3f905d48736875658bf5 +Subproject commit f55a9859f48bb6189992b86748c127044131a785 From ca4bc6110f2a99bc54072d4924c28dec5e3b101a Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sun, 3 Jan 2016 11:47:09 +0100 Subject: [PATCH 130/205] Remove 'use strict' from Perl6 sample --- samples/Perl6/hash.t | 1 - 1 file changed, 1 deletion(-) diff --git a/samples/Perl6/hash.t b/samples/Perl6/hash.t index 7bff849e..24ba2b50 100644 --- a/samples/Perl6/hash.t +++ b/samples/Perl6/hash.t @@ -12,7 +12,6 @@ unless EVAL 'EVAL("1", :lang)' { die unless EVAL(q/ package My::Hash; -use strict; sub new { my ($class, $ref) = @_; From 5906fa81bb3782cd8d79390f2544da4b71fd8654 Mon Sep 17 00:00:00 2001 From: Louis Pilfold Date: Mon, 4 Jan 2016 11:12:39 +0000 Subject: [PATCH 131/205] support for Erlang leex (.xrl) / yecc (.yrl) files --- lib/linguist/languages.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 7d0b4ac3..6a302889 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -939,6 +939,8 @@ Erlang: - .es - .escript - .hrl + - .xrl + - .yrl filenames: - rebar.config - rebar.config.lock From 0a7aab947cbfc8924a6721f81707b01f2717e048 Mon Sep 17 00:00:00 2001 From: Louis Pilfold Date: Mon, 4 Jan 2016 12:16:32 +0000 Subject: [PATCH 132/205] Add the Elixir parser as an example of erlang .yrl --- samples/Erlang/elixir_parser.yrl | 856 +++++++++++++++++++++++++++++++ 1 file changed, 856 insertions(+) create mode 100644 samples/Erlang/elixir_parser.yrl diff --git a/samples/Erlang/elixir_parser.yrl b/samples/Erlang/elixir_parser.yrl new file mode 100644 index 00000000..f49f8539 --- /dev/null +++ b/samples/Erlang/elixir_parser.yrl @@ -0,0 +1,856 @@ +Nonterminals + grammar expr_list + expr container_expr block_expr access_expr + no_parens_expr no_parens_zero_expr no_parens_one_expr no_parens_one_ambig_expr + bracket_expr bracket_at_expr bracket_arg matched_expr unmatched_expr max_expr + unmatched_op_expr matched_op_expr no_parens_op_expr no_parens_many_expr + comp_op_eol at_op_eol unary_op_eol and_op_eol or_op_eol capture_op_eol + add_op_eol mult_op_eol two_op_eol three_op_eol pipe_op_eol stab_op_eol + arrow_op_eol match_op_eol when_op_eol in_op_eol in_match_op_eol + type_op_eol rel_op_eol + open_paren close_paren empty_paren eoe + list list_args open_bracket close_bracket + tuple open_curly close_curly + bit_string open_bit close_bit + map map_op map_close map_args map_expr struct_op + assoc_op_eol assoc_expr assoc_base assoc_update assoc_update_kw assoc + container_args_base container_args + call_args_parens_expr call_args_parens_base call_args_parens parens_call + call_args_no_parens_one call_args_no_parens_ambig call_args_no_parens_expr + call_args_no_parens_comma_expr call_args_no_parens_all call_args_no_parens_many + call_args_no_parens_many_strict + stab stab_eoe stab_expr stab_op_eol_and_expr stab_parens_many + kw_eol kw_base kw call_args_no_parens_kw_expr call_args_no_parens_kw + dot_op dot_alias dot_alias_container + dot_identifier dot_op_identifier dot_do_identifier + dot_paren_identifier dot_bracket_identifier + do_block fn_eoe do_eoe end_eoe block_eoe block_item block_list + . + +Terminals + identifier kw_identifier kw_identifier_safe kw_identifier_unsafe bracket_identifier + paren_identifier do_identifier block_identifier + fn 'end' aliases + number atom atom_safe atom_unsafe bin_string list_string sigil + dot_call_op op_identifier + comp_op at_op unary_op and_op or_op arrow_op match_op in_op in_match_op + type_op dual_op add_op mult_op two_op three_op pipe_op stab_op when_op assoc_op + capture_op rel_op + 'true' 'false' 'nil' 'do' eol ';' ',' '.' + '(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%' + . + +Rootsymbol grammar. + +%% Two shift/reduce conflicts coming from call_args_parens. +Expect 2. + +%% Changes in ops and precedence should be reflected on lib/elixir/lib/macro.ex +%% Note though the operator => in practice has lower precedence than all others, +%% its entry in the table is only to support the %{user | foo => bar} syntax. +Left 5 do. +Right 10 stab_op_eol. %% -> +Left 20 ','. +Nonassoc 30 capture_op_eol. %% & +Left 40 in_match_op_eol. %% <-, \\ (allowed in matches along =) +Right 50 when_op_eol. %% when +Right 60 type_op_eol. %% :: +Right 70 pipe_op_eol. %% | +Right 80 assoc_op_eol. %% => +Right 90 match_op_eol. %% = +Left 130 or_op_eol. %% ||, |||, or +Left 140 and_op_eol. %% &&, &&&, and +Left 150 comp_op_eol. %% ==, !=, =~, ===, !== +Left 160 rel_op_eol. %% <, >, <=, >= +Left 170 arrow_op_eol. %% |>, <<<, >>>, ~>>, <<~, ~>, <~, <~>, <|> +Left 180 in_op_eol. %% in +Left 190 three_op_eol. %% ^^^ +Right 200 two_op_eol. %% ++, --, .., <> +Left 210 add_op_eol. %% +, - +Left 220 mult_op_eol. %% *, / +Nonassoc 300 unary_op_eol. %% +, -, !, ^, not, ~~~ +Left 310 dot_call_op. +Left 310 dot_op. %% . +Nonassoc 320 at_op_eol. %% @ +Nonassoc 330 dot_identifier. + +%%% MAIN FLOW OF EXPRESSIONS + +grammar -> eoe : nil. +grammar -> expr_list : to_block('$1'). +grammar -> eoe expr_list : to_block('$2'). +grammar -> expr_list eoe : to_block('$1'). +grammar -> eoe expr_list eoe : to_block('$2'). +grammar -> '$empty' : nil. + +% Note expressions are on reverse order +expr_list -> expr : ['$1']. +expr_list -> expr_list eoe expr : ['$3'|'$1']. + +expr -> matched_expr : '$1'. +expr -> no_parens_expr : '$1'. +expr -> unmatched_expr : '$1'. + +%% In Elixir we have three main call syntaxes: with parentheses, +%% without parentheses and with do blocks. They are represented +%% in the AST as matched, no_parens and unmatched. +%% +%% Calls without parentheses are further divided according to how +%% problematic they are: +%% +%% (a) no_parens_one: a call with one unproblematic argument +%% (e.g. `f a` or `f g a` and similar) (includes unary operators) +%% +%% (b) no_parens_many: a call with several arguments (e.g. `f a, b`) +%% +%% (c) no_parens_one_ambig: a call with one argument which is +%% itself a no_parens_many or no_parens_one_ambig (e.g. `f g a, b` +%% or `f g h a, b` and similar) +%% +%% Note, in particular, that no_parens_one_ambig expressions are +%% ambiguous and are interpreted such that the outer function has +%% arity 1 (e.g. `f g a, b` is interpreted as `f(g(a, b))` rather +%% than `f(g(a), b)`). Hence the name, no_parens_one_ambig. +%% +%% The distinction is required because we can't, for example, have +%% a function call with a do block as argument inside another do +%% block call, unless there are parentheses: +%% +%% if if true do true else false end do #=> invalid +%% if(if true do true else false end) do #=> valid +%% +%% Similarly, it is not possible to nest calls without parentheses +%% if their arity is more than 1: +%% +%% foo a, bar b, c #=> invalid +%% foo(a, bar b, c) #=> invalid +%% foo bar a, b #=> valid +%% foo a, bar(b, c) #=> valid +%% +%% So the different grammar rules need to take into account +%% if calls without parentheses are do blocks in particular +%% segments and act accordingly. +matched_expr -> matched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). +matched_expr -> unary_op_eol matched_expr : build_unary_op('$1', '$2'). +matched_expr -> at_op_eol matched_expr : build_unary_op('$1', '$2'). +matched_expr -> capture_op_eol matched_expr : build_unary_op('$1', '$2'). +matched_expr -> no_parens_one_expr : '$1'. +matched_expr -> no_parens_zero_expr : '$1'. +matched_expr -> access_expr : '$1'. +matched_expr -> access_expr kw_identifier : throw_invalid_kw_identifier('$2'). + +unmatched_expr -> matched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). +unmatched_expr -> unmatched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). +unmatched_expr -> unmatched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). +unmatched_expr -> unmatched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). +unmatched_expr -> unary_op_eol expr : build_unary_op('$1', '$2'). +unmatched_expr -> at_op_eol expr : build_unary_op('$1', '$2'). +unmatched_expr -> capture_op_eol expr : build_unary_op('$1', '$2'). +unmatched_expr -> block_expr : '$1'. + +no_parens_expr -> matched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). +no_parens_expr -> unary_op_eol no_parens_expr : build_unary_op('$1', '$2'). +no_parens_expr -> at_op_eol no_parens_expr : build_unary_op('$1', '$2'). +no_parens_expr -> capture_op_eol no_parens_expr : build_unary_op('$1', '$2'). +no_parens_expr -> no_parens_one_ambig_expr : '$1'. +no_parens_expr -> no_parens_many_expr : '$1'. + +block_expr -> parens_call call_args_parens do_block : build_identifier('$1', '$2' ++ '$3'). +block_expr -> parens_call call_args_parens call_args_parens do_block : build_nested_parens('$1', '$2', '$3' ++ '$4'). +block_expr -> dot_do_identifier do_block : build_identifier('$1', '$2'). +block_expr -> dot_identifier call_args_no_parens_all do_block : build_identifier('$1', '$2' ++ '$3'). + +matched_op_expr -> match_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> add_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> mult_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> two_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> three_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> and_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> or_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> in_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> in_match_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> type_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> when_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> pipe_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> comp_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> rel_op_eol matched_expr : {'$1', '$2'}. +matched_op_expr -> arrow_op_eol matched_expr : {'$1', '$2'}. +%% Warn for no parens subset +matched_op_expr -> arrow_op_eol no_parens_one_expr : warn_pipe('$1', '$2'), {'$1', '$2'}. + +unmatched_op_expr -> match_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> add_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> mult_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> two_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> three_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> and_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> or_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> in_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> in_match_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> type_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> when_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> pipe_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> comp_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> rel_op_eol unmatched_expr : {'$1', '$2'}. +unmatched_op_expr -> arrow_op_eol unmatched_expr : {'$1', '$2'}. + +no_parens_op_expr -> match_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> add_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> mult_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> two_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> three_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> and_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> or_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> in_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> in_match_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> type_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> when_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> pipe_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> comp_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> rel_op_eol no_parens_expr : {'$1', '$2'}. +no_parens_op_expr -> arrow_op_eol no_parens_expr : {'$1', '$2'}. +%% Warn for no parens subset +no_parens_op_expr -> arrow_op_eol no_parens_one_ambig_expr : warn_pipe('$1', '$2'), {'$1', '$2'}. +no_parens_op_expr -> arrow_op_eol no_parens_many_expr : warn_pipe('$1', '$2'), {'$1', '$2'}. + +%% Allow when (and only when) with keywords +no_parens_op_expr -> when_op_eol call_args_no_parens_kw : {'$1', '$2'}. + +no_parens_one_ambig_expr -> dot_op_identifier call_args_no_parens_ambig : build_identifier('$1', '$2'). +no_parens_one_ambig_expr -> dot_identifier call_args_no_parens_ambig : build_identifier('$1', '$2'). + +no_parens_many_expr -> dot_op_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2'). +no_parens_many_expr -> dot_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2'). + +no_parens_one_expr -> dot_op_identifier call_args_no_parens_one : build_identifier('$1', '$2'). +no_parens_one_expr -> dot_identifier call_args_no_parens_one : build_identifier('$1', '$2'). +no_parens_zero_expr -> dot_do_identifier : build_identifier('$1', nil). +no_parens_zero_expr -> dot_identifier : build_identifier('$1', nil). + +%% From this point on, we just have constructs that can be +%% used with the access syntax. Notice that (dot_)identifier +%% is not included in this list simply because the tokenizer +%% marks identifiers followed by brackets as bracket_identifier. +access_expr -> bracket_at_expr : '$1'. +access_expr -> bracket_expr : '$1'. +access_expr -> at_op_eol number : build_unary_op('$1', ?exprs('$2')). +access_expr -> unary_op_eol number : build_unary_op('$1', ?exprs('$2')). +access_expr -> capture_op_eol number : build_unary_op('$1', ?exprs('$2')). +access_expr -> fn_eoe stab end_eoe : build_fn('$1', reverse('$2')). +access_expr -> open_paren stab close_paren : build_stab(reverse('$2')). +access_expr -> open_paren stab ';' close_paren : build_stab(reverse('$2')). +access_expr -> open_paren ';' stab ';' close_paren : build_stab(reverse('$3')). +access_expr -> open_paren ';' stab close_paren : build_stab(reverse('$3')). +access_expr -> open_paren ';' close_paren : build_stab([]). +access_expr -> empty_paren : nil. +access_expr -> number : ?exprs('$1'). +access_expr -> list : element(1, '$1'). +access_expr -> map : '$1'. +access_expr -> tuple : '$1'. +access_expr -> 'true' : ?id('$1'). +access_expr -> 'false' : ?id('$1'). +access_expr -> 'nil' : ?id('$1'). +access_expr -> bin_string : build_bin_string('$1'). +access_expr -> list_string : build_list_string('$1'). +access_expr -> bit_string : '$1'. +access_expr -> sigil : build_sigil('$1'). +access_expr -> max_expr : '$1'. + +%% Aliases and properly formed calls. Used by map_expr. +max_expr -> atom : ?exprs('$1'). +max_expr -> atom_safe : build_quoted_atom('$1', true). +max_expr -> atom_unsafe : build_quoted_atom('$1', false). +max_expr -> parens_call call_args_parens : build_identifier('$1', '$2'). +max_expr -> parens_call call_args_parens call_args_parens : build_nested_parens('$1', '$2', '$3'). +max_expr -> dot_alias : '$1'. + +bracket_arg -> open_bracket kw close_bracket : build_list('$1', '$2'). +bracket_arg -> open_bracket container_expr close_bracket : build_list('$1', '$2'). +bracket_arg -> open_bracket container_expr ',' close_bracket : build_list('$1', '$2'). + +bracket_expr -> dot_bracket_identifier bracket_arg : build_access(build_identifier('$1', nil), '$2'). +bracket_expr -> access_expr bracket_arg : build_access('$1', '$2'). + +bracket_at_expr -> at_op_eol dot_bracket_identifier bracket_arg : + build_access(build_unary_op('$1', build_identifier('$2', nil)), '$3'). +bracket_at_expr -> at_op_eol access_expr bracket_arg : + build_access(build_unary_op('$1', '$2'), '$3'). + +%% Blocks + +do_block -> do_eoe 'end' : [[{do, nil}]]. +do_block -> do_eoe stab end_eoe : [[{do, build_stab(reverse('$2'))}]]. +do_block -> do_eoe block_list 'end' : [[{do, nil}|'$2']]. +do_block -> do_eoe stab_eoe block_list 'end' : [[{do, build_stab(reverse('$2'))}|'$3']]. + +eoe -> eol : '$1'. +eoe -> ';' : '$1'. +eoe -> eol ';' : '$1'. + +fn_eoe -> 'fn' : '$1'. +fn_eoe -> 'fn' eoe : '$1'. + +do_eoe -> 'do' : '$1'. +do_eoe -> 'do' eoe : '$1'. + +end_eoe -> 'end' : '$1'. +end_eoe -> eoe 'end' : '$2'. + +block_eoe -> block_identifier : '$1'. +block_eoe -> block_identifier eoe : '$1'. + +stab -> stab_expr : ['$1']. +stab -> stab eoe stab_expr : ['$3'|'$1']. + +stab_eoe -> stab : '$1'. +stab_eoe -> stab eoe : '$1'. + +%% Here, `element(1, Token)` is the stab operator, +%% while `element(2, Token)` is the expression. +stab_expr -> expr : + '$1'. +stab_expr -> stab_op_eol_and_expr : + build_op(element(1, '$1'), [], element(2, '$1')). +stab_expr -> empty_paren stab_op_eol_and_expr : + build_op(element(1, '$2'), [], element(2, '$2')). +stab_expr -> call_args_no_parens_all stab_op_eol_and_expr : + build_op(element(1, '$2'), unwrap_when(unwrap_splice('$1')), element(2, '$2')). +stab_expr -> stab_parens_many stab_op_eol_and_expr : + build_op(element(1, '$2'), unwrap_splice('$1'), element(2, '$2')). +stab_expr -> stab_parens_many when_op expr stab_op_eol_and_expr : + build_op(element(1, '$4'), [{'when', meta_from_token('$2'), unwrap_splice('$1') ++ ['$3']}], element(2, '$4')). + +stab_op_eol_and_expr -> stab_op_eol expr : {'$1', '$2'}. +stab_op_eol_and_expr -> stab_op_eol : warn_empty_stab_clause('$1'), {'$1', nil}. + +block_item -> block_eoe stab_eoe : {?exprs('$1'), build_stab(reverse('$2'))}. +block_item -> block_eoe : {?exprs('$1'), nil}. + +block_list -> block_item : ['$1']. +block_list -> block_item block_list : ['$1'|'$2']. + +%% Helpers + +open_paren -> '(' : '$1'. +open_paren -> '(' eol : '$1'. +close_paren -> ')' : '$1'. +close_paren -> eol ')' : '$2'. + +empty_paren -> open_paren ')' : '$1'. + +open_bracket -> '[' : '$1'. +open_bracket -> '[' eol : '$1'. +close_bracket -> ']' : '$1'. +close_bracket -> eol ']' : '$2'. + +open_bit -> '<<' : '$1'. +open_bit -> '<<' eol : '$1'. +close_bit -> '>>' : '$1'. +close_bit -> eol '>>' : '$2'. + +open_curly -> '{' : '$1'. +open_curly -> '{' eol : '$1'. +close_curly -> '}' : '$1'. +close_curly -> eol '}' : '$2'. + +% Operators + +add_op_eol -> add_op : '$1'. +add_op_eol -> add_op eol : '$1'. +add_op_eol -> dual_op : '$1'. +add_op_eol -> dual_op eol : '$1'. + +mult_op_eol -> mult_op : '$1'. +mult_op_eol -> mult_op eol : '$1'. + +two_op_eol -> two_op : '$1'. +two_op_eol -> two_op eol : '$1'. + +three_op_eol -> three_op : '$1'. +three_op_eol -> three_op eol : '$1'. + +pipe_op_eol -> pipe_op : '$1'. +pipe_op_eol -> pipe_op eol : '$1'. + +capture_op_eol -> capture_op : '$1'. +capture_op_eol -> capture_op eol : '$1'. + +unary_op_eol -> unary_op : '$1'. +unary_op_eol -> unary_op eol : '$1'. +unary_op_eol -> dual_op : '$1'. +unary_op_eol -> dual_op eol : '$1'. + +match_op_eol -> match_op : '$1'. +match_op_eol -> match_op eol : '$1'. + +and_op_eol -> and_op : '$1'. +and_op_eol -> and_op eol : '$1'. + +or_op_eol -> or_op : '$1'. +or_op_eol -> or_op eol : '$1'. + +in_op_eol -> in_op : '$1'. +in_op_eol -> in_op eol : '$1'. + +in_match_op_eol -> in_match_op : '$1'. +in_match_op_eol -> in_match_op eol : '$1'. + +type_op_eol -> type_op : '$1'. +type_op_eol -> type_op eol : '$1'. + +when_op_eol -> when_op : '$1'. +when_op_eol -> when_op eol : '$1'. + +stab_op_eol -> stab_op : '$1'. +stab_op_eol -> stab_op eol : '$1'. + +at_op_eol -> at_op : '$1'. +at_op_eol -> at_op eol : '$1'. + +comp_op_eol -> comp_op : '$1'. +comp_op_eol -> comp_op eol : '$1'. + +rel_op_eol -> rel_op : '$1'. +rel_op_eol -> rel_op eol : '$1'. + +arrow_op_eol -> arrow_op : '$1'. +arrow_op_eol -> arrow_op eol : '$1'. + +% Dot operator + +dot_op -> '.' : '$1'. +dot_op -> '.' eol : '$1'. + +dot_identifier -> identifier : '$1'. +dot_identifier -> matched_expr dot_op identifier : build_dot('$2', '$1', '$3'). + +dot_alias -> aliases : {'__aliases__', meta_from_token('$1', 0), ?exprs('$1')}. +dot_alias -> matched_expr dot_op aliases : build_dot_alias('$2', '$1', '$3'). +dot_alias -> matched_expr dot_op dot_alias_container : build_dot_container('$2', '$1', '$3'). + +dot_alias_container -> open_curly '}' : []. +dot_alias_container -> open_curly container_args close_curly : '$2'. + +dot_op_identifier -> op_identifier : '$1'. +dot_op_identifier -> matched_expr dot_op op_identifier : build_dot('$2', '$1', '$3'). + +dot_do_identifier -> do_identifier : '$1'. +dot_do_identifier -> matched_expr dot_op do_identifier : build_dot('$2', '$1', '$3'). + +dot_bracket_identifier -> bracket_identifier : '$1'. +dot_bracket_identifier -> matched_expr dot_op bracket_identifier : build_dot('$2', '$1', '$3'). + +dot_paren_identifier -> paren_identifier : '$1'. +dot_paren_identifier -> matched_expr dot_op paren_identifier : build_dot('$2', '$1', '$3'). + +parens_call -> dot_paren_identifier : '$1'. +parens_call -> matched_expr dot_call_op : {'.', meta_from_token('$2'), ['$1']}. % Fun/local calls + +% Function calls with no parentheses + +call_args_no_parens_expr -> matched_expr : '$1'. +call_args_no_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1'). + +call_args_no_parens_comma_expr -> matched_expr ',' call_args_no_parens_expr : ['$3', '$1']. +call_args_no_parens_comma_expr -> call_args_no_parens_comma_expr ',' call_args_no_parens_expr : ['$3'|'$1']. + +call_args_no_parens_all -> call_args_no_parens_one : '$1'. +call_args_no_parens_all -> call_args_no_parens_ambig : '$1'. +call_args_no_parens_all -> call_args_no_parens_many : '$1'. + +call_args_no_parens_one -> call_args_no_parens_kw : ['$1']. +call_args_no_parens_one -> matched_expr : ['$1']. + +call_args_no_parens_ambig -> no_parens_expr : ['$1']. + +call_args_no_parens_many -> matched_expr ',' call_args_no_parens_kw : ['$1', '$3']. +call_args_no_parens_many -> call_args_no_parens_comma_expr : reverse('$1'). +call_args_no_parens_many -> call_args_no_parens_comma_expr ',' call_args_no_parens_kw : reverse(['$3'|'$1']). + +call_args_no_parens_many_strict -> call_args_no_parens_many : '$1'. +call_args_no_parens_many_strict -> open_paren call_args_no_parens_kw close_paren : throw_no_parens_strict('$1'). +call_args_no_parens_many_strict -> open_paren call_args_no_parens_many close_paren : throw_no_parens_strict('$1'). + +stab_parens_many -> open_paren call_args_no_parens_kw close_paren : ['$2']. +stab_parens_many -> open_paren call_args_no_parens_many close_paren : '$2'. + +% Containers + +container_expr -> matched_expr : '$1'. +container_expr -> unmatched_expr : '$1'. +container_expr -> no_parens_expr : throw_no_parens_container_strict('$1'). + +container_args_base -> container_expr : ['$1']. +container_args_base -> container_args_base ',' container_expr : ['$3'|'$1']. + +container_args -> container_args_base : lists:reverse('$1'). +container_args -> container_args_base ',' : lists:reverse('$1'). +container_args -> container_args_base ',' kw : lists:reverse(['$3'|'$1']). + +% Function calls with parentheses + +call_args_parens_expr -> matched_expr : '$1'. +call_args_parens_expr -> unmatched_expr : '$1'. +call_args_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1'). + +call_args_parens_base -> call_args_parens_expr : ['$1']. +call_args_parens_base -> call_args_parens_base ',' call_args_parens_expr : ['$3'|'$1']. + +call_args_parens -> empty_paren : []. +call_args_parens -> open_paren no_parens_expr close_paren : ['$2']. +call_args_parens -> open_paren kw close_paren : ['$2']. +call_args_parens -> open_paren call_args_parens_base close_paren : reverse('$2'). +call_args_parens -> open_paren call_args_parens_base ',' kw close_paren : reverse(['$4'|'$2']). + +% KV + +kw_eol -> kw_identifier : ?exprs('$1'). +kw_eol -> kw_identifier eol : ?exprs('$1'). +kw_eol -> kw_identifier_safe : build_quoted_atom('$1', true). +kw_eol -> kw_identifier_safe eol : build_quoted_atom('$1', true). +kw_eol -> kw_identifier_unsafe : build_quoted_atom('$1', false). +kw_eol -> kw_identifier_unsafe eol : build_quoted_atom('$1', false). + +kw_base -> kw_eol container_expr : [{'$1', '$2'}]. +kw_base -> kw_base ',' kw_eol container_expr : [{'$3', '$4'}|'$1']. + +kw -> kw_base : reverse('$1'). +kw -> kw_base ',' : reverse('$1'). + +call_args_no_parens_kw_expr -> kw_eol matched_expr : {'$1', '$2'}. +call_args_no_parens_kw_expr -> kw_eol no_parens_expr : {'$1', '$2'}. + +call_args_no_parens_kw -> call_args_no_parens_kw_expr : ['$1']. +call_args_no_parens_kw -> call_args_no_parens_kw_expr ',' call_args_no_parens_kw : ['$1'|'$3']. + +% Lists + +list_args -> kw : '$1'. +list_args -> container_args_base : reverse('$1'). +list_args -> container_args_base ',' : reverse('$1'). +list_args -> container_args_base ',' kw : reverse('$1', '$3'). + +list -> open_bracket ']' : build_list('$1', []). +list -> open_bracket list_args close_bracket : build_list('$1', '$2'). + +% Tuple + +tuple -> open_curly '}' : build_tuple('$1', []). +tuple -> open_curly container_args close_curly : build_tuple('$1', '$2'). + +% Bitstrings + +bit_string -> open_bit '>>' : build_bit('$1', []). +bit_string -> open_bit container_args close_bit : build_bit('$1', '$2'). + +% Map and structs + +%% Allow unquote/@something/aliases inside maps and structs. +map_expr -> max_expr : '$1'. +map_expr -> dot_identifier : build_identifier('$1', nil). +map_expr -> at_op_eol map_expr : build_unary_op('$1', '$2'). + +assoc_op_eol -> assoc_op : '$1'. +assoc_op_eol -> assoc_op eol : '$1'. + +assoc_expr -> matched_expr assoc_op_eol matched_expr : {'$1', '$3'}. +assoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}. +assoc_expr -> matched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}. +assoc_expr -> unmatched_expr assoc_op_eol matched_expr : {'$1', '$3'}. +assoc_expr -> map_expr : '$1'. + +assoc_update -> matched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}. +assoc_update -> unmatched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}. + +assoc_update_kw -> matched_expr pipe_op_eol kw : {'$2', '$1', '$3'}. +assoc_update_kw -> unmatched_expr pipe_op_eol kw : {'$2', '$1', '$3'}. + +assoc_base -> assoc_expr : ['$1']. +assoc_base -> assoc_base ',' assoc_expr : ['$3'|'$1']. + +assoc -> assoc_base : reverse('$1'). +assoc -> assoc_base ',' : reverse('$1'). + +map_op -> '%{}' : '$1'. +map_op -> '%{}' eol : '$1'. + +map_close -> kw close_curly : '$1'. +map_close -> assoc close_curly : '$1'. +map_close -> assoc_base ',' kw close_curly : reverse('$1', '$3'). + +map_args -> open_curly '}' : build_map('$1', []). +map_args -> open_curly map_close : build_map('$1', '$2'). +map_args -> open_curly assoc_update close_curly : build_map_update('$1', '$2', []). +map_args -> open_curly assoc_update ',' close_curly : build_map_update('$1', '$2', []). +map_args -> open_curly assoc_update ',' map_close : build_map_update('$1', '$2', '$4'). +map_args -> open_curly assoc_update_kw close_curly : build_map_update('$1', '$2', []). + +struct_op -> '%' : '$1'. + +map -> map_op map_args : '$2'. +map -> struct_op map_expr map_args : {'%', meta_from_token('$1'), ['$2', '$3']}. +map -> struct_op map_expr eol map_args : {'%', meta_from_token('$1'), ['$2', '$4']}. + +Erlang code. + +-define(file(), get(elixir_parser_file)). +-define(id(Token), element(1, Token)). +-define(location(Token), element(2, Token)). +-define(exprs(Token), element(3, Token)). +-define(meta(Node), element(2, Node)). +-define(rearrange_uop(Op), (Op == 'not' orelse Op == '!')). + +%% The following directive is needed for (significantly) faster +%% compilation of the generated .erl file by the HiPE compiler +-compile([{hipe, [{regalloc, linear_scan}]}]). +-import(lists, [reverse/1, reverse/2]). + +meta_from_token(Token, Counter) -> [{counter, Counter}|meta_from_token(Token)]. +meta_from_token(Token) -> meta_from_location(?location(Token)). + +meta_from_location({Line, Column, EndColumn}) + when is_integer(Line), is_integer(Column), is_integer(EndColumn) -> [{line, Line}]. + +%% Operators + +build_op({_Kind, Location, 'in'}, {UOp, _, [Left]}, Right) when ?rearrange_uop(UOp) -> + {UOp, meta_from_location(Location), [{'in', meta_from_location(Location), [Left, Right]}]}; + +build_op({_Kind, Location, Op}, Left, Right) -> + {Op, meta_from_location(Location), [Left, Right]}. + +build_unary_op({_Kind, Location, Op}, Expr) -> + {Op, meta_from_location(Location), [Expr]}. + +build_list(Marker, Args) -> + {Args, ?location(Marker)}. + +build_tuple(_Marker, [Left, Right]) -> + {Left, Right}; +build_tuple(Marker, Args) -> + {'{}', meta_from_token(Marker), Args}. + +build_bit(Marker, Args) -> + {'<<>>', meta_from_token(Marker), Args}. + +build_map(Marker, Args) -> + {'%{}', meta_from_token(Marker), Args}. + +build_map_update(Marker, {Pipe, Left, Right}, Extra) -> + {'%{}', meta_from_token(Marker), [build_op(Pipe, Left, Right ++ Extra)]}. + +%% Blocks + +build_block([{Op, _, [_]}]=Exprs) when ?rearrange_uop(Op) -> {'__block__', [], Exprs}; +build_block([{unquote_splicing, _, Args}]=Exprs) when + length(Args) =< 2 -> {'__block__', [], Exprs}; +build_block([Expr]) -> Expr; +build_block(Exprs) -> {'__block__', [], Exprs}. + +%% Dots + +build_dot_alias(Dot, {'__aliases__', _, Left}, {'aliases', _, Right}) -> + {'__aliases__', meta_from_token(Dot), Left ++ Right}; + +build_dot_alias(_Dot, Atom, {'aliases', _, _} = Token) when is_atom(Atom) -> + throw_bad_atom(Token); + +build_dot_alias(Dot, Other, {'aliases', _, Right}) -> + {'__aliases__', meta_from_token(Dot), [Other|Right]}. + +build_dot_container(Dot, Left, Right) -> + Meta = meta_from_token(Dot), + {{'.', Meta, [Left, '{}']}, Meta, Right}. + +build_dot(Dot, Left, Right) -> + {'.', meta_from_token(Dot), [Left, extract_identifier(Right)]}. + +extract_identifier({Kind, _, Identifier}) when + Kind == identifier; Kind == bracket_identifier; Kind == paren_identifier; + Kind == do_identifier; Kind == op_identifier -> + Identifier. + +%% Identifiers + +build_nested_parens(Dot, Args1, Args2) -> + Identifier = build_identifier(Dot, Args1), + Meta = ?meta(Identifier), + {Identifier, Meta, Args2}. + +build_identifier({'.', Meta, _} = Dot, Args) -> + FArgs = case Args of + nil -> []; + _ -> Args + end, + {Dot, Meta, FArgs}; + +build_identifier({op_identifier, Location, Identifier}, [Arg]) -> + {Identifier, [{ambiguous_op, nil}|meta_from_location(Location)], [Arg]}; + +build_identifier({_, Location, Identifier}, Args) -> + {Identifier, meta_from_location(Location), Args}. + +%% Fn + +build_fn(Op, [{'->', _, [_, _]}|_] = Stab) -> + {fn, meta_from_token(Op), build_stab(Stab)}; +build_fn(Op, _Stab) -> + throw(meta_from_token(Op), "expected clauses to be defined with -> inside: ", "'fn'"). + +%% Access + +build_access(Expr, {List, Location}) -> + Meta = meta_from_location(Location), + {{'.', Meta, ['Elixir.Access', get]}, Meta, [Expr, List]}. + +%% Interpolation aware + +build_sigil({sigil, Location, Sigil, Parts, Modifiers}) -> + Meta = meta_from_location(Location), + {list_to_atom("sigil_" ++ [Sigil]), Meta, [{'<<>>', Meta, string_parts(Parts)}, Modifiers]}. + +build_bin_string({bin_string, _Location, [H]}) when is_binary(H) -> + H; +build_bin_string({bin_string, Location, Args}) -> + {'<<>>', meta_from_location(Location), string_parts(Args)}. + +build_list_string({list_string, _Location, [H]}) when is_binary(H) -> + elixir_utils:characters_to_list(H); +build_list_string({list_string, Location, Args}) -> + Meta = meta_from_location(Location), + {{'.', Meta, ['Elixir.String', to_char_list]}, Meta, [{'<<>>', Meta, string_parts(Args)}]}. + +build_quoted_atom({_, _Location, [H]}, Safe) when is_binary(H) -> + Op = binary_to_atom_op(Safe), erlang:Op(H, utf8); +build_quoted_atom({_, Location, Args}, Safe) -> + Meta = meta_from_location(Location), + {{'.', Meta, [erlang, binary_to_atom_op(Safe)]}, Meta, [{'<<>>', Meta, string_parts(Args)}, utf8]}. + +binary_to_atom_op(true) -> binary_to_existing_atom; +binary_to_atom_op(false) -> binary_to_atom. + +string_parts(Parts) -> + [string_part(Part) || Part <- Parts]. +string_part(Binary) when is_binary(Binary) -> + Binary; +string_part({Location, Tokens}) -> + Form = string_tokens_parse(Tokens), + Meta = meta_from_location(Location), + {'::', Meta, [{{'.', Meta, ['Elixir.Kernel', to_string]}, Meta, [Form]}, {binary, Meta, nil}]}. + +string_tokens_parse(Tokens) -> + case parse(Tokens) of + {ok, Forms} -> Forms; + {error, _} = Error -> throw(Error) + end. + +%% Keywords + +build_stab([{'->', Meta, [Left, Right]}|T]) -> + build_stab(Meta, T, Left, [Right], []); + +build_stab(Else) -> + build_block(Else). + +build_stab(Old, [{'->', New, [Left, Right]}|T], Marker, Temp, Acc) -> + H = {'->', Old, [Marker, build_block(reverse(Temp))]}, + build_stab(New, T, Left, [Right], [H|Acc]); + +build_stab(Meta, [H|T], Marker, Temp, Acc) -> + build_stab(Meta, T, Marker, [H|Temp], Acc); + +build_stab(Meta, [], Marker, Temp, Acc) -> + H = {'->', Meta, [Marker, build_block(reverse(Temp))]}, + reverse([H|Acc]). + +%% Every time the parser sees a (unquote_splicing()) +%% it assumes that a block is being spliced, wrapping +%% the splicing in a __block__. But in the stab clause, +%% we can have (unquote_splicing(1, 2, 3)) -> :ok, in such +%% case, we don't actually want the block, since it is +%% an arg style call. unwrap_splice unwraps the splice +%% from such blocks. +unwrap_splice([{'__block__', [], [{unquote_splicing, _, _}] = Splice}]) -> + Splice; + +unwrap_splice(Other) -> Other. + +unwrap_when(Args) -> + case elixir_utils:split_last(Args) of + {Start, {'when', Meta, [_, _] = End}} -> + [{'when', Meta, Start ++ End}]; + {_, _} -> + Args + end. + +to_block([One]) -> One; +to_block(Other) -> {'__block__', [], reverse(Other)}. + +%% Warnings and errors + +throw(Meta, Error, Token) -> + Line = + case lists:keyfind(line, 1, Meta) of + {line, L} -> L; + false -> 0 + end, + throw({error, {Line, ?MODULE, [Error, Token]}}). + +throw_bad_atom(Token) -> + throw(meta_from_token(Token), "atom cannot be followed by an alias. If the '.' was meant to be " + "part of the atom's name, the atom name must be quoted. Syntax error before: ", "'.'"). + +throw_no_parens_strict(Token) -> + throw(meta_from_token(Token), "unexpected parentheses. If you are making a " + "function call, do not insert spaces between the function name and the " + "opening parentheses. Syntax error before: ", "'('"). + +throw_no_parens_many_strict(Node) -> + throw(?meta(Node), + "unexpected comma. Parentheses are required to solve ambiguity in nested calls.\n\n" + "This error happens when you have nested function calls without parentheses. " + "For example:\n\n" + " one a, two b, c, d\n\n" + "In the example above, we don't know if the parameters \"c\" and \"d\" apply " + "to the function \"one\" or \"two\". You can solve this by explicitly adding " + "parentheses:\n\n" + " one a, two(b, c, d)\n\n" + "Elixir cannot compile otherwise. Syntax error before: ", "','"). + +throw_no_parens_container_strict(Node) -> + throw(?meta(Node), + "unexpected comma. Parentheses are required to solve ambiguity inside containers.\n\n" + "This error may happen when you forget a comma in a list or other container:\n\n" + " [a, b c, d]\n\n" + "Or when you have ambiguous calls:\n\n" + " [one, two three, four, five]\n\n" + "In the example above, we don't know if the parameters \"four\" and \"five\" " + "belongs to the list or the function \"two\". You can solve this by explicitly " + "adding parentheses:\n\n" + " [one, two(three, four), five]\n\n" + "Elixir cannot compile otherwise. Syntax error before: ", "','"). + +throw_invalid_kw_identifier({_, _, do} = Token) -> + throw(meta_from_token(Token), elixir_tokenizer:invalid_do_error("unexpected keyword \"do:\""), "'do:'"); +throw_invalid_kw_identifier({_, _, KW} = Token) -> + throw(meta_from_token(Token), "syntax error before: ", "'" ++ atom_to_list(KW) ++ "':"). + +%% TODO: Make those warnings errors. +warn_empty_stab_clause({stab_op, {Line, _Begin, _End}, '->'}) -> + elixir_errors:warn(Line, ?file(), + "an expression is always required on the right side of ->. " + "Please provide a value after ->"). + +warn_pipe({arrow_op, {Line, _Begin, _End}, Op}, {_, [_|_], [_|_]}) -> + elixir_errors:warn(Line, ?file(), + io_lib:format( + "you are piping into a function call without parentheses, which may be ambiguous. " + "Please wrap the function you are piping into in parentheses. For example:\n\n" + " foo 1 ~ts bar 2 ~ts baz 3\n\n" + "Should be written as:\n\n" + " foo(1) ~ts bar(2) ~ts baz(3)\n", + [Op, Op, Op, Op] + ) + ); +warn_pipe(_Token, _) -> + ok. From 15232fc072df1f97b40c098551a9426c82527641 Mon Sep 17 00:00:00 2001 From: Louis Pilfold Date: Mon, 4 Jan 2016 12:17:31 +0000 Subject: [PATCH 133/205] Add the LFE lexer as an example of erlang .xrl --- samples/Erlang/lfe_scan.xrl | 256 ++++++++++++++++++++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 samples/Erlang/lfe_scan.xrl diff --git a/samples/Erlang/lfe_scan.xrl b/samples/Erlang/lfe_scan.xrl new file mode 100644 index 00000000..72bb1b22 --- /dev/null +++ b/samples/Erlang/lfe_scan.xrl @@ -0,0 +1,256 @@ +%% Copyright (c) 2008-2013 Robert Virding +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. + +%% File : lfe_scan.xrl +%% Author : Robert Virding +%% Purpose : Token definitions for Lisp Flavoured Erlang. + +Definitions. +B = [01] +O = [0-7] +D = [0-9] +H = [0-9a-fA-F] +B36 = [0-9a-zA-Z] +U = [A-Z] +L = [a-z] +A = ({U}|{L}) +DEL = [][()}{";\000-\s] +SYM = [^][()}{";\000-\s\177-\237] +SSYM = [^][()}{"|;#`',\000-\s\177-\237] +WS = ([\000-\s]|;[^\n]*) + +Rules. +%% Bracketed Comments using #| foo |# +#{D}*\|[^\|]*\|+([^#\|][^\|]*\|+)*# : + block_comment(string:substr(TokenChars, 3)). + +%% Separators +' : {token,{'\'',TokenLine}}. +` : {token,{'`',TokenLine}}. +, : {token,{',',TokenLine}}. +,@ : {token,{',@',TokenLine}}. +\. : {token,{'.',TokenLine}}. +[][()}{] : {token,{list_to_atom(TokenChars),TokenLine}}. + +#{D}*[bB]\( : {token,{'#B(',TokenLine}}. +#{D}*[mM]\( : {token,{'#M(',TokenLine}}. +#{D}*\( : {token,{'#(',TokenLine}}. +#{D}*\. : {token,{'#.',TokenLine}}. + +#{D}*` : {token,{'#`',TokenLine}}. +#{D}*; : {token,{'#;',TokenLine}}. +#{D}*, : {token,{'#,',TokenLine}}. +#{D}*,@ : {token,{'#,@',TokenLine}}. + +%% Characters +#{D}*\\(x{H}+|.) : char_token(skip_past(TokenChars, $\\, $\\), TokenLine). + +%% Based numbers +#{D}*\*{SYM}+ : base_token(skip_past(TokenChars, $*, $*), 2, TokenLine). +#{D}*[bB]{SYM}+ : base_token(skip_past(TokenChars, $b, $B), 2, TokenLine). +#{D}*[oO]{SYM}+ : base_token(skip_past(TokenChars, $o, $O), 8, TokenLine). +#{D}*[dD]{SYM}+ : base_token(skip_past(TokenChars, $d, $D), 10, TokenLine). +#{D}*[xX]{SYM}+ : base_token(skip_past(TokenChars, $x, $X), 16, TokenLine). +#{D}*[rR]{SYM}+ : + %% Scan over digit chars to get base. + {Base,[_|Ds]} = base1(tl(TokenChars), 10, 0), + base_token(Ds, Base, TokenLine). + +%% String +"(\\x{H}+;|\\.|[^"\\])*" : + %% Strip quotes. + S = string:substr(TokenChars, 2, TokenLen - 2), + {token,{string,TokenLine,chars(S)}}. +%% Binary string +#"(\\x{H}+;|\\.|[^"\\])*" : + %% Strip quotes. + S = string:substr(TokenChars, 3, TokenLen - 3), + Bin = unicode:characters_to_binary(chars(S), utf8, utf8), + {token,{binary,TokenLine,Bin}}. +%% Symbols +\|(\\x{H}+;|\\.|[^|\\])*\| : + %% Strip quotes. + S = string:substr(TokenChars, 2, TokenLen - 2), + symbol_token(chars(S), TokenLine). +%% Funs +#'{SSYM}{SYM}*/{D}+ : + %% Strip sharpsign single-quote. + FunStr = string:substr(TokenChars,3), + {token,{'#\'',TokenLine,FunStr}}. +%% Atoms +[+-]?{D}+ : + case catch {ok,list_to_integer(TokenChars)} of + {ok,I} -> {token,{number,TokenLine,I}}; + _ -> {error,"illegal integer"} + end. +[+-]?{D}+\.{D}+([eE][+-]?{D}+)? : + case catch {ok,list_to_float(TokenChars)} of + {ok,F} -> {token,{number,TokenLine,F}}; + _ -> {error,"illegal float"} + end. +{SSYM}{SYM}* : + symbol_token(TokenChars, TokenLine). +{WS}+ : skip_token. + +Erlang code. +%% Copyright (c) 2008-2013 Robert Virding +%% +%% Licensed under the Apache License, Version 2.0 (the "License"); +%% you may not use this file except in compliance with the License. +%% You may obtain a copy of the License at +%% +%% http://www.apache.org/licenses/LICENSE-2.0 +%% +%% Unless required by applicable law or agreed to in writing, software +%% distributed under the License is distributed on an "AS IS" BASIS, +%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +%% See the License for the specific language governing permissions and +%% limitations under the License. + +%% File : lfe_scan.erl +%% Author : Robert Virding +%% Purpose : Token definitions for Lisp Flavoured Erlang. + +-export([start_symbol_char/1,symbol_char/1]). + +-import(string, [substr/2,substr/3]). + +%% start_symbol_char(Char) -> true | false. +%% symbol_char(Char) -> true | false. +%% Define start symbol chars and symbol chars. + +start_symbol_char($#) -> false; +start_symbol_char($`) -> false; +start_symbol_char($') -> false; %' +start_symbol_char($,) -> false; +start_symbol_char($|) -> false; %Symbol quote character +start_symbol_char(C) -> symbol_char(C). + +symbol_char($() -> false; +symbol_char($)) -> false; +symbol_char($[) -> false; +symbol_char($]) -> false; +symbol_char(${) -> false; +symbol_char($}) -> false; +symbol_char($") -> false; +symbol_char($;) -> false; +symbol_char(C) -> ((C > $\s) and (C =< $~)) orelse (C > $\240). + +%% symbol_token(Chars, Line) -> {token,{symbol,Line,Symbol}} | {error,E}. +%% Build a symbol from list of legal characters, else error. + +symbol_token(Cs, L) -> + case catch {ok,list_to_atom(Cs)} of + {ok,S} -> {token,{symbol,L,S}}; + _ -> {error,"illegal symbol"} + end. + +%% base_token(Chars, Base, Line) -> Integer. +%% Convert a string of Base characters into a number. We only allow +%% base betqeen 2 and 36, and an optional sign character first. + +base_token(_, B, _) when B < 2; B > 36 -> + {error,"illegal number base"}; +base_token([$+|Cs], B, L) -> base_token(Cs, B, +1, L); +base_token([$-|Cs], B, L) -> base_token(Cs, B, -1, L); +base_token(Cs, B, L) -> base_token(Cs, B, +1, L). + +base_token(Cs, B, S, L) -> + case base1(Cs, B, 0) of + {N,[]} -> {token,{number,L,S*N}}; + {_,_} -> {error,"illegal based number"} + end. + +base1([C|Cs], Base, SoFar) when C >= $0, C =< $9, C < Base + $0 -> + Next = SoFar * Base + (C - $0), + base1(Cs, Base, Next); +base1([C|Cs], Base, SoFar) when C >= $a, C =< $z, C < Base + $a - 10 -> + Next = SoFar * Base + (C - $a + 10), + base1(Cs, Base, Next); +base1([C|Cs], Base, SoFar) when C >= $A, C =< $Z, C < Base + $A - 10 -> + Next = SoFar * Base + (C - $A + 10), + base1(Cs, Base, Next); +base1([C|Cs], _Base, SoFar) -> {SoFar,[C|Cs]}; +base1([], _Base, N) -> {N,[]}. + +-define(IS_UNICODE(C), ((C >= 0) and (C =< 16#10FFFF))). + +%% char_token(InputChars, Line) -> {token,{number,L,N}} | {error,E}. +%% Convert an input string into the corresponding character. For a +%% sequence of hex characters we check resultant is code is in the +%% unicode range. + +char_token([$x,C|Cs], L) -> + case base1([C|Cs], 16, 0) of + {N,[]} when ?IS_UNICODE(N) -> {token,{number,L,N}}; + _ -> {error,"illegal character"} + end; +char_token([C], L) -> {token,{number,L,C}}. + +%% chars(InputChars) -> Chars. +%% Convert an input string into the corresponding string characters. +%% We know that the input string is correct. + +chars([$\\,$x,C|Cs0]) -> + case hex_char(C) of + true -> + case base1([C|Cs0], 16, 0) of + {N,[$;|Cs1]} -> [N|chars(Cs1)]; + _Other -> [escape_char($x)|chars([C|Cs0])] + end; + false -> [escape_char($x)|chars([C|Cs0])] + end; +chars([$\\,C|Cs]) -> [escape_char(C)|chars(Cs)]; +chars([C|Cs]) -> [C|chars(Cs)]; +chars([]) -> []. + +hex_char(C) when C >= $0, C =< $9 -> true; +hex_char(C) when C >= $a, C =< $f -> true; +hex_char(C) when C >= $A, C =< $F -> true; +hex_char(_) -> false. + +escape_char($b) -> $\b; %\b = BS +escape_char($t) -> $\t; %\t = TAB +escape_char($n) -> $\n; %\n = LF +escape_char($v) -> $\v; %\v = VT +escape_char($f) -> $\f; %\f = FF +escape_char($r) -> $\r; %\r = CR +escape_char($e) -> $\e; %\e = ESC +escape_char($s) -> $\s; %\s = SPC +escape_char($d) -> $\d; %\d = DEL +escape_char(C) -> C. + +%% Block Comment: +%% Provide a sensible error when people attempt to include nested +%% comments because currently the parser cannot process them without +%% a rebuild. But simply exploding on a '#|' is not going to be that +%% helpful. + +block_comment(TokenChars) -> + %% Check we're not opening another comment block. + case string:str(TokenChars, "#|") of + 0 -> skip_token; %% No nesting found + _ -> {error, "illegal nested block comment"} + end. + +%% skip_until(String, Char1, Char2) -> String. +%% skip_past(String, Char1, Char2) -> String. + +%% skip_until([C|_]=Cs, C1, C2) when C =:= C1 ; C =:= C2 -> Cs; +%% skip_until([_|Cs], C1, C2) -> skip_until(Cs, C1, C2); +%% skip_until([], _, _) -> []. + +skip_past([C|Cs], C1, C2) when C =:= C1 ; C =:= C2 -> Cs; +skip_past([_|Cs], C1, C2) -> skip_past(Cs, C1, C2); +skip_past([], _, _) -> []. From 71f124faa5634cdc45b7c170aa21061bc3532b70 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sun, 10 Jan 2016 10:10:41 +0100 Subject: [PATCH 134/205] HTTPS links for submodules When cloning the repository with all its submodules, users without an SSH key registered will fail to clone submodules with an SSH link --- .gitmodules | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 587ae6cd..e3dfa2a7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -676,7 +676,7 @@ url = https://github.com/CausalityLtd/sublime-pony [submodule "vendor/grammars/X10"] path = vendor/grammars/X10 - url = git@github.com:x10-lang/x10-highlighting.git + url = https://github.com/x10-lang/x10-highlighting [submodule "vendor/grammars/language-babel"] path = vendor/grammars/language-babel url = https://github.com/gandm/language-babel @@ -691,7 +691,7 @@ url = https://github.com/freemarker/FreeMarker.tmbundle [submodule "vendor/grammars/MagicPython"] path = vendor/grammars/MagicPython - url = git@github.com:MagicStack/MagicPython.git + url = https://github.com/MagicStack/MagicPython [submodule "vendor/grammars/language-click"] path = vendor/grammars/language-click url = https://github.com/stenverbois/language-click.git @@ -706,4 +706,4 @@ url = https://github.com/erkyrath/language-inform7 [submodule "vendor/grammars/atom-language-stan"] path = vendor/grammars/atom-language-stan - url = git@github.com:jrnold/atom-language-stan.git + url = https://github.com/jrnold/atom-language-stan From 7b30240a7fcef3216e12efdc79eb41843399f822 Mon Sep 17 00:00:00 2001 From: Christoph Lipka Date: Sun, 10 Jan 2016 13:05:41 +0100 Subject: [PATCH 135/205] Added POV-Ray Scene Description Language --- .gitmodules | 3 + grammars.yml | 2 + lib/linguist/languages.yml | 9 ++ samples/POV-Ray SDL/gamma_showcase.pov | 188 +++++++++++++++++++++++++ vendor/grammars/language-povray | 1 + 5 files changed, 203 insertions(+) mode change 100644 => 100755 lib/linguist/languages.yml create mode 100755 samples/POV-Ray SDL/gamma_showcase.pov create mode 160000 vendor/grammars/language-povray diff --git a/.gitmodules b/.gitmodules index 587ae6cd..21e7c603 100644 --- a/.gitmodules +++ b/.gitmodules @@ -707,3 +707,6 @@ [submodule "vendor/grammars/atom-language-stan"] path = vendor/grammars/atom-language-stan url = git@github.com:jrnold/atom-language-stan.git +[submodule "vendor/grammars/language-povray"] + path = vendor/grammars/language-povray + url = https://github.com/c-lipka/language-povray diff --git a/grammars.yml b/grammars.yml index c8de7b72..0ad993fc 100644 --- a/grammars.yml +++ b/grammars.yml @@ -358,6 +358,8 @@ vendor/grammars/language-maxscript: - source.maxscript vendor/grammars/language-ncl: - source.ncl +vendor/grammars/language-povray: +- source.povray vendor/grammars/language-python: - text.python.console - text.python.traceback diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml old mode 100644 new mode 100755 index fe3ed9aa..8baabdbd --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2711,6 +2711,15 @@ PostScript: aliases: - postscr ace_mode: text + +POV-Ray SDL: + type: programming + aliases: + - pov-ray + - povray + extensions: + - .pov + - .inc PowerShell: type: programming diff --git a/samples/POV-Ray SDL/gamma_showcase.pov b/samples/POV-Ray SDL/gamma_showcase.pov new file mode 100755 index 00000000..70a44aef --- /dev/null +++ b/samples/POV-Ray SDL/gamma_showcase.pov @@ -0,0 +1,188 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Persistence of Vision Ray Tracer Scene Description File +// File: gamma_showcase.pov +// Vers: 3.7 +// Desc: Gamma Handling Test Scene - An arrangement of spheres on a marble plane +// Date: 2010-12-21 +// Auth: Christoph Lipka +// + +// +w640 +h480 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase.png +// +w640 +h480 +a0.3 +am1 +fN -d File_Gamma=1.0 Output_File_Name=gamma_showcase_linear.png +// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref0.png Declare=Stripes=off +// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref1.png Declare=Stripes=off Declare=Gamma=1.2 +// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref2.png Declare=Stripes=off Declare=Gamma=0.8 +// +w640 +h480 +a0.3 +am1 -f +d + +#version 3.7; + +#include "colors.inc" +#include "stones.inc" + +#ifndef (Stripes) + #declare Stripes = on; +#end +#ifndef (Gamma) + #declare Gamma = 1.0; +#end + +global_settings { + max_trace_level 5 + assumed_gamma 1.0 + radiosity { + pretrace_start 0.08 + pretrace_end 0.01 + count 35 + nearest_count 5 + error_bound 1.8 + recursion_limit 2 + low_error_factor .5 + gray_threshold 0.0 + minimum_reuse 0.015 + brightness 1 + adc_bailout 0.01/2 + } +} + +#default { + texture { + pigment {rgb 1} + finish { + ambient 0.0 + diffuse 0.6 + specular 0.6 roughness 0.001 + reflection { 0.0 1.0 fresnel on } + conserve_energy + } + } +} + +// ---------------------------------------- + +#local TestRed = rgb <0.5,0.1,0.1>; +#local TestGreen = rgb <0.1,0.5,0.1>; +#local TestBlue = rgb <0.1,0.1,0.5>; + +#local CameraFocus = <0,0.5,0>; +#local CameraDist = 8; +#local CameraDepth = 1.8; +#local CameraTilt = 20; + +camera { + location <0,0,0> + direction z*CameraDepth + right x*image_width/image_height + up y + translate <0,0,-CameraDist> + rotate x*CameraTilt + translate CameraFocus +} + +#macro LightSource(Pos,Color) + light_source { + Pos + color Color + spotlight + point_at <0,0,0> + radius 175/vlength(Pos) + falloff 200/vlength(Pos) + area_light x*vlength(Pos)/10, y*vlength(Pos)/10, 9,9 adaptive 1 jitter circular orient + } + +#end + +LightSource(<-500,500,-500>,TestRed + <0.2,0.2,0.2>) +LightSource(< 0,500,-500>,TestGreen + <0.2,0.2,0.2>) +LightSource(< 500,500,-500>,TestBlue + <0.2,0.2,0.2>) + +// ---------------------------------------- + +#macro DarkStripeBW(TargetBrightness) + #if (TargetBrightness < 0.5) + (0.0) + #else + (TargetBrightness*2 - 1.0) + #end +#end + +#macro BrightStripeBW(TargetBrightness) + #if (TargetBrightness < 0.5) + (TargetBrightness*2) + #else + (1.0) + #end +#end + +#macro DarkStripeRGB(TargetColor) + +#end + +#macro BrightStripeRGB(TargetColor) + +#end + +#macro StripedPigment(TargetColor) + #if (Stripes) + function { abs(mod(abs(image_height*CameraDepth*y/z+0.5),2.0)-1.0) } + color_map { + [0.5 color rgb DarkStripeRGB(TargetColor) ] + [0.5 color rgb BrightStripeRGB(TargetColor) ] + } + translate <0,0,-CameraDist> + rotate x*CameraTilt + translate CameraFocus + #else + color TargetColor + #end +#end + + +plane { + y, 0 + texture { T_Stone11 } + interior { ior 1.5 } +} + +#macro GammaAdjust(C,G) + #local C2 = color rgbft ; + (C2) +#end + +#macro TestSphere(Pos,Radius,TargetColor,Split) + sphere { + Pos + y*Radius, Radius + texture { pigment { color GammaAdjust(TargetColor,Gamma) } } + interior { ior 1.5 } + } + #if (Split) + sphere { + Pos + y*Radius + x*0.001, Radius + texture { pigment { StripedPigment(TargetColor) } } + interior { ior 1.5 } + } + #end +#end + +TestSphere(<-2,0,1>, 1, TestRed, true) +TestSphere(< 0,0,1>, 1, TestGreen, true) +TestSphere(< 2,0,1>, 1, TestBlue, true) + +#local Steps = 6; +#for(I,0,1,1/Steps) + #if (I < 0.5) + #local Color2 = TestRed; + #else + #local Color2 = TestBlue; + #end + #local P = abs(I-0.5)*2; + TestSphere(, 2/Steps, (1-P)*TestGreen + P*Color2, true) +#end + +#local Steps = 8; +#for(I,0,1,1/Steps) + TestSphere(, 2/Steps, rgb I, true) + TestSphere(, 2/Steps, GammaAdjust(rgb I, 2.2*Gamma), false) +#end diff --git a/vendor/grammars/language-povray b/vendor/grammars/language-povray new file mode 160000 index 00000000..f5c6de81 --- /dev/null +++ b/vendor/grammars/language-povray @@ -0,0 +1 @@ +Subproject commit f5c6de8132fc01bd2274bf15e006bb4e3da7d710 From b593a8ae6714ea61df5910fc5f11ac48479a6c7f Mon Sep 17 00:00:00 2001 From: Christoph Lipka Date: Sun, 10 Jan 2016 18:40:29 +0100 Subject: [PATCH 136/205] Added more samples for the POV-Ray Scene Description Language --- samples/POV-Ray SDL/balcony.pov | 207 + samples/POV-Ray SDL/bglass.inc | 117 + samples/POV-Ray SDL/building.inc | 212 + samples/POV-Ray SDL/chair.inc | 382 + samples/POV-Ray SDL/cloth.inc | 12217 ++++++++++++++++++++++++++ samples/POV-Ray SDL/sky.inc | 91 + samples/POV-Ray SDL/table.inc | 171 + samples/POV-Ray SDL/table_cloth.inc | 91 + samples/POV-Ray SDL/table_stuff.inc | 136 + samples/POV-Ray SDL/terrain.inc | 118 + samples/POV-Ray SDL/water.inc | 74 + 11 files changed, 13816 insertions(+) create mode 100755 samples/POV-Ray SDL/balcony.pov create mode 100755 samples/POV-Ray SDL/bglass.inc create mode 100755 samples/POV-Ray SDL/building.inc create mode 100755 samples/POV-Ray SDL/chair.inc create mode 100755 samples/POV-Ray SDL/cloth.inc create mode 100755 samples/POV-Ray SDL/sky.inc create mode 100755 samples/POV-Ray SDL/table.inc create mode 100755 samples/POV-Ray SDL/table_cloth.inc create mode 100755 samples/POV-Ray SDL/table_stuff.inc create mode 100755 samples/POV-Ray SDL/terrain.inc create mode 100755 samples/POV-Ray SDL/water.inc diff --git a/samples/POV-Ray SDL/balcony.pov b/samples/POV-Ray SDL/balcony.pov new file mode 100755 index 00000000..87d10da3 --- /dev/null +++ b/samples/POV-Ray SDL/balcony.pov @@ -0,0 +1,207 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Persistence Of Vision Ray Tracer Scene Description File +// File: balcony.pov +// Desc: Povray demonstration scene +// Date: July/August 2001 +// Auth: Christoph Hormann +// +// *********************************************************************** +// +// -------------------- 'balcony' demonstration scene -------------------- +// +// written July-August 2001 by Christoph Hormann +// +// demonstrates use of various new or changed features: +// +// - isosurface (for the rail columns) +// - mesh2 object (table cloth) +// - uv-mapping (table cloth) +// - pattern image type (background heightfield) +// - slope pattern (background heightfield) +// - variable reflection (water & glass) +// - metallic reflection +// - conserve_energy +// - function pattern (water) +// - fading interior (water, drink) +// - 'circular' and 'orient' area_light +// - radiosity +// - photons (objects on the table) +// +// *********************************************************************** +// +// Command line options: +// +// -w240 -h320 +// -w480 -h640 +a0.3 +// -w600 -h800 +a0.3 + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#version 3.6; + +#include "functions.inc" +#include "colors.inc" + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#declare AreaLight=on; +#declare Radiosity=on; +#declare Photons=on; +#declare TestLight=off; +#declare show_Fog=true; +#declare show_Water=true; +#declare show_Terrain=true; +#declare show_Building=true; +#declare show_Table=true; +#declare show_TableCloth=true; +#declare show_Chair=true; +#declare show_Table_Stuff=true; + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +global_settings{ + max_trace_level 15 + assumed_gamma 1 + + #if (Radiosity=on) + radiosity{ + pretrace_start 0.08 + pretrace_end 0.01 + count 130 + nearest_count 5 + error_bound 0.3 + + recursion_limit 1 + low_error_factor 0.5 + gray_threshold 0.0 + minimum_reuse 0.015 + brightness 1.0 + adc_bailout 0.01/2 + normal on + } + #end + + #if (Photons=on) + photons { + spacing 0.002 + } + #end + +} + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ +// This scene uses a non-standard camera set-up. +// (See CAMERA in the included documentation for details.) +// If you are new to POV-Ray, you might want to try a different demo scene. + +camera { + location <0.5, 0.5, 1.2> + direction y + sky z + up z + right x*image_width/image_height // keep propotions with any aspect ratio + look_at <5, 4.3, 0.9> + angle 36 +} + +/* +camera { // table detail camera + location <1.5, 1.5, 1.0> + direction y + sky z + up z + right x*image_width/image_height // keep propotions with any aspect ratio + look_at <3.3,2.52,0.5> + angle 30 +} +*/ + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + + +#if (TestLight=on) + light_source { + <2, 2, 2> + color rgb 0.7 + } +#end + + +light_source { + <3.0, -2.5, 2.6>*10000 + color rgb <3.43,2.87,1.95> + #if (AreaLight=on) + area_light 400*x 400*y 4,4 + jitter + circular + orient + #end + + photons { + reflection on + refraction on + } +} + + +#if (show_Fog) + +fog{ + fog_type 2 + fog_alt 1.2 + fog_offset 0 + color rgbt <0.60, 0.68, 0.82, 0.0> + distance 700 + up z +} + +#end + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#include "sky.inc" + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (show_Water) + #include "water.inc" +#end + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (show_Building) + #include "building.inc" +#end + + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (show_Terrain) + #include "terrain.inc" +#end + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (show_Table) + #include "table.inc" +#end + +#if (show_TableCloth) + #include "table_cloth.inc" +#end + +#if (show_Table_Stuff) + #include "table_stuff.inc" +#end + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (show_Chair) + #include "chair.inc" +#end + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + diff --git a/samples/POV-Ray SDL/bglass.inc b/samples/POV-Ray SDL/bglass.inc new file mode 100755 index 00000000..dde88d44 --- /dev/null +++ b/samples/POV-Ray SDL/bglass.inc @@ -0,0 +1,117 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Persistence Of Vision Ray Tracer Include File +// File: bglass.inc +// Desc: drinking glass for 'balcony.pov' demonstration scene +// Date: July/August 2001 +// Auth: Christoph Hormann + +// Updated: 09Aug2008 (jh) for v3.7 distribution + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (version < 3.7) + #version 3.5; +#end + +#declare Mat_Glass= +material { + texture { + pigment { color rgbt 1 } + finish { + ambient 0.0 + diffuse 0.1 + specular 0.5 + roughness 0.05 + + reflection { + 0.0, 1.0 + fresnel on + } + + conserve_energy + } + } + interior { + ior 1.5 + fade_distance 0.1 + fade_power 1001 + fade_color <0.4,0.4,0.4> + } +} + +#declare Mat_Liquid= +material { + texture { + pigment { color rgbt 1 } + finish { + ambient 0.0 + diffuse 0.1 + specular 0.5 + roughness 0.01 + + reflection { + 0.0, 1.0 + fresnel on + } + + conserve_energy + } + } + interior { + ior 1.3 + fade_distance 0.03 + fade_power 1001 + fade_color <0.8,0.3,0.4> + } +} + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#include "shapes.inc" + +#local Content_Shape= +merge { + cylinder { + 0*z, 5*z, 3.0 + } + + object { Round_Cylinder_Merge (2*z, -3*z, 3.0, 0.25) } + + material { Mat_Liquid } +} + +#declare Glass= +union { + merge { + difference { + cylinder { + 0.01*z, 14*z, 3.2 + } + + cylinder { + 0*z, 10*z, 3.0 + translate 4.6*z + } + + object { Round_Cylinder_Merge (2*z, -3*z, 3.0, 0.25) translate 4.6*z } + } + torus { + 3.1, 0.1 + rotate 90*x + translate 14*z + } + + material { Mat_Glass } + } + + object { Content_Shape scale 0.99 translate 4.6*z } + + scale 1.1 + scale 0.01 +} + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + diff --git a/samples/POV-Ray SDL/building.inc b/samples/POV-Ray SDL/building.inc new file mode 100755 index 00000000..400b8166 --- /dev/null +++ b/samples/POV-Ray SDL/building.inc @@ -0,0 +1,212 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Persistence Of Vision Ray Tracer Include File +// File: building.inc +// Desc: building for 'balcony.pov' demonstration scene +// Date: July/August 2001 +// Auth: Christoph Hormann + +// Updated: 09Aug2008 (jh) for v3.7 distribution + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (version < 3.7) + #version 3.5; +#end + +#declare Tex_Stone= +texture { + pigment { + + agate + color_map { + [0.7 color rgb <0.6,0.6,0.6> ] + [1.0 color rgb 0.46 ] + } + warp { turbulence <0.7,0.4,0.4> } + scale <0.3,1.2,1.2>*0.25 + rotate -60*y + rotate 70*z + } + finish { + ambient 0.0//0.1 + diffuse 0.5 + specular 0.15 + } + normal { + granite 0.2 + warp {turbulence 1} + scale 0.1 + } +} + +#declare Tex_Floor_A= +texture { + pigment { + color rgb <0.6,0.6,0.6> + } + finish { + ambient 0.0 + diffuse 0.5 + specular 0.15 + } + normal { + granite 0.2 + warp {turbulence 1} + scale 0.25 + translate 2 + } +} + +#declare Tex_Floor_B= +texture { + pigment { + color rgb <0.18,0.18,0.22> + } + finish { + ambient 0.0 + diffuse 0.5 + specular 0.15 + } + normal { + granite 0.2 + warp {turbulence 1} + scale 0.25 + } +} + +#declare Tex_Floor= +texture { + checker + texture { Tex_Floor_A }, + texture { Tex_Floor_B } + scale 0.4 + rotate 45*z +} + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#include "shapes.inc" + +#declare fn_Rad= +function { + sin(pow(abs(z*0.4),1.8))+0.4 +} + +#declare Small_Column_part1= +isosurface { + function { min(sqrt( x*x + y*y ) - fn_Rad(x, y, z), sqrt( x*x + y*y + pow(abs(z*2),1.4)) - 1.0) } + max_gradient 1.8 + //eval + accuracy 0.001 + contained_by { box { -4, 4 } } + translate 4*z + scale 6 + + texture { Tex_Stone } +} + +#declare Small_Column= +union { + object { Small_Column_part1 translate 3*z } + object { Round_Cylinder_Union (0, 3*z, 10, 1) } + object { Round_Cylinder_Union (51*z, 54*z, 10, 1) } + + scale 0.01 + + translate 0.1*z + texture { Tex_Stone } +} + +#declare Large_Column= +union { + object { Round_Cylinder_Merge (0.7*z, 0.8*z, 0.22, 0.02) } + + cylinder { 0.75*z, 3*z, 0.2 } + object { Round_Box_Union (<-0.23,-0.23,-0.1>, <0.23,0.23,0.15>, 0.02) } + object { Round_Box_Union (<-0.20,-0.20,0.00>, <0.20,0.20,0.70>, 0.02) } + object { Round_Box_Union (<-0.23,-0.23,0.58>, <0.23,0.23,0.70>, 0.02) } + object { Round_Box_Union (<-0.26,-0.26,0.64>, <0.26,0.26,0.74>, 0.02) } + + torus { 0.2, 0.06 rotate 90*x translate 2.74*z } + + object { Round_Box_Union (<-0.26,-0.26,2.80>, <0.26,0.26,2.88>, 0.01) } + + texture { Tex_Stone } +} + +#declare Balustrade= +union { + object { Round_Box_Union (<0.0,-0.15,0>, <5,0.15,0.1>, 0.02) } + object { Round_Box_Union (<0.0,-0.15,0.64>, <5,0.15,0.74>, 0.02) } + + #declare Cnt=0; + + #while (Cnt<10) + object { Small_Column translate(Cnt*0.5+0.6)*x } + #declare Cnt=Cnt+1; + #end + + texture { Tex_Stone } +} + +#declare Walls= +union { + box { <-0.5,-0.5,-1>, <-2,5.5,3.2> } + box { <-0.5,-0.5,-1>, <5.5,-2,3.2> } + + texture { Tex_Stone } +} + +#declare Ceiling_Segment= +union { + box { <-0.20,-0.20,2.94>, <0.20,0.20,2.98> } + box { <-0.14,-0.14,2.94>, <0.14,0.14,3.01> } +} + +#declare Ceiling= +union { + box { <5.6,5.6,3.04>, <-2,-2,3.5> } + + union { + object { Round_Box_Union (<0.0,-0.26,3.1>, <6,0.26,2.88>, 0.02) rotate 180*z } + object { Round_Box_Union (<0.0,-0.26,3.1>, <6,0.26,2.88>, 0.02) rotate -90*z } + translate <5,5,0> + } + + difference { + box { <5.0,5.0,2.95>, <-2,-2,3.5> } + object { Ceiling_Segment translate <4.44,4.44,0> } + object { Ceiling_Segment translate <4.44,3.94,0> } + object { Ceiling_Segment translate <3.94,4.44,0> } + object { Ceiling_Segment translate <3.94,3.94,0> } + object { Ceiling_Segment translate <4.44,3.44,0> } + object { Ceiling_Segment translate <3.44,4.44,0> } + object { Ceiling_Segment translate <3.94,3.44,0> } + object { Ceiling_Segment translate <3.44,3.94,0> } + object { Ceiling_Segment translate <4.44,2.94,0> } + object { Ceiling_Segment translate <2.94,4.44,0> } + } + + texture { Tex_Stone } +} + +#declare Base= +union { + box { <5.4,5.4,0>, <0,0,-1> texture { Tex_Floor } } + box { <6,6,-1>, <0,0,-2> } + + texture { Tex_Stone } +} + +object { Balustrade rotate 180*z translate <5,5,0> } +object { Balustrade rotate -90*z translate <5,5,0> } +object { Large_Column translate <5,5,0> } +object { Base } +object { Walls } +object { Ceiling } + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + diff --git a/samples/POV-Ray SDL/chair.inc b/samples/POV-Ray SDL/chair.inc new file mode 100755 index 00000000..39d47857 --- /dev/null +++ b/samples/POV-Ray SDL/chair.inc @@ -0,0 +1,382 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Persistence Of Vision Ray Tracer Include File +// File: chair.inc +// Desc: chair for 'balcony.pov' demonstration scene +// Date: July/August 2001 +// Auth: Christoph Hormann + +// Updated: 09Aug2008 (jh) for v3.7 distribution + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (version < 3.7) + #version 3.5; +#end + +#declare Tex_Table_Foot= +texture { + pigment { + color rgb 0.4 + } + finish { + ambient 0.0 + diffuse 0.3 + specular 0.4 + roughness 0.01 + metallic + + reflection { + 0.8 + metallic + } + } +} + +#declare Tex_Table_Foot_Bottom= +texture { + pigment { + color rgb 0.2 + } + finish { + ambient 0.0 + diffuse 0.3 + specular 0.4 + roughness 0.02 + } +} + +#declare Tex_Dark_Wood= +texture { + pigment { + bozo + color_map { + [0.3 color rgb <0.0,0.0,0.16> ] + [0.5 color rgb <0.0,0.0,0.08> ] + [0.7 color rgb <0.0,0.0,0.0> ] + } + scale <4,1,1>*0.036 + } + finish { + ambient 0.09 + diffuse 0.3 + specular 0.5 + roughness 0.025 + + reflection { + 0.15 + metallic + } + } + normal { + granite 0.1 + scale 0.03 + accuracy 0.007 + } +} + + + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#include "shapes.inc" + +#local Chair_Tube_Rad=0.01; +#local Chair_Tube_Curve_Rad=0.045; +#local Chair_Leg_Angle=7; +#local Chair_Leg_AngleA=4; +#local Chair_Leg_Depth=0.13; + +#local Chair_Plate_Curve_Rad=0.03; +#local Chair_Plate_Thickness=0.008; +#local Chair_Plate_Width=0.48; +#local Chair_Plate_UWidth=0.22; +#local Chair_Plate_Height=0.45; +#local Chair_Plate_UAngle=5; +#local Chair_Plate_Depth=0.26; + +#local Chair_Leg= +union { + + intersection { + torus { Chair_Tube_Curve_Rad, Chair_Tube_Rad } + plane { x, 0 } + plane { -x, 0 rotate (-90+Chair_Leg_Angle)*y } + } + + cylinder { + <-Chair_Tube_Curve_Rad,0,0>, + <-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height+0.01>, Chair_Tube_Rad + rotate Chair_Leg_Angle*y + } + cylinder { + <0,0,Chair_Tube_Curve_Rad>, + , Chair_Tube_Rad + } + + object { Round_Cylinder_Merge ( + <-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height-0.003>, + <-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height+0.025>, Chair_Tube_Rad+0.001, 0.005) + rotate Chair_Leg_Angle*y + texture { Tex_Table_Foot_Bottom } + } + + translate -Chair_Leg_Depth*x + + translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z + +} + +#macro Chair_Back(Rotate) +union { + + intersection { + torus { Chair_Tube_Curve_Rad, Chair_Tube_Rad } + plane { x, 0 } + plane { z, 0 } + + translate <-Chair_Leg_Depth, 0.0,Chair_Tube_Curve_Rad*2> + } + + cylinder { + <-0.08, 0.0,Chair_Tube_Curve_Rad>, + < 0.05, 0.0,Chair_Tube_Curve_Rad>, Chair_Tube_Rad + } + + intersection { + torus { 4, Chair_Tube_Rad } + plane { z, 0.4 } + plane { -z, 0 } + + translate <-4-Chair_Leg_Depth-Chair_Tube_Curve_Rad, 0.0,Chair_Tube_Curve_Rad*2> + } + + translate -Chair_Tube_Curve_Rad*z + + rotate 3*y + rotate Rotate*x + + translate Chair_Tube_Curve_Rad*z + + translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z + + +} +#end + +#local Chair_Base= +union { + + union { + object { Chair_Back(-0.25) translate Chair_Tube_Rad*2*y } + + object { Chair_Leg } + object { Chair_Leg rotate 180*z } + rotate -Chair_Leg_AngleA*x + translate -0.23*y + } + union { + object { Chair_Back( 0.25) translate -Chair_Tube_Rad*2*y } + + object { Chair_Leg } + object { Chair_Leg rotate 180*z } + rotate Chair_Leg_AngleA*x + translate 0.23*y + } + + texture { Tex_Table_Foot } +} + +#local Chair_Plate= +union { + + intersection { + merge { + torus { Chair_Plate_Curve_Rad, Chair_Plate_Thickness translate (Chair_Plate_Width/2)*y } + torus { Chair_Plate_Curve_Rad, Chair_Plate_Thickness translate -(Chair_Plate_Width/2)*y } + + difference { + cylinder { + -(Chair_Plate_Width/2)*y, (Chair_Plate_Width/2)*y, + Chair_Plate_Curve_Rad+Chair_Plate_Thickness + } + cylinder { + -(Chair_Plate_Width/1.8)*y, (Chair_Plate_Width/1.8)*y, + Chair_Plate_Curve_Rad-Chair_Plate_Thickness + } + } + } + + plane { -z, 0 rotate -20*y} + plane { -x, 0 } + } + + + merge { + cylinder { + <0.0, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad> + <0.0, Chair_Plate_Width/2, Chair_Plate_Curve_Rad>, + Chair_Plate_Thickness + } + + sphere { <0.0, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>, Chair_Plate_Thickness } + sphere { <0.0, Chair_Plate_Width/2, Chair_Plate_Curve_Rad>, Chair_Plate_Thickness } + + rotate 70*y + } + + box { + < 0.00, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad-Chair_Plate_Thickness>, + <-Chair_Plate_Depth, Chair_Plate_Width/2, Chair_Plate_Curve_Rad+Chair_Plate_Thickness> + } + cylinder { + < 0.00, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad> + <-Chair_Plate_Depth, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>, + Chair_Plate_Thickness + } + cylinder { + < 0.00, Chair_Plate_Width/2, Chair_Plate_Curve_Rad> + <-Chair_Plate_Depth, Chair_Plate_Width/2, Chair_Plate_Curve_Rad>, + Chair_Plate_Thickness + } + + box { + <-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad, + Chair_Plate_Curve_Rad-Chair_Plate_Thickness>, + <-Chair_Plate_Depth-Chair_Plate_Curve_Rad, Chair_Plate_Width/2-Chair_Plate_Curve_Rad, + Chair_Plate_Curve_Rad+Chair_Plate_Thickness> + } + + cylinder { + <-Chair_Plate_Depth, Chair_Plate_Width/2-Chair_Plate_Curve_Rad, + Chair_Plate_Curve_Rad-Chair_Plate_Thickness> + <-Chair_Plate_Depth, Chair_Plate_Width/2-Chair_Plate_Curve_Rad, + Chair_Plate_Curve_Rad+Chair_Plate_Thickness>, + Chair_Plate_Curve_Rad + } + cylinder { + <-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad, + Chair_Plate_Curve_Rad-Chair_Plate_Thickness> + <-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad, + Chair_Plate_Curve_Rad+Chair_Plate_Thickness>, + Chair_Plate_Curve_Rad + } + torus { + Chair_Plate_Curve_Rad, Chair_Plate_Thickness + rotate 90*x + translate <-Chair_Plate_Depth, + -Chair_Plate_Width/2+Chair_Plate_Curve_Rad, Chair_Plate_Curve_Rad> + } + torus { + Chair_Plate_Curve_Rad, Chair_Plate_Thickness + rotate 90*x + translate <-Chair_Plate_Depth, + Chair_Plate_Width/2-Chair_Plate_Curve_Rad, Chair_Plate_Curve_Rad> + } + + translate (Chair_Plate_Height+0.03)*z + translate 0.18*x +} + +#local Chair_Back_Plate= +union { + intersection { + union { + intersection { + difference { + cylinder { <0.0, -0.30, 0.0>, <0.0, 0.30, 0.0>, 4+2*Chair_Plate_Thickness } + cylinder { <0.0, -0.40, 0.0>, <0.0, 0.40, 0.0>, 4 } + } + plane { y, Chair_Plate_UWidth rotate Chair_Plate_UAngle*x } + plane { -y, Chair_Plate_UWidth rotate -Chair_Plate_UAngle*x } + } + + torus { + 4+Chair_Plate_Thickness, Chair_Plate_Thickness + scale <1, 1, 1/cos(radians(Chair_Plate_UAngle))> + rotate Chair_Plate_UAngle*x + translate Chair_Plate_UWidth*y + } + + torus { + 4+Chair_Plate_Thickness, Chair_Plate_Thickness + scale <1, 1, 1/cos(radians(Chair_Plate_UAngle))> + rotate -Chair_Plate_UAngle*x + translate -Chair_Plate_UWidth*y + } + } + + plane { z, 0 rotate -8*y } + plane { -z, 0 rotate -0.2*y } + } + + intersection { + union { + cylinder { + <4+Chair_Plate_Thickness, 0.3, 0.0>, + <4+Chair_Plate_Thickness, -0.3, 0.0>, + Chair_Plate_Thickness + rotate -0.2*y + } + cylinder { + <4+Chair_Plate_Thickness, 0.3, 0.0>, + <4+Chair_Plate_Thickness, -0.3, 0.0>, + Chair_Plate_Thickness + rotate -8*y + } + } + plane { y, Chair_Plate_UWidth rotate Chair_Plate_UAngle*x } + plane { -y, Chair_Plate_UWidth rotate -Chair_Plate_UAngle*x } + } + sphere { + <4+Chair_Plate_Thickness, Chair_Plate_UWidth, 0.0>, + Chair_Plate_Thickness + rotate -0.2*y + } + sphere { + <4+Chair_Plate_Thickness, -Chair_Plate_UWidth, 0.0>, + Chair_Plate_Thickness + rotate -0.2*y + } + + sphere { + <4+Chair_Plate_Thickness, + Chair_Plate_UWidth-4*sin(radians(Chair_Plate_UAngle))*sin(radians(8)), 0.0>, + Chair_Plate_Thickness + rotate -8*y + } + sphere { + <4+Chair_Plate_Thickness, + -Chair_Plate_UWidth+4*sin(radians(Chair_Plate_UAngle))*sin(radians(8)), 0.0>, + Chair_Plate_Thickness + rotate -8*y + } + + + translate <-4-Chair_Leg_Depth-Chair_Tube_Curve_Rad+Chair_Tube_Rad, + 0.0, Chair_Tube_Curve_Rad*2> + + translate -Chair_Tube_Curve_Rad*z + + rotate 3*y + + translate Chair_Tube_Curve_Rad*z + + translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z + +} + + +union { + object { Chair_Back_Plate texture { Tex_Dark_Wood rotate 90*y } } + object { Chair_Plate texture { Tex_Dark_Wood } } + + object { Chair_Base } + scale 0.92 + rotate -60*z + translate <2.68,3.35,0> +} + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ diff --git a/samples/POV-Ray SDL/cloth.inc b/samples/POV-Ray SDL/cloth.inc new file mode 100755 index 00000000..53e95ae5 --- /dev/null +++ b/samples/POV-Ray SDL/cloth.inc @@ -0,0 +1,12217 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Updated: 09Aug2008 (jh) for v3.7 distribution + +#if (version < 3.7) + #version 3.5; +#end + +#local nx=90; +#local ny=90; +#local ZP=0.66003; + +#macro ZS(Nbr) + #local Cnt=0; + #while (Cnt, +<-0.36168,-0.34964,0.32452>, +<-0.36685,-0.34249,0.33361>, +<-0.37122,-0.33488,0.34282>, +<-0.37518,-0.32706,0.35207>, +<-0.37935,-0.31939,0.36145>, +<-0.38404,-0.31214,0.37091>, +<-0.38958,-0.30556,0.38035>, +<-0.39618,-0.30007,0.38972>, +<-0.40374,-0.29602,0.39905>, +<-0.41187,-0.29331,0.40832>, +<-0.42017,-0.29123,0.41751>, +<-0.42787,-0.28740,0.42664>, +<-0.43451,-0.28169,0.43565>, +<-0.43902,-0.27389,0.44448>, +<-0.44053,-0.26456,0.45305>, +<-0.43874,-0.25480,0.46126>, +<-0.43422,-0.24574,0.46908>, +<-0.42958,-0.23699,0.47696>, +<-0.42909,-0.22709,0.48490>, +<-0.43330,-0.21774,0.49266>, +<-0.44198,-0.21156,0.49979>, +<-0.45268,-0.20913,0.50633>, +<-0.46379,-0.20937,0.51260>, +<-0.47348,-0.20478,0.51937>, +<-0.47923,-0.19545,0.52581>, +<-0.47799,-0.18406,0.53132>, +<-0.47180,-0.17392,0.53610>, +<-0.46550,-0.16443,0.54096>, +<-0.46576,-0.15265,0.54656>, +<-0.47382,-0.14354,0.55147>, +<-0.48558,-0.14027,0.55515>, +<-0.49547,-0.13422,0.55978>, +<-0.49992,-0.12291,0.56422>, +<-0.49618,-0.11116,0.56725>, +<-0.48742,-0.10196,0.56967>, +<-0.48660,-0.08936,0.57326>, +<-0.49360,-0.07884,0.57589>, +<-0.50537,-0.07381,0.57824>, +<-0.51092,-0.06250,0.58087>, +<-0.50818,-0.05001,0.58201>, +<-0.49857,-0.04125,0.58244>, +<-0.49585,-0.02897,0.58362>, +<-0.49991,-0.01714,0.58411>, +<-0.50878,-0.00811,0.58500>, +<-0.50917,0.00496,0.58493>, +<-0.50100,0.01463,0.58383>, +<-0.49548,0.02603,0.58338>, +<-0.49750,0.03889,0.58227>, +<-0.50716,0.04766,0.58171>, +<-0.51053,0.05988,0.58096>, +<-0.50521,0.07163,0.57825>, +<-0.49371,0.07717,0.57564>, +<-0.48643,0.08741,0.57312>, +<-0.48711,0.10021,0.56953>, +<-0.49587,0.10962,0.56689>, +<-0.49897,0.12189,0.56376>, +<-0.49345,0.13317,0.55935>, +<-0.48310,0.13851,0.55496>, +<-0.47196,0.14338,0.55117>, +<-0.46530,0.15343,0.54635>, +<-0.46665,0.16501,0.54102>, +<-0.47450,0.17393,0.53636>, +<-0.48025,0.18446,0.53164>, +<-0.48041,0.19606,0.52600>, +<-0.47361,0.20474,0.51912>, +<-0.46355,0.20815,0.51218>, +<-0.45236,0.20747,0.50617>, +<-0.44162,0.21032,0.49972>, +<-0.43343,0.21707,0.49262>, +<-0.42989,0.22650,0.48483>, +<-0.43100,0.23616,0.47688>, +<-0.43592,0.24474,0.46926>, +<-0.43998,0.25391,0.46163>, +<-0.44131,0.26365,0.45360>, +<-0.43940,0.27286,0.44510>, +<-0.43452,0.28036,0.43621>, +<-0.42766,0.28572,0.42710>, +<-0.41980,0.28916,0.41798>, +<-0.41135,0.29122,0.40887>, +<-0.40325,0.29439,0.39964>, +<-0.39597,0.29900,0.39029>, +<-0.38976,0.30491,0.38085>, +<-0.38464,0.31181,0.37140>, +<-0.38026,0.31928,0.36195>, +<-0.37639,0.32705,0.35261>, +<-0.37252,0.33490,0.34333>, +<-0.36800,0.34258,0.33412>, +<-0.36256,0.34969,0.32503>, +<-0.35644,0.35623,0.31592> +<-0.34951,-0.36255,0.32437>, +<-0.35616,-0.35667,0.33347>, +<-0.36217,-0.35018,0.34242>, +<-0.36724,-0.34300,0.35158>, +<-0.37135,-0.33528,0.36079>, +<-0.37493,-0.32734,0.37012>, +<-0.37875,-0.31957,0.37952>, +<-0.38332,-0.31225,0.38898>, +<-0.38892,-0.30576,0.39837>, +<-0.39566,-0.30046,0.40774>, +<-0.40332,-0.29654,0.41707>, +<-0.41155,-0.29406,0.42634>, +<-0.41984,-0.29171,0.43558>, +<-0.42752,-0.28755,0.44477>, +<-0.43384,-0.28119,0.45377>, +<-0.43771,-0.27270,0.46250>, +<-0.43849,-0.26305,0.47086>, +<-0.43626,-0.25346,0.47882>, +<-0.43118,-0.24476,0.48650>, +<-0.42872,-0.23532,0.49448>, +<-0.43053,-0.22537,0.50249>, +<-0.43699,-0.21724,0.51004>, +<-0.44664,-0.21267,0.51695>, +<-0.45761,-0.21208,0.52323>, +<-0.46787,-0.20924,0.53001>, +<-0.47545,-0.20104,0.53687>, +<-0.47675,-0.18970,0.54295>, +<-0.47289,-0.17914,0.54830>, +<-0.46580,-0.16986,0.55309>, +<-0.46484,-0.15823,0.55854>, +<-0.47140,-0.14822,0.56338>, +<-0.48206,-0.14310,0.56739>, +<-0.49252,-0.13769,0.57189>, +<-0.49772,-0.12671,0.57641>, +<-0.49530,-0.11471,0.57950>, +<-0.48749,-0.10482,0.58198>, +<-0.48644,-0.09237,0.58557>, +<-0.49302,-0.08196,0.58825>, +<-0.50350,-0.07541,0.59079>, +<-0.50862,-0.06395,0.59347>, +<-0.50716,-0.05131,0.59468>, +<-0.49825,-0.04184,0.59509>, +<-0.49560,-0.02952,0.59642>, +<-0.49957,-0.01796,0.59711>, +<-0.50831,-0.00793,0.59824>, +<-0.50783,0.00469,0.59826>, +<-0.50020,0.01487,0.59715>, +<-0.49605,0.02666,0.59635>, +<-0.49758,0.03948,0.59513>, +<-0.50585,0.04934,0.59452>, +<-0.50824,0.06187,0.59357>, +<-0.50304,0.07327,0.59056>, +<-0.49258,0.08023,0.58806>, +<-0.48645,0.09137,0.58532>, +<-0.48756,0.10360,0.58180>, +<-0.49512,0.11356,0.57919>, +<-0.49676,0.12578,0.57588>, +<-0.49075,0.13636,0.57134>, +<-0.47986,0.14129,0.56728>, +<-0.47009,0.14791,0.56301>, +<-0.46512,0.15882,0.55784>, +<-0.46722,0.17017,0.55245>, +<-0.47505,0.17930,0.54805>, +<-0.47838,0.19036,0.54290>, +<-0.47590,0.20144,0.53690>, +<-0.46778,0.20873,0.53011>, +<-0.45733,0.21038,0.52357>, +<-0.44644,0.21122,0.51737>, +<-0.43674,0.21619,0.51046>, +<-0.43089,0.22472,0.50288>, +<-0.42962,0.23461,0.49482>, +<-0.43269,0.24385,0.48689>, +<-0.43745,0.25266,0.47921>, +<-0.43928,0.26218,0.47122>, +<-0.43811,0.27162,0.46283>, +<-0.43389,0.27980,0.45414>, +<-0.42734,0.28590,0.44514>, +<-0.41956,0.28983,0.43601>, +<-0.41119,0.29195,0.42691>, +<-0.40303,0.29486,0.41769>, +<-0.39551,0.29922,0.40836>, +<-0.38903,0.30504,0.39894>, +<-0.38384,0.31193,0.38952>, +<-0.37968,0.31950,0.38011>, +<-0.37614,0.32737,0.37067>, +<-0.37274,0.33533,0.36132>, +<-0.36853,0.34299,0.35201>, +<-0.36322,0.35010,0.34286>, +<-0.35692,0.35650,0.33392>, +<-0.34999,0.36226,0.32517> +<-0.34261,-0.36819,0.33344>, +<-0.34999,-0.36317,0.34233>, +<-0.35691,-0.35745,0.35134>, +<-0.36285,-0.35089,0.36045>, +<-0.36768,-0.34356,0.36965>, +<-0.37132,-0.33566,0.37897>, +<-0.37430,-0.32757,0.38829>, +<-0.37789,-0.31970,0.39772>, +<-0.38240,-0.31235,0.40708>, +<-0.38819,-0.30587,0.41653>, +<-0.39522,-0.30073,0.42593>, +<-0.40306,-0.29706,0.43530>, +<-0.41157,-0.29511,0.44455>, +<-0.41989,-0.29237,0.45378>, +<-0.42745,-0.28751,0.46289>, +<-0.43338,-0.28039,0.47186>, +<-0.43652,-0.27140,0.48047>, +<-0.43645,-0.26166,0.48866>, +<-0.43369,-0.25232,0.49657>, +<-0.42918,-0.24343,0.50452>, +<-0.42894,-0.23361,0.51260>, +<-0.43291,-0.22414,0.52048>, +<-0.44114,-0.21740,0.52754>, +<-0.45119,-0.21408,0.53434>, +<-0.46216,-0.21313,0.54076>, +<-0.47069,-0.20674,0.54753>, +<-0.47482,-0.19633,0.55383>, +<-0.47303,-0.18494,0.55937>, +<-0.46655,-0.17517,0.56424>, +<-0.46449,-0.16404,0.56984>, +<-0.46955,-0.15341,0.57492>, +<-0.47854,-0.14614,0.57937>, +<-0.48915,-0.14087,0.58374>, +<-0.49505,-0.13057,0.58827>, +<-0.49414,-0.11839,0.59170>, +<-0.48767,-0.10792,0.59446>, +<-0.48676,-0.09573,0.59819>, +<-0.49271,-0.08515,0.60082>, +<-0.50072,-0.07676,0.60323>, +<-0.50605,-0.06558,0.60627>, +<-0.50390,-0.05321,0.60722>, +<-0.49833,-0.04262,0.60817>, +<-0.49911,-0.03043,0.60923>, +<-0.49970,-0.01837,0.60969>, +<-0.50570,-0.00748,0.61113>, +<-0.50550,0.00491,0.61133>, +<-0.50004,0.01559,0.61021>, +<-0.49925,0.02806,0.60906>, +<-0.49839,0.04022,0.60791>, +<-0.50348,0.05149,0.60709>, +<-0.50549,0.06367,0.60583>, +<-0.50052,0.07469,0.60313>, +<-0.49294,0.08381,0.60054>, +<-0.48687,0.09441,0.59780>, +<-0.48811,0.10674,0.59440>, +<-0.49384,0.11744,0.59178>, +<-0.49403,0.12957,0.58870>, +<-0.48777,0.13955,0.58376>, +<-0.47735,0.14504,0.57932>, +<-0.46857,0.15297,0.57461>, +<-0.46506,0.16416,0.56962>, +<-0.46802,0.17507,0.56412>, +<-0.47457,0.18458,0.55944>, +<-0.47593,0.19613,0.55392>, +<-0.47114,0.20616,0.54762>, +<-0.46212,0.21205,0.54065>, +<-0.45105,0.21251,0.53462>, +<-0.44100,0.21610,0.52796>, +<-0.43299,0.22317,0.52069>, +<-0.42947,0.23270,0.51285>, +<-0.43016,0.24258,0.50482>, +<-0.43502,0.25152,0.49701>, +<-0.43738,0.26094,0.48898>, +<-0.43697,0.27062,0.48079>, +<-0.43342,0.27929,0.47210>, +<-0.42735,0.28603,0.46332>, +<-0.41968,0.29054,0.45416>, +<-0.41123,0.29303,0.44510>, +<-0.40283,0.29544,0.43586>, +<-0.39512,0.29954,0.42649>, +<-0.38838,0.30511,0.41705>, +<-0.38301,0.31195,0.40760>, +<-0.37888,0.31956,0.39823>, +<-0.37569,0.32757,0.38884>, +<-0.37286,0.33581,0.37947>, +<-0.36906,0.34362,0.37012>, +<-0.36398,0.35086,0.36085>, +<-0.35773,0.35728,0.35181>, +<-0.35060,0.36276,0.34299>, +<-0.34300,0.36758,0.33433> +<-0.33512,-0.37291,0.34274>, +<-0.34307,-0.36875,0.35143>, +<-0.35075,-0.36391,0.36039>, +<-0.35762,-0.35821,0.36947>, +<-0.36345,-0.35150,0.37862>, +<-0.36804,-0.34399,0.38793>, +<-0.37130,-0.33596,0.39728>, +<-0.37398,-0.32773,0.40673>, +<-0.37734,-0.31980,0.41617>, +<-0.38190,-0.31239,0.42559>, +<-0.38785,-0.30598,0.43500>, +<-0.39507,-0.30098,0.44441>, +<-0.40310,-0.29753,0.45376>, +<-0.41171,-0.29555,0.46302>, +<-0.41998,-0.29227,0.47214>, +<-0.42730,-0.28684,0.48116>, +<-0.43265,-0.27918,0.49005>, +<-0.43500,-0.26993,0.49849>, +<-0.43458,-0.26024,0.50672>, +<-0.43133,-0.25103,0.51467>, +<-0.42878,-0.24164,0.52270>, +<-0.43030,-0.23180,0.53073>, +<-0.43620,-0.22318,0.53822>, +<-0.44535,-0.21761,0.54516>, +<-0.45603,-0.21582,0.55156>, +<-0.46540,-0.21132,0.55836>, +<-0.47150,-0.20236,0.56486>, +<-0.47213,-0.19092,0.57077>, +<-0.46801,-0.18031,0.57589>, +<-0.46492,-0.16960,0.58145>, +<-0.46839,-0.15875,0.58699>, +<-0.47571,-0.14994,0.59158>, +<-0.48568,-0.14380,0.59596>, +<-0.49176,-0.13401,0.60062>, +<-0.49228,-0.12212,0.60420>, +<-0.48767,-0.11098,0.60713>, +<-0.49001,-0.09966,0.61069>, +<-0.49217,-0.08821,0.61352>, +<-0.49897,-0.07872,0.61652>, +<-0.50307,-0.06720,0.61914>, +<-0.50192,-0.05495,0.62052>, +<-0.49817,-0.04339,0.62116>, +<-0.49904,-0.03132,0.62245>, +<-0.49963,-0.01942,0.62313>, +<-0.50295,-0.00757,0.62359>, +<-0.50341,0.00465,0.62328>, +<-0.49998,0.01627,0.62218>, +<-0.49918,0.02890,0.62208>, +<-0.49852,0.04114,0.62081>, +<-0.50117,0.05310,0.62000>, +<-0.50216,0.06529,0.61862>, +<-0.49776,0.07642,0.61594>, +<-0.49242,0.08679,0.61323>, +<-0.49029,0.09827,0.61038>, +<-0.48829,0.10945,0.60656>, +<-0.49185,0.12070,0.60345>, +<-0.49116,0.13260,0.59979>, +<-0.48414,0.14236,0.59485>, +<-0.47498,0.14909,0.59100>, +<-0.46766,0.15835,0.58656>, +<-0.46545,0.16965,0.58137>, +<-0.46976,0.18012,0.57638>, +<-0.47337,0.19069,0.57140>, +<-0.47231,0.20186,0.56568>, +<-0.46553,0.21044,0.55901>, +<-0.45570,0.21443,0.55214>, +<-0.44516,0.21641,0.54563>, +<-0.43625,0.22227,0.53857>, +<-0.43073,0.23098,0.53104>, +<-0.42948,0.24076,0.52301>, +<-0.43256,0.25006,0.51513>, +<-0.43559,0.25945,0.50714>, +<-0.43575,0.26924,0.49895>, +<-0.43286,0.27839,0.49030>, +<-0.42711,0.28562,0.48149>, +<-0.41973,0.29068,0.47253>, +<-0.41139,0.29357,0.46336>, +<-0.40290,0.29585,0.45423>, +<-0.39505,0.29979,0.44488>, +<-0.38809,0.30522,0.43545>, +<-0.38253,0.31205,0.42601>, +<-0.37837,0.31971,0.41660>, +<-0.37535,0.32789,0.40722>, +<-0.37290,0.33619,0.39777>, +<-0.36944,0.34422,0.38838>, +<-0.36465,0.35157,0.37903>, +<-0.35855,0.35807,0.36988>, +<-0.35139,0.36355,0.36096>, +<-0.34358,0.36805,0.35220>, +<-0.33543,0.37201,0.34358> +<-0.32728,-0.37687,0.35198>, +<-0.33557,-0.37325,0.36075>, +<-0.34379,-0.36928,0.36963>, +<-0.35146,-0.36458,0.37861>, +<-0.35834,-0.35881,0.38772>, +<-0.36399,-0.35196,0.39702>, +<-0.36826,-0.34433,0.40643>, +<-0.37122,-0.33622,0.41588>, +<-0.37365,-0.32794,0.42539>, +<-0.37698,-0.31993,0.43481>, +<-0.38158,-0.31250,0.44426>, +<-0.38773,-0.30613,0.45374>, +<-0.39511,-0.30125,0.46311>, +<-0.40327,-0.29794,0.47244>, +<-0.41187,-0.29572,0.48161>, +<-0.41992,-0.29192,0.49074>, +<-0.42680,-0.28586,0.49978>, +<-0.43155,-0.27783,0.50855>, +<-0.43340,-0.26841,0.51692>, +<-0.43289,-0.25874,0.52505>, +<-0.42990,-0.24938,0.53310>, +<-0.42938,-0.23972,0.54111>, +<-0.43278,-0.23030,0.54887>, +<-0.44008,-0.22275,0.55610>, +<-0.44943,-0.21815,0.56289>, +<-0.45959,-0.21486,0.56970>, +<-0.46713,-0.20748,0.57648>, +<-0.46975,-0.19661,0.58254>, +<-0.46868,-0.18556,0.58789>, +<-0.46551,-0.17475,0.59334>, +<-0.46777,-0.16401,0.59895>, +<-0.47524,-0.15545,0.60359>, +<-0.48160,-0.14664,0.60830>, +<-0.48819,-0.13744,0.61308>, +<-0.48955,-0.12583,0.61673>, +<-0.48769,-0.11412,0.61988>, +<-0.48937,-0.10262,0.62355>, +<-0.49165,-0.09106,0.62656>, +<-0.49498,-0.07998,0.62922>, +<-0.49804,-0.06868,0.63165>, +<-0.49678,-0.05687,0.63279>, +<-0.49805,-0.04438,0.63452>, +<-0.49900,-0.03229,0.63572>, +<-0.49964,-0.02002,0.63617>, +<-0.49997,-0.00761,0.63642>, +<-0.49999,0.00504,0.63623>, +<-0.49972,0.01746,0.63585>, +<-0.49914,0.02987,0.63526>, +<-0.49824,0.04216,0.63430>, +<-0.49704,0.05433,0.63288>, +<-0.49726,0.06649,0.63117>, +<-0.49456,0.07809,0.62870>, +<-0.49191,0.08962,0.62627>, +<-0.48966,0.10123,0.62323>, +<-0.48858,0.11276,0.61936>, +<-0.48925,0.12393,0.61591>, +<-0.48731,0.13563,0.61191>, +<-0.48060,0.14553,0.60724>, +<-0.47539,0.15501,0.60327>, +<-0.46748,0.16362,0.59874>, +<-0.46614,0.17470,0.59324>, +<-0.47010,0.18544,0.58830>, +<-0.47086,0.19670,0.58293>, +<-0.46740,0.20722,0.57712>, +<-0.45966,0.21413,0.57031>, +<-0.44939,0.21670,0.56346>, +<-0.44027,0.22170,0.55655>, +<-0.43311,0.22931,0.54922>, +<-0.42991,0.23887,0.54161>, +<-0.43089,0.24857,0.53346>, +<-0.43387,0.25782,0.52553>, +<-0.43428,0.26750,0.51732>, +<-0.43213,0.27696,0.50886>, +<-0.42693,0.28486,0.49990>, +<-0.41979,0.29049,0.49097>, +<-0.41160,0.29388,0.48185>, +<-0.40306,0.29631,0.47269>, +<-0.39506,0.30012,0.46347>, +<-0.38797,0.30542,0.45408>, +<-0.38225,0.31216,0.44460>, +<-0.37804,0.31989,0.43508>, +<-0.37511,0.32800,0.42570>, +<-0.37283,0.33642,0.41628>, +<-0.36970,0.34451,0.40683>, +<-0.36517,0.35211,0.39748>, +<-0.35926,0.35878,0.38820>, +<-0.35211,0.36426,0.37915>, +<-0.34420,0.36869,0.37026>, +<-0.33595,0.37227,0.36152>, +<-0.32759,0.37569,0.35283> +<-0.31944,-0.38059,0.36139>, +<-0.32767,-0.37680,0.37009>, +<-0.33616,-0.37349,0.37897>, +<-0.34436,-0.36975,0.38787>, +<-0.35210,-0.36508,0.39696>, +<-0.35885,-0.35926,0.40623>, +<-0.36430,-0.35228,0.41566>, +<-0.36834,-0.34457,0.42510>, +<-0.37111,-0.33637,0.43466>, +<-0.37346,-0.32803,0.44413>, +<-0.37678,-0.31999,0.45357>, +<-0.38155,-0.31251,0.46313>, +<-0.38782,-0.30630,0.47258>, +<-0.39530,-0.30156,0.48195>, +<-0.40354,-0.29820,0.49120>, +<-0.41202,-0.29552,0.50032>, +<-0.41982,-0.29104,0.50947>, +<-0.42620,-0.28453,0.51850>, +<-0.43033,-0.27615,0.52718>, +<-0.43199,-0.26671,0.53553>, +<-0.43151,-0.25709,0.54357>, +<-0.42961,-0.24747,0.55160>, +<-0.43097,-0.23786,0.55946>, +<-0.43621,-0.22911,0.56707>, +<-0.44403,-0.22246,0.57391>, +<-0.45340,-0.21803,0.58053>, +<-0.46165,-0.21181,0.58753>, +<-0.46631,-0.20182,0.59395>, +<-0.46698,-0.19066,0.59966>, +<-0.46632,-0.18044,0.60555>, +<-0.47011,-0.17039,0.61095>, +<-0.47368,-0.16015,0.61598>, +<-0.47807,-0.15001,0.62072>, +<-0.48348,-0.14020,0.62552>, +<-0.48513,-0.12888,0.62946>, +<-0.48604,-0.11736,0.63289>, +<-0.48868,-0.10585,0.63620>, +<-0.49108,-0.09405,0.63907>, +<-0.49338,-0.08213,0.64161>, +<-0.49508,-0.07000,0.64416>, +<-0.49570,-0.05812,0.64582>, +<-0.49799,-0.04567,0.64752>, +<-0.49547,-0.03807,0.65000>, +<-0.49974,-0.02057,0.64931>, +<-0.50010,-0.00779,0.64950>, +<-0.50011,0.00525,0.64938>, +<-0.49980,0.01800,0.64897>, +<-0.49916,0.03069,0.64825>, +<-0.49818,0.04328,0.64717>, +<-0.49690,0.05578,0.64570>, +<-0.49533,0.06821,0.64377>, +<-0.49370,0.08053,0.64134>, +<-0.49135,0.09261,0.63880>, +<-0.48898,0.10449,0.63593>, +<-0.48648,0.11559,0.63249>, +<-0.48455,0.12688,0.62886>, +<-0.48232,0.13815,0.62461>, +<-0.47751,0.14887,0.62014>, +<-0.47388,0.15956,0.61564>, +<-0.47032,0.16979,0.61092>, +<-0.46643,0.18016,0.60584>, +<-0.46840,0.19125,0.60053>, +<-0.46700,0.20186,0.59495>, +<-0.46205,0.21119,0.58844>, +<-0.45356,0.21692,0.58132>, +<-0.44430,0.22127,0.57473>, +<-0.43658,0.22817,0.56740>, +<-0.43142,0.23695,0.55987>, +<-0.43042,0.24661,0.55198>, +<-0.43246,0.25614,0.54397>, +<-0.43281,0.26578,0.53587>, +<-0.43107,0.27522,0.52755>, +<-0.42657,0.28359,0.51879>, +<-0.41978,0.28989,0.50966>, +<-0.41179,0.29396,0.50053>, +<-0.40334,0.29666,0.49133>, +<-0.39532,0.30039,0.48214>, +<-0.38809,0.30562,0.47281>, +<-0.38222,0.31223,0.46336>, +<-0.37791,0.31991,0.45387>, +<-0.37488,0.32820,0.44433>, +<-0.37269,0.33658,0.43495>, +<-0.36972,0.34478,0.42547>, +<-0.36546,0.35238,0.41606>, +<-0.35976,0.35917,0.40673>, +<-0.35271,0.36477,0.39751>, +<-0.34481,0.36913,0.38854>, +<-0.33639,0.37255,0.37965>, +<-0.32791,0.37562,0.37089>, +<-0.31970,0.37926,0.36216> +<-0.31193,-0.38467,0.37085>, +<-0.31982,-0.38014,0.37948>, +<-0.32812,-0.37651,0.38827>, +<-0.33663,-0.37360,0.39721>, +<-0.34486,-0.37003,0.40634>, +<-0.35247,-0.36542,0.41559>, +<-0.35912,-0.35951,0.42498>, +<-0.36438,-0.35251,0.43438>, +<-0.36829,-0.34471,0.44397>, +<-0.37095,-0.33649,0.45357>, +<-0.37332,-0.32814,0.46303>, +<-0.37682,-0.32001,0.47263>, +<-0.38171,-0.31273,0.48217>, +<-0.38813,-0.30666,0.49162>, +<-0.39574,-0.30189,0.50104>, +<-0.40389,-0.29836,0.51022>, +<-0.41208,-0.29505,0.51935>, +<-0.41941,-0.28995,0.52848>, +<-0.42528,-0.28292,0.53748>, +<-0.42901,-0.27436,0.54607>, +<-0.43064,-0.26491,0.55430>, +<-0.43057,-0.25519,0.56235>, +<-0.43060,-0.24564,0.57031>, +<-0.43382,-0.23644,0.57824>, +<-0.44009,-0.22847,0.58541>, +<-0.44768,-0.22193,0.59193>, +<-0.45573,-0.21548,0.59873>, +<-0.46129,-0.20670,0.60562>, +<-0.46406,-0.19639,0.61173>, +<-0.46535,-0.18531,0.61752>, +<-0.46832,-0.17520,0.62348>, +<-0.47205,-0.16491,0.62860>, +<-0.47561,-0.15429,0.63332>, +<-0.47918,-0.14345,0.63764>, +<-0.48222,-0.13217,0.64168>, +<-0.48528,-0.12059,0.64552>, +<-0.48816,-0.10875,0.64905>, +<-0.49046,-0.09663,0.65269>, +<-0.49114,-0.08409,0.65612>, +<-0.49066,-0.07126,0.65851>, +<-0.48965,-0.05870,0.65975>, +<-0.48898,-0.04581,0.66014>, +<-0.48896,-0.03290,0.66019>, +<-0.48919,-0.02023,0.66019>, +<-0.48936,-0.00753,0.66019>, +<-0.48948,0.00537,0.66018>, +<-0.48959,0.01813,0.66019>, +<-0.48984,0.03092,0.66018>, +<-0.49029,0.04375,ZP>, +<-0.49093,0.05665,0.65939>, +<-0.49161,0.06961,0.65799>, +<-0.49181,0.08251,0.65554>, +<-0.49085,0.09518,0.65221>, +<-0.48845,0.10742,0.64873>, +<-0.48561,0.11928,0.64526>, +<-0.48261,0.13076,0.64137>, +<-0.47937,0.14226,0.63656>, +<-0.47591,0.15338,0.63304>, +<-0.47234,0.16407,0.62844>, +<-0.46860,0.17444,0.62347>, +<-0.46625,0.18520,0.61812>, +<-0.46513,0.19620,0.61269>, +<-0.46213,0.20645,0.60688>, +<-0.45612,0.21477,0.60006>, +<-0.44800,0.22092,0.59290>, +<-0.44044,0.22758,0.58602>, +<-0.43433,0.23564,0.57858>, +<-0.43135,0.24466,0.57063>, +<-0.43151,0.25414,0.56266>, +<-0.43148,0.26380,0.55456>, +<-0.42976,0.27336,0.54629>, +<-0.42593,0.28193,0.53763>, +<-0.41975,0.28875,0.52860>, +<-0.41213,0.29354,0.51940>, +<-0.40375,0.29686,0.51027>, +<-0.39566,0.30074,0.50109>, +<-0.38834,0.30592,0.49181>, +<-0.38233,0.31244,0.48234>, +<-0.37790,0.31996,0.47280>, +<-0.37484,0.32806,0.46327>, +<-0.37255,0.33652,0.45377>, +<-0.36969,0.34475,0.44440>, +<-0.36551,0.35253,0.43488>, +<-0.35995,0.35939,0.42547>, +<-0.35308,0.36502,0.41615>, +<-0.34520,0.36939,0.40698>, +<-0.33685,0.37264,0.39800>, +<-0.32815,0.37522,0.38906>, +<-0.31986,0.37882,0.38029>, +<-0.31202,0.38330,0.37156> +<-0.30487,-0.38940,0.38033>, +<-0.31217,-0.38402,0.38890>, +<-0.32003,-0.37941,0.39770>, +<-0.32843,-0.37627,0.40667>, +<-0.33695,-0.37364,0.41583>, +<-0.34507,-0.37022,0.42505>, +<-0.35264,-0.36560,0.43445>, +<-0.35913,-0.35971,0.44387>, +<-0.36434,-0.35260,0.45347>, +<-0.36814,-0.34477,0.46310>, +<-0.37081,-0.33652,0.47256>, +<-0.37340,-0.32810,0.48220>, +<-0.37704,-0.32021,0.49187>, +<-0.38215,-0.31306,0.50140>, +<-0.38874,-0.30702,0.51085>, +<-0.39630,-0.30219,0.52021>, +<-0.40420,-0.29836,0.52941>, +<-0.41196,-0.29428,0.53860>, +<-0.41885,-0.28849,0.54776>, +<-0.42415,-0.28111,0.55658>, +<-0.42757,-0.27235,0.56503>, +<-0.42952,-0.26278,0.57330>, +<-0.43053,-0.25325,0.58133>, +<-0.43263,-0.24384,0.58930>, +<-0.43724,-0.23519,0.59686>, +<-0.44490,-0.22823,0.60407>, +<-0.45040,-0.21970,0.61035>, +<-0.45563,-0.21098,0.61733>, +<-0.45915,-0.20089,0.62353>, +<-0.46247,-0.19014,0.62959>, +<-0.46640,-0.18024,0.63556>, +<-0.47035,-0.16971,0.64072>, +<-0.47423,-0.15868,0.64568>, +<-0.47802,-0.14731,0.65053>, +<-0.47989,-0.13516,0.65581>, +<-0.47905,-0.12225,0.65935>, +<-0.47762,-0.10922,0.66021>, +<-0.47707,-0.09643,0.66009>, +<-0.47658,-0.08380,ZP>, +<-0.47617,-0.07110,ZP>, +<-0.47550,-0.05853,0.66008>, +<-0.47542,-0.04559,ZP>, +<-0.47567,-0.03261,ZP>, +<-0.47599,-0.01988,ZP>, +<-0.47619,-0.00722,ZP>, +<-0.47630,0.00553,ZP>, +<-0.47637,0.01826,ZP>, +<-0.47645,0.03102,ZP>, +<-0.47658,0.04382,ZP>, +<-0.47681,0.05665,ZP>, +<-0.47711,0.06947,ZP>, +<-0.47743,0.08226,ZP>, +<-0.47778,0.09507,0.66011>, +<-0.47822,0.10798,0.66024>, +<-0.47954,0.12114,0.65932>, +<-0.48039,0.13420,0.65562>, +<-0.47423,0.14634,0.65034>, +<-0.47463,0.15756,0.64558>, +<-0.47072,0.16870,0.64073>, +<-0.46679,0.17931,0.63557>, +<-0.46280,0.18946,0.62975>, +<-0.46054,0.20014,0.62408>, +<-0.45696,0.21031,0.61802>, +<-0.45072,0.21858,0.61144>, +<-0.44534,0.22738,0.60439>, +<-0.43768,0.23448,0.59757>, +<-0.43321,0.24304,0.58974>, +<-0.43140,0.25231,0.58156>, +<-0.43038,0.26166,0.57338>, +<-0.42840,0.27113,0.56527>, +<-0.42480,0.28005,0.55669>, +<-0.41925,0.28738,0.54781>, +<-0.41216,0.29288,0.53870>, +<-0.40419,0.29690,0.52945>, +<-0.39631,0.30100,0.52022>, +<-0.38896,0.30617,0.51092>, +<-0.38273,0.31258,0.50158>, +<-0.37804,0.32002,0.49211>, +<-0.37478,0.32807,0.48253>, +<-0.37239,0.33643,0.47293>, +<-0.36953,0.34470,0.46340>, +<-0.36548,0.35246,0.45397>, +<-0.35999,0.35943,0.44444>, +<-0.35322,0.36511,0.43499>, +<-0.34551,0.36944,0.42567>, +<-0.33715,0.37260,0.41647>, +<-0.32855,0.37496,0.40745>, +<-0.31999,0.37798,0.39846>, +<-0.31208,0.38259,0.38969>, +<-0.30480,0.38814,0.38100> +<-0.29858,-0.39519,0.38977>, +<-0.30503,-0.38876,0.39832>, +<-0.31225,-0.38314,0.40710>, +<-0.32023,-0.37891,0.41612>, +<-0.32864,-0.37605,0.42530>, +<-0.33709,-0.37361,0.43449>, +<-0.34525,-0.37021,0.44390>, +<-0.35270,-0.36561,0.45342>, +<-0.35912,-0.35962,0.46303>, +<-0.36420,-0.35249,0.47273>, +<-0.36796,-0.34463,0.48229>, +<-0.37078,-0.33634,0.49195>, +<-0.37362,-0.32814,0.50164>, +<-0.37756,-0.32039,0.51121>, +<-0.38290,-0.31341,0.52071>, +<-0.38958,-0.30742,0.53024>, +<-0.39691,-0.30250,0.53958>, +<-0.40446,-0.29816,0.54882>, +<-0.41173,-0.29317,0.55807>, +<-0.41797,-0.28675,0.56712>, +<-0.42286,-0.27885,0.57587>, +<-0.42631,-0.26981,0.58428>, +<-0.42873,-0.26052,0.59236>, +<-0.43215,-0.25152,0.60053>, +<-0.43697,-0.24308,0.60818>, +<-0.44177,-0.23424,0.61565>, +<-0.44657,-0.22492,0.62255>, +<-0.45173,-0.21437,0.62884>, +<-0.45603,-0.20511,0.63477>, +<-0.46011,-0.19582,0.64202>, +<-0.46462,-0.18520,0.64785>, +<-0.46822,-0.17383,0.65431>, +<-0.46738,-0.16076,0.65947>, +<-0.46582,-0.14751,0.66019>, +<-0.46519,-0.13460,0.66007>, +<-0.46474,-0.12182,ZP>, +<-0.46441,-0.10907,ZP>, +<-0.46417,-0.09639,ZP>, +<-0.46393,-0.08381,ZP>, +<-0.46366,-0.07118,ZP>, +<-0.46337,-0.05837,ZP>, +<-0.46318,-0.04549,ZP>, +<-0.46310,-0.03262,ZP>, +<-0.46313,-0.01977,ZP>, +<-0.46323,-0.00700,ZP>, +<-0.46336,0.00574,ZP>, +<-0.46351,0.01851,ZP>, +<-0.46370,0.03132,ZP>, +<-0.46396,0.04414,ZP>, +<-0.46426,0.05695,ZP>, +<-0.46454,0.06970,ZP>, +<-0.46473,0.08238,ZP>, +<-0.46484,0.09507,ZP>, +<-0.46497,0.10785,ZP>, +<-0.46512,0.12061,ZP>, +<-0.46543,0.13347,0.66012>, +<-0.46597,0.14643,0.66028>, +<-0.46768,0.15969,0.65958>, +<-0.46861,0.17279,0.65439>, +<-0.46496,0.18439,0.64801>, +<-0.46055,0.19486,0.64220>, +<-0.45612,0.20487,0.63608>, +<-0.45167,0.21451,0.62958>, +<-0.44692,0.22426,0.62343>, +<-0.44229,0.23330,0.61633>, +<-0.43758,0.24205,0.60874>, +<-0.43264,0.25067,0.60072>, +<-0.42949,0.25948,0.59262>, +<-0.42697,0.26882,0.58433>, +<-0.42357,0.27772,0.57604>, +<-0.41857,0.28550,0.56721>, +<-0.41209,0.29182,0.55812>, +<-0.40465,0.29669,0.54895>, +<-0.39703,0.30128,0.53960>, +<-0.38981,0.30649,0.53030>, +<-0.38342,0.31281,0.52093>, +<-0.37842,0.32008,0.51153>, +<-0.37483,0.32803,0.50200>, +<-0.37220,0.33628,0.49237>, +<-0.36932,0.34446,0.48276>, +<-0.36533,0.35226,0.47313>, +<-0.36001,0.35922,0.46359>, +<-0.35328,0.36502,0.45402>, +<-0.34561,0.36941,0.44451>, +<-0.33740,0.37249,0.43516>, +<-0.32880,0.37472,0.42587>, +<-0.32031,0.37749,0.41681>, +<-0.31219,0.38167,0.40785>, +<-0.30492,0.38740,0.39916>, +<-0.29852,0.39412,0.39046> +<-0.29348,-0.40212,0.39912>, +<-0.29880,-0.39471,0.40772>, +<-0.30508,-0.38798,0.41650>, +<-0.31236,-0.38257,0.42551>, +<-0.32035,-0.37859,0.43469>, +<-0.32872,-0.37591,0.44394>, +<-0.33714,-0.37351,0.45342>, +<-0.34515,-0.37019,0.46301>, +<-0.35250,-0.36552,0.47262>, +<-0.35884,-0.35944,0.48237>, +<-0.36388,-0.35225,0.49209>, +<-0.36771,-0.34439,0.50180>, +<-0.37076,-0.33623,0.51155>, +<-0.37399,-0.32820,0.52122>, +<-0.37825,-0.32072,0.53085>, +<-0.38385,-0.31390,0.54050>, +<-0.39046,-0.30797,0.55000>, +<-0.39756,-0.30271,0.55926>, +<-0.40471,-0.29754,0.56847>, +<-0.41140,-0.29156,0.57769>, +<-0.41705,-0.28438,0.58662>, +<-0.42157,-0.27610,0.59526>, +<-0.42522,-0.26720,0.60358>, +<-0.42882,-0.25803,0.61172>, +<-0.43352,-0.24917,0.61990>, +<-0.43851,-0.24030,0.62746>, +<-0.44349,-0.23098,0.63425>, +<-0.44845,-0.22126,0.64144>, +<-0.45198,-0.20979,0.64438>, +<-0.45676,-0.20021,0.65595>, +<-0.45455,-0.18638,0.66033>, +<-0.45365,-0.17321,0.66013>, +<-0.45310,-0.16020,ZP>, +<-0.45271,-0.14743,ZP>, +<-0.45234,-0.13472,ZP>, +<-0.45197,-0.12207,ZP>, +<-0.45152,-0.10936,ZP>, +<-0.45105,-0.09656,ZP>, +<-0.45067,-0.08378,ZP>, +<-0.45041,-0.07099,ZP>, +<-0.45025,-0.05817,ZP>, +<-0.45017,-0.04532,ZP>, +<-0.45015,-0.03247,ZP>, +<-0.45017,-0.01965,ZP>, +<-0.45025,-0.00687,ZP>, +<-0.45035,0.00589,ZP>, +<-0.45048,0.01865,ZP>, +<-0.45063,0.03143,ZP>, +<-0.45080,0.04421,ZP>, +<-0.45099,0.05699,ZP>, +<-0.45118,0.06975,ZP>, +<-0.45140,0.08253,ZP>, +<-0.45169,0.09534,ZP>, +<-0.45205,0.10818,ZP>, +<-0.45227,0.12085,ZP>, +<-0.45251,0.13361,ZP>, +<-0.45281,0.14647,0.66008>, +<-0.45325,0.15936,0.66009>, +<-0.45388,0.17235,0.66015>, +<-0.45472,0.18560,0.66030>, +<-0.45687,0.19945,0.65618>, +<-0.44697,0.21331,0.65000>, +<-0.44894,0.22039,0.64059>, +<-0.44397,0.23014,0.63521>, +<-0.43914,0.23923,0.62801>, +<-0.43414,0.24815,0.62027>, +<-0.42946,0.25718,0.61210>, +<-0.42591,0.26612,0.60381>, +<-0.42220,0.27498,0.59532>, +<-0.41763,0.28314,0.58668>, +<-0.41175,0.29036,0.57764>, +<-0.40495,0.29627,0.56854>, +<-0.39779,0.30152,0.55944>, +<-0.39074,0.30701,0.55003>, +<-0.38440,0.31313,0.54062>, +<-0.37910,0.32018,0.53110>, +<-0.37508,0.32788,0.52154>, +<-0.37200,0.33607,0.51191>, +<-0.36892,0.34426,0.50230>, +<-0.36496,0.35203,0.49265>, +<-0.35972,0.35905,0.48286>, +<-0.35323,0.36482,0.47325>, +<-0.34564,0.36928,0.46361>, +<-0.33748,0.37239,0.45408>, +<-0.32904,0.37453,0.44469>, +<-0.32057,0.37717,0.43533>, +<-0.31248,0.38118,0.42622>, +<-0.30508,0.38664,0.41727>, +<-0.29886,0.39352,0.40858>, +<-0.29364,0.40125,0.39986> +<-0.28986,-0.41003,0.40835>, +<-0.29396,-0.40187,0.41702>, +<-0.29898,-0.39423,0.42587>, +<-0.30514,-0.38756,0.43487>, +<-0.31238,-0.38228,0.44408>, +<-0.32033,-0.37845,0.45340>, +<-0.32865,-0.37583,0.46295>, +<-0.33695,-0.37345,0.47257>, +<-0.34489,-0.37000,0.48220>, +<-0.35223,-0.36513,0.49204>, +<-0.35847,-0.35894,0.50188>, +<-0.36342,-0.35179,0.51165>, +<-0.36738,-0.34401,0.52148>, +<-0.37081,-0.33601,0.53128>, +<-0.37454,-0.32827,0.54102>, +<-0.37926,-0.32097,0.55074>, +<-0.38506,-0.31440,0.56040>, +<-0.39151,-0.30841,0.56984>, +<-0.39819,-0.30267,0.57912>, +<-0.40478,-0.29657,0.58843>, +<-0.41085,-0.28965,0.59748>, +<-0.41619,-0.28189,0.60622>, +<-0.42090,-0.27324,0.61489>, +<-0.42461,-0.26402,0.62313>, +<-0.42994,-0.25533,0.63119>, +<-0.43524,-0.24627,0.63882>, +<-0.43089,-0.24321,0.65079>, +<-0.44502,-0.22663,0.65483>, +<-0.44230,-0.21242,0.66048>, +<-0.44145,-0.19901,0.66019>, +<-0.44092,-0.18589,0.66008>, +<-0.44062,-0.17323,ZP>, +<-0.44018,-0.16044,ZP>, +<-0.43970,-0.14771,ZP>, +<-0.43914,-0.13483,ZP>, +<-0.43869,-0.12199,ZP>, +<-0.43834,-0.10920,ZP>, +<-0.43804,-0.09643,ZP>, +<-0.43780,-0.08364,ZP>, +<-0.43761,-0.07084,ZP>, +<-0.43748,-0.05803,ZP>, +<-0.43739,-0.04521,ZP>, +<-0.43734,-0.03239,ZP>, +<-0.43733,-0.01957,ZP>, +<-0.43737,-0.00677,ZP>, +<-0.43745,0.00601,ZP>, +<-0.43757,0.01878,ZP>, +<-0.43771,0.03156,ZP>, +<-0.43788,0.04432,ZP>, +<-0.43804,0.05708,ZP>, +<-0.43822,0.06983,ZP>, +<-0.43840,0.08259,ZP>, +<-0.43859,0.09535,ZP>, +<-0.43880,0.10812,ZP>, +<-0.43904,0.12096,ZP>, +<-0.43942,0.13388,ZP>, +<-0.43993,0.14685,ZP>, +<-0.44038,0.15967,ZP>, +<-0.44080,0.17249,ZP>, +<-0.44110,0.18520,ZP>, +<-0.44161,0.19823,0.66014>, +<-0.44223,0.21058,0.66026>, +<-0.44499,0.22556,0.65552>, +<-0.44101,0.22268,0.65000>, +<-0.43576,0.24548,0.63883>, +<-0.43050,0.25447,0.63139>, +<-0.42523,0.26302,0.62332>, +<-0.42162,0.27226,0.61514>, +<-0.41667,0.28099,0.60636>, +<-0.41136,0.28845,0.59752>, +<-0.40532,0.29529,0.58833>, +<-0.39871,0.30147,0.57915>, +<-0.39200,0.30738,0.57000>, +<-0.38552,0.31369,0.56052>, +<-0.37992,0.32046,0.55099>, +<-0.37543,0.32793,0.54136>, +<-0.37188,0.33576,0.53167>, +<-0.36850,0.34381,0.52190>, +<-0.36446,0.35160,0.51219>, +<-0.35932,0.35863,0.50244>, +<-0.35289,0.36459,0.49255>, +<-0.34551,0.36909,0.48291>, +<-0.33740,0.37229,0.47322>, +<-0.32902,0.37448,0.46365>, +<-0.32073,0.37704,0.45420>, +<-0.31267,0.38091,0.44479>, +<-0.30537,0.38627,0.43564>, +<-0.29922,0.39307,0.42662>, +<-0.29430,0.40085,0.41792>, +<-0.29047,0.40932,0.40913> +<-0.28770,-0.41850,0.41745>, +<-0.29057,-0.40992,0.42630>, +<-0.29437,-0.40167,0.43520>, +<-0.29918,-0.39407,0.44424>, +<-0.30521,-0.38748,0.45347>, +<-0.31239,-0.38226,0.46285>, +<-0.32033,-0.37847,0.47239>, +<-0.32858,-0.37580,0.48204>, +<-0.33679,-0.37324,0.49178>, +<-0.34465,-0.36955,0.50167>, +<-0.35175,-0.36455,0.51162>, +<-0.35775,-0.35837,0.52155>, +<-0.36275,-0.35119,0.53154>, +<-0.36695,-0.34353,0.54144>, +<-0.37087,-0.33578,0.55126>, +<-0.37520,-0.32834,0.56105>, +<-0.38040,-0.32136,0.57084>, +<-0.38629,-0.31484,0.58046>, +<-0.39254,-0.30853,0.58985>, +<-0.39885,-0.30202,0.59915>, +<-0.40511,-0.29501,0.60828>, +<-0.41043,-0.28716,0.61736>, +<-0.41518,-0.27862,0.62601>, +<-0.42067,-0.27033,0.63429>, +<-0.42629,-0.26156,0.64230>, +<-0.43215,-0.25239,0.65049>, +<-0.43161,-0.23929,ZP>, +<-0.42973,-0.22550,0.66023>, +<-0.42882,-0.21215,0.66009>, +<-0.42835,-0.19912,ZP>, +<-0.42784,-0.18610,ZP>, +<-0.42747,-0.17337,ZP>, +<-0.42688,-0.16039,ZP>, +<-0.42645,-0.14757,ZP>, +<-0.42605,-0.13474,ZP>, +<-0.42569,-0.12195,ZP>, +<-0.42537,-0.10915,ZP>, +<-0.42509,-0.09635,ZP>, +<-0.42485,-0.08354,ZP>, +<-0.42468,-0.07072,ZP>, +<-0.42456,-0.05790,ZP>, +<-0.42449,-0.04508,ZP>, +<-0.42445,-0.03228,ZP>, +<-0.42444,-0.01948,ZP>, +<-0.42447,-0.00669,ZP>, +<-0.42453,0.00609,ZP>, +<-0.42462,0.01886,ZP>, +<-0.42474,0.03162,ZP>, +<-0.42486,0.04437,ZP>, +<-0.42501,0.05713,ZP>, +<-0.42516,0.06989,ZP>, +<-0.42535,0.08266,ZP>, +<-0.42555,0.09544,ZP>, +<-0.42577,0.10823,ZP>, +<-0.42603,0.12106,ZP>, +<-0.42634,0.13391,ZP>, +<-0.42669,0.14680,ZP>, +<-0.42708,0.15969,ZP>, +<-0.42762,0.17270,ZP>, +<-0.42796,0.18538,ZP>, +<-0.42840,0.19831,ZP>, +<-0.43050,0.21190,0.66100>, +<-0.42933,0.22461,0.66010>, +<-0.43171,0.23802,0.66012>, +<-0.43294,0.25103,0.65107>, +<-0.42707,0.26033,0.64280>, +<-0.42121,0.26949,0.63462>, +<-0.41572,0.27782,0.62628>, +<-0.41086,0.28626,0.61749>, +<-0.40551,0.29414,0.60842>, +<-0.39943,0.30094,0.59926>, +<-0.39313,0.30751,0.58999>, +<-0.38685,0.31405,0.58068>, +<-0.38099,0.32083,0.57105>, +<-0.37596,0.32790,0.56134>, +<-0.37178,0.33549,0.55156>, +<-0.36798,0.34331,0.54178>, +<-0.36379,0.35098,0.53197>, +<-0.35866,0.35809,0.52209>, +<-0.35245,0.36411,0.51225>, +<-0.34519,0.36883,0.50222>, +<-0.33732,0.37214,0.49249>, +<-0.32900,0.37450,0.48276>, +<-0.32075,0.37710,0.47317>, +<-0.31290,0.38085,0.46367>, +<-0.30566,0.38612,0.45423>, +<-0.29962,0.39285,0.44501>, +<-0.29490,0.40063,0.43594>, +<-0.29132,0.40896,0.42710>, +<-0.28893,0.41786,0.41824> +<-0.28507,-0.42679,0.42657>, +<-0.28860,-0.41851,0.43554>, +<-0.29143,-0.40998,0.44454>, +<-0.29476,-0.40177,0.45363>, +<-0.29939,-0.39426,0.46293>, +<-0.30535,-0.38766,0.47239>, +<-0.31251,-0.38243,0.48194>, +<-0.32040,-0.37863,0.49164>, +<-0.32852,-0.37581,0.50146>, +<-0.33659,-0.37292,0.51141>, +<-0.34426,-0.36897,0.52144>, +<-0.35109,-0.36381,0.53146>, +<-0.35698,-0.35749,0.54159>, +<-0.36200,-0.35041,0.55161>, +<-0.36651,-0.34294,0.56156>, +<-0.37094,-0.33559,0.57148>, +<-0.37588,-0.32842,0.58135>, +<-0.38142,-0.32154,0.59121>, +<-0.38802,-0.31537,0.60080>, +<-0.39375,-0.30817,0.61015>, +<-0.39948,-0.30072,0.61950>, +<-0.40520,-0.29301,0.62847>, +<-0.41091,-0.28500,0.63703>, +<-0.41677,-0.27664,0.64555>, +<-0.42156,-0.26689,0.65581>, +<-0.41835,-0.25215,0.66042>, +<-0.41726,-0.23865,0.66015>, +<-0.41663,-0.22542,0.66007>, +<-0.41599,-0.21232,ZP>, +<-0.41544,-0.19937,ZP>, +<-0.41472,-0.18621,ZP>, +<-0.41421,-0.17324,ZP>, +<-0.41378,-0.16035,ZP>, +<-0.41340,-0.14752,ZP>, +<-0.41302,-0.13468,ZP>, +<-0.41269,-0.12186,ZP>, +<-0.41239,-0.10903,ZP>, +<-0.41215,-0.09621,ZP>, +<-0.41196,-0.08340,ZP>, +<-0.41182,-0.07058,ZP>, +<-0.41171,-0.05778,ZP>, +<-0.41164,-0.04498,ZP>, +<-0.41160,-0.03218,ZP>, +<-0.41159,-0.01940,ZP>, +<-0.41160,-0.00662,ZP>, +<-0.41165,0.00615,ZP>, +<-0.41172,0.01892,ZP>, +<-0.41181,0.03167,ZP>, +<-0.41192,0.04442,ZP>, +<-0.41205,0.05717,ZP>, +<-0.41219,0.06992,ZP>, +<-0.41235,0.08269,ZP>, +<-0.41253,0.09547,ZP>, +<-0.41275,0.10828,ZP>, +<-0.41302,0.12112,ZP>, +<-0.41332,0.13397,ZP>, +<-0.41365,0.14685,ZP>, +<-0.41399,0.15970,ZP>, +<-0.41435,0.17259,ZP>, +<-0.41472,0.18545,ZP>, +<-0.41536,0.19859,ZP>, +<-0.41542,0.21137,ZP>, +<-0.41663,0.22466,ZP>, +<-0.41773,0.23768,0.66013>, +<-0.41889,0.25091,0.66040>, +<-0.42207,0.26547,0.65632>, +<-0.41733,0.27580,0.64589>, +<-0.41146,0.28420,0.63733>, +<-0.40576,0.29223,0.62869>, +<-0.40007,0.29994,0.61968>, +<-0.39435,0.30741,0.61033>, +<-0.38862,0.31463,0.60096>, +<-0.38213,0.32078,0.59126>, +<-0.37658,0.32790,0.58158>, +<-0.37172,0.33516,0.57178>, +<-0.36737,0.34272,0.56185>, +<-0.36293,0.35021,0.55197>, +<-0.35784,0.35727,0.54203>, +<-0.35177,0.36346,0.53204>, +<-0.34480,0.36839,0.52208>, +<-0.33706,0.37202,0.51195>, +<-0.32897,0.37460,0.50210>, +<-0.32078,0.37733,0.49230>, +<-0.31294,0.38111,0.48265>, +<-0.30590,0.38627,0.47310>, +<-0.29999,0.39291,0.46355>, +<-0.29543,0.40055,0.45426>, +<-0.29223,0.40889,0.44509>, +<-0.28986,0.41757,0.43618>, +<-0.28700,0.42623,0.42733> +<-0.28036,-0.43422,0.43566>, +<-0.28543,-0.42667,0.44478>, +<-0.28960,-0.41868,0.45366>, +<-0.29208,-0.41013,0.46282>, +<-0.29518,-0.40201,0.47221>, +<-0.29973,-0.39451,0.48184>, +<-0.30564,-0.38798,0.49147>, +<-0.31276,-0.38278,0.50127>, +<-0.32053,-0.37893,0.51113>, +<-0.32854,-0.37585,0.52108>, +<-0.33647,-0.37253,0.53124>, +<-0.34374,-0.36831,0.54140>, +<-0.35026,-0.36293,0.55160>, +<-0.35606,-0.35654,0.56174>, +<-0.36123,-0.34955,0.57186>, +<-0.36606,-0.34245,0.58194>, +<-0.37105,-0.33532,0.59189>, +<-0.37686,-0.32863,0.60194>, +<-0.38275,-0.32175,0.61167>, +<-0.38866,-0.31461,0.62120>, +<-0.39457,-0.30721,0.63035>, +<-0.40054,-0.29949,0.63927>, +<-0.40674,-0.29147,0.64823>, +<-0.40821,-0.27973,0.65952>, +<-0.40599,-0.26530,0.66025>, +<-0.40514,-0.25198,0.66009>, +<-0.40443,-0.23884,ZP>, +<-0.40366,-0.22563,ZP>, +<-0.40286,-0.21237,ZP>, +<-0.40221,-0.19922,ZP>, +<-0.40166,-0.18619,ZP>, +<-0.40117,-0.17322,ZP>, +<-0.40074,-0.16030,ZP>, +<-0.40036,-0.14743,ZP>, +<-0.40002,-0.13457,ZP>, +<-0.39972,-0.12173,ZP>, +<-0.39947,-0.10891,ZP>, +<-0.39925,-0.09609,ZP>, +<-0.39908,-0.08327,ZP>, +<-0.39895,-0.07047,ZP>, +<-0.39885,-0.05767,ZP>, +<-0.39878,-0.04488,ZP>, +<-0.39874,-0.03210,ZP>, +<-0.39872,-0.01932,ZP>, +<-0.39873,-0.00656,ZP>, +<-0.39877,0.00620,ZP>, +<-0.39882,0.01895,ZP>, +<-0.39890,0.03170,ZP>, +<-0.39899,0.04444,ZP>, +<-0.39911,0.05719,ZP>, +<-0.39924,0.06994,ZP>, +<-0.39939,0.08271,ZP>, +<-0.39957,0.09549,ZP>, +<-0.39978,0.10830,ZP>, +<-0.40002,0.12112,ZP>, +<-0.40028,0.13396,ZP>, +<-0.40059,0.14683,ZP>, +<-0.40091,0.15970,ZP>, +<-0.40127,0.17262,ZP>, +<-0.40164,0.18552,ZP>, +<-0.40211,0.19855,ZP>, +<-0.40276,0.21173,ZP>, +<-0.40366,0.22499,ZP>, +<-0.40455,0.23813,ZP>, +<-0.40537,0.25119,0.66009>, +<-0.40631,0.26441,0.66023>, +<-0.40846,0.27872,0.65969>, +<-0.40731,0.29070,0.64847>, +<-0.40108,0.29878,0.63948>, +<-0.39515,0.30647,0.63051>, +<-0.38926,0.31388,0.62135>, +<-0.38337,0.32102,0.61186>, +<-0.37749,0.32790,0.60219>, +<-0.37180,0.33471,0.59216>, +<-0.36679,0.34202,0.58224>, +<-0.36202,0.34928,0.57221>, +<-0.35691,0.35622,0.56222>, +<-0.35097,0.36255,0.55205>, +<-0.34421,0.36782,0.54191>, +<-0.33678,0.37181,0.53179>, +<-0.32888,0.37481,0.52169>, +<-0.32089,0.37775,0.51173>, +<-0.31314,0.38159,0.50177>, +<-0.30609,0.38677,0.49201>, +<-0.30027,0.39328,0.48241>, +<-0.29584,0.40086,0.47281>, +<-0.29291,0.40907,0.46345>, +<-0.29092,0.41772,0.45420>, +<-0.28726,0.42587,0.44529>, +<-0.28275,0.43384,0.43636> +<-0.27341,-0.43997,0.44465>, +<-0.28006,-0.43378,0.45387>, +<-0.28575,-0.42669,0.46277>, +<-0.28982,-0.41873,0.47197>, +<-0.29254,-0.41044,0.48143>, +<-0.29555,-0.40233,0.49118>, +<-0.30005,-0.39497,0.50084>, +<-0.30600,-0.38852,0.51076>, +<-0.31305,-0.38340,0.52078>, +<-0.32065,-0.37949,0.53084>, +<-0.32847,-0.37605,0.54098>, +<-0.33602,-0.37230,0.55117>, +<-0.34301,-0.36764,0.56147>, +<-0.34943,-0.36193,0.57177>, +<-0.35510,-0.35557,0.58212>, +<-0.36042,-0.34880,0.59236>, +<-0.36575,-0.34186,0.60241>, +<-0.37125,-0.33494,0.61267>, +<-0.37731,-0.32814,0.62254>, +<-0.38337,-0.32109,0.63192>, +<-0.38954,-0.31373,0.64102>, +<-0.39608,-0.30607,0.65060>, +<-0.39441,-0.29201,0.66060>, +<-0.39341,-0.27837,0.66018>, +<-0.39270,-0.26510,0.66008>, +<-0.39204,-0.25198,ZP>, +<-0.39128,-0.23875,ZP>, +<-0.39042,-0.22541,ZP>, +<-0.38977,-0.21226,ZP>, +<-0.38919,-0.19917,ZP>, +<-0.38866,-0.18614,ZP>, +<-0.38818,-0.17316,ZP>, +<-0.38774,-0.16021,ZP>, +<-0.38738,-0.14731,ZP>, +<-0.38707,-0.13445,ZP>, +<-0.38680,-0.12160,ZP>, +<-0.38657,-0.10877,ZP>, +<-0.38638,-0.09596,ZP>, +<-0.38622,-0.08315,ZP>, +<-0.38610,-0.07035,ZP>, +<-0.38600,-0.05757,ZP>, +<-0.38594,-0.04479,ZP>, +<-0.38590,-0.03202,ZP>, +<-0.38588,-0.01926,ZP>, +<-0.38588,-0.00651,ZP>, +<-0.38591,0.00624,ZP>, +<-0.38595,0.01898,ZP>, +<-0.38602,0.03171,ZP>, +<-0.38610,0.04445,ZP>, +<-0.38620,0.05720,ZP>, +<-0.38632,0.06995,ZP>, +<-0.38646,0.08271,ZP>, +<-0.38663,0.09549,ZP>, +<-0.38683,0.10829,ZP>, +<-0.38705,0.12111,ZP>, +<-0.38730,0.13394,ZP>, +<-0.38758,0.14680,ZP>, +<-0.38788,0.15968,ZP>, +<-0.38825,0.17261,ZP>, +<-0.38865,0.18558,ZP>, +<-0.38914,0.19863,ZP>, +<-0.38974,0.21175,ZP>, +<-0.39044,0.22491,ZP>, +<-0.39136,0.23819,ZP>, +<-0.39221,0.25134,ZP>, +<-0.39295,0.26438,0.66008>, +<-0.39372,0.27759,0.66018>, +<-0.39469,0.29116,0.66060>, +<-0.39659,0.30542,0.65082>, +<-0.39012,0.31304,0.64102>, +<-0.38398,0.32037,0.63213>, +<-0.37795,0.32741,0.62278>, +<-0.37190,0.33421,0.61297>, +<-0.36647,0.34126,0.60274>, +<-0.36119,0.34831,0.59267>, +<-0.35580,0.35520,0.58257>, +<-0.35008,0.36152,0.57233>, +<-0.34356,0.36707,0.56204>, +<-0.33640,0.37158,0.55183>, +<-0.32876,0.37513,0.54149>, +<-0.32094,0.37842,0.53133>, +<-0.31336,0.38235,0.52131>, +<-0.30643,0.38749,0.51124>, +<-0.30062,0.39391,0.50132>, +<-0.29621,0.40131,0.49161>, +<-0.29338,0.40945,0.48199>, +<-0.29114,0.41787,0.47259>, +<-0.28754,0.42594,0.46326>, +<-0.28239,0.43329,0.45431>, +<-0.27624,0.44000,0.44521> +<-0.26447,-0.44277,0.45329>, +<-0.27239,-0.43878,0.46270>, +<-0.27955,-0.43341,0.47180>, +<-0.28533,-0.42658,0.48109>, +<-0.28968,-0.41892,0.49055>, +<-0.29267,-0.41081,0.50030>, +<-0.29579,-0.40287,0.51004>, +<-0.30044,-0.39555,0.52008>, +<-0.30646,-0.38929,0.53023>, +<-0.31337,-0.38432,0.54046>, +<-0.32080,-0.38022,0.55075>, +<-0.32831,-0.37638,0.56101>, +<-0.33551,-0.37206,0.57141>, +<-0.34217,-0.36698,0.58192>, +<-0.34832,-0.36119,0.59231>, +<-0.35423,-0.35479,0.60265>, +<-0.35979,-0.34814,0.61297>, +<-0.36547,-0.34126,0.62331>, +<-0.37168,-0.33455,0.63301>, +<-0.37506,-0.32554,0.64251>, +<-0.38437,-0.32002,0.65340>, +<-0.38162,-0.30489,0.66049>, +<-0.38082,-0.29145,0.66016>, +<-0.38018,-0.27814,0.66008>, +<-0.37951,-0.26494,ZP>, +<-0.37877,-0.25169,ZP>, +<-0.37802,-0.23842,ZP>, +<-0.37738,-0.22527,ZP>, +<-0.37675,-0.21215,ZP>, +<-0.37617,-0.19906,ZP>, +<-0.37566,-0.18602,ZP>, +<-0.37520,-0.17304,ZP>, +<-0.37480,-0.16010,ZP>, +<-0.37446,-0.14719,ZP>, +<-0.37416,-0.13432,ZP>, +<-0.37391,-0.12147,ZP>, +<-0.37370,-0.10864,ZP>, +<-0.37352,-0.09583,ZP>, +<-0.37338,-0.08303,ZP>, +<-0.37326,-0.07025,ZP>, +<-0.37317,-0.05747,ZP>, +<-0.37311,-0.04471,ZP>, +<-0.37307,-0.03196,ZP>, +<-0.37305,-0.01921,ZP>, +<-0.37305,-0.00647,ZP>, +<-0.37306,0.00626,ZP>, +<-0.37310,0.01899,ZP>, +<-0.37315,0.03172,ZP>, +<-0.37322,0.04445,ZP>, +<-0.37332,0.05719,ZP>, +<-0.37343,0.06994,ZP>, +<-0.37356,0.08270,ZP>, +<-0.37372,0.09547,ZP>, +<-0.37390,0.10826,ZP>, +<-0.37411,0.12107,ZP>, +<-0.37435,0.13390,ZP>, +<-0.37461,0.14675,ZP>, +<-0.37491,0.15964,ZP>, +<-0.37526,0.17257,ZP>, +<-0.37567,0.18556,ZP>, +<-0.37617,0.19861,ZP>, +<-0.37674,0.21171,ZP>, +<-0.37738,0.22483,ZP>, +<-0.37805,0.23796,ZP>, +<-0.37884,0.25117,ZP>, +<-0.37965,0.26437,ZP>, +<-0.38038,0.27751,0.66008>, +<-0.38110,0.29075,0.66016>, +<-0.38194,0.30411,0.66049>, +<-0.38486,0.31927,0.65377>, +<-0.37518,0.32507,0.64232>, +<-0.37233,0.33383,0.63332>, +<-0.36614,0.34054,0.62368>, +<-0.36045,0.34747,0.61338>, +<-0.35492,0.35422,0.60306>, +<-0.34911,0.36057,0.59282>, +<-0.34287,0.36638,0.58239>, +<-0.33598,0.37138,0.57199>, +<-0.32868,0.37555,0.56162>, +<-0.32106,0.37932,0.55117>, +<-0.31366,0.38340,0.54093>, +<-0.30682,0.38845,0.53073>, +<-0.30101,0.39468,0.52054>, +<-0.29655,0.40191,0.51051>, +<-0.29359,0.40989,0.50070>, +<-0.29102,0.41811,0.49107>, +<-0.28715,0.42597,0.48164>, +<-0.28183,0.43310,0.47222>, +<-0.27511,0.43886,0.46311>, +<-0.26748,0.44338,0.45376> +<-0.25475,-0.44219,0.46150>, +<-0.26312,-0.44078,0.47113>, +<-0.27127,-0.43776,0.48053>, +<-0.27857,-0.43289,0.49009>, +<-0.28464,-0.42640,0.49960>, +<-0.28925,-0.41900,0.50930>, +<-0.29263,-0.41111,0.51909>, +<-0.29609,-0.40327,0.52922>, +<-0.30090,-0.39627,0.53947>, +<-0.30688,-0.39038,0.54982>, +<-0.31376,-0.38550,0.56031>, +<-0.32100,-0.38117,0.57078>, +<-0.32817,-0.37678,0.58134>, +<-0.33494,-0.37194,0.59188>, +<-0.34137,-0.36655,0.60232>, +<-0.34753,-0.36053,0.61300>, +<-0.35320,-0.35393,0.62351>, +<-0.35948,-0.34762,0.63352>, +<-0.36594,-0.34104,0.64339>, +<-0.37170,-0.33326,0.65556>, +<-0.36879,-0.31779,0.66039>, +<-0.36810,-0.30431,0.66012>, +<-0.36759,-0.29118,0.66008>, +<-0.36690,-0.27787,ZP>, +<-0.36612,-0.26452,ZP>, +<-0.36549,-0.25131,ZP>, +<-0.36488,-0.23816,ZP>, +<-0.36428,-0.22504,ZP>, +<-0.36370,-0.21194,ZP>, +<-0.36317,-0.19888,ZP>, +<-0.36269,-0.18587,ZP>, +<-0.36227,-0.17290,ZP>, +<-0.36189,-0.15996,ZP>, +<-0.36156,-0.14706,ZP>, +<-0.36128,-0.13418,ZP>, +<-0.36104,-0.12134,ZP>, +<-0.36085,-0.10851,ZP>, +<-0.36068,-0.09571,ZP>, +<-0.36055,-0.08292,ZP>, +<-0.36044,-0.07015,ZP>, +<-0.36036,-0.05739,ZP>, +<-0.36029,-0.04464,ZP>, +<-0.36025,-0.03190,ZP>, +<-0.36023,-0.01917,ZP>, +<-0.36022,-0.00644,ZP>, +<-0.36024,0.00628,ZP>, +<-0.36027,0.01900,ZP>, +<-0.36031,0.03172,ZP>, +<-0.36038,0.04445,ZP>, +<-0.36046,0.05718,ZP>, +<-0.36057,0.06992,ZP>, +<-0.36069,0.08267,ZP>, +<-0.36084,0.09543,ZP>, +<-0.36101,0.10821,ZP>, +<-0.36120,0.12102,ZP>, +<-0.36143,0.13384,ZP>, +<-0.36168,0.14669,ZP>, +<-0.36198,0.15958,ZP>, +<-0.36232,0.17251,ZP>, +<-0.36272,0.18549,ZP>, +<-0.36318,0.19851,ZP>, +<-0.36370,0.21157,ZP>, +<-0.36428,0.22466,ZP>, +<-0.36489,0.23776,ZP>, +<-0.36553,0.25088,ZP>, +<-0.36620,0.26403,ZP>, +<-0.36703,0.27731,ZP>, +<-0.36780,0.29054,0.66008>, +<-0.36838,0.30358,0.66013>, +<-0.36911,0.31692,0.66038>, +<-0.37208,0.33229,0.65615>, +<-0.36663,0.34030,0.64383>, +<-0.36019,0.34688,0.63398>, +<-0.35396,0.35317,0.62403>, +<-0.34824,0.35982,0.61341>, +<-0.34213,0.36583,0.60290>, +<-0.33554,0.37127,0.59238>, +<-0.32865,0.37604,0.58178>, +<-0.32148,0.38035,0.57128>, +<-0.31414,0.38469,0.56080>, +<-0.30724,0.38966,0.55035>, +<-0.30140,0.39561,0.54000>, +<-0.29677,0.40258,0.52973>, +<-0.29353,0.41034,0.51967>, +<-0.29049,0.41828,0.50982>, +<-0.28629,0.42585,0.50014>, +<-0.28071,0.43266,0.49055>, +<-0.27380,0.43804,0.48092>, +<-0.26594,0.44150,0.47152>, +<-0.25768,0.44339,0.46189> +<-0.24546,-0.43859,0.46927>, +<-0.25343,-0.43953,0.47904>, +<-0.26171,-0.43882,0.48892>, +<-0.26979,-0.43655,0.49880>, +<-0.27740,-0.43222,0.50855>, +<-0.28361,-0.42612,0.51833>, +<-0.28844,-0.41900,0.52827>, +<-0.29226,-0.41135,0.53843>, +<-0.29615,-0.40386,0.54873>, +<-0.30124,-0.39718,0.55914>, +<-0.30748,-0.39154,0.56975>, +<-0.31424,-0.38668,0.58039>, +<-0.32104,-0.38207,0.59103>, +<-0.32788,-0.37750,0.60183>, +<-0.33419,-0.37191,0.61252>, +<-0.34051,-0.36617,0.62326>, +<-0.34685,-0.36022,0.63350>, +<-0.35332,-0.35410,0.64365>, +<-0.35872,-0.34639,0.65641>, +<-0.35595,-0.33081,0.66034>, +<-0.35529,-0.31730,0.66010>, +<-0.35478,-0.30396,ZP>, +<-0.35426,-0.29075,ZP>, +<-0.35349,-0.27735,ZP>, +<-0.35290,-0.26415,ZP>, +<-0.35231,-0.25097,ZP>, +<-0.35174,-0.23785,ZP>, +<-0.35119,-0.22476,ZP>, +<-0.35068,-0.21170,ZP>, +<-0.35020,-0.19868,ZP>, +<-0.34975,-0.18569,ZP>, +<-0.34935,-0.17273,ZP>, +<-0.34900,-0.15980,ZP>, +<-0.34869,-0.14691,ZP>, +<-0.34843,-0.13404,ZP>, +<-0.34821,-0.12121,ZP>, +<-0.34802,-0.10839,ZP>, +<-0.34786,-0.09560,ZP>, +<-0.34774,-0.08282,ZP>, +<-0.34763,-0.07006,ZP>, +<-0.34755,-0.05731,ZP>, +<-0.34749,-0.04458,ZP>, +<-0.34745,-0.03185,ZP>, +<-0.34743,-0.01913,ZP>, +<-0.34742,-0.00642,ZP>, +<-0.34743,0.00629,ZP>, +<-0.34745,0.01900,ZP>, +<-0.34749,0.03172,ZP>, +<-0.34755,0.04443,ZP>, +<-0.34763,0.05715,ZP>, +<-0.34773,0.06988,ZP>, +<-0.34784,0.08263,ZP>, +<-0.34798,0.09538,ZP>, +<-0.34814,0.10816,ZP>, +<-0.34833,0.12095,ZP>, +<-0.34854,0.13377,ZP>, +<-0.34879,0.14661,ZP>, +<-0.34907,0.15950,ZP>, +<-0.34940,0.17241,ZP>, +<-0.34978,0.18537,ZP>, +<-0.35021,0.19836,ZP>, +<-0.35068,0.21138,ZP>, +<-0.35119,0.22443,ZP>, +<-0.35173,0.23750,ZP>, +<-0.35231,0.25059,ZP>, +<-0.35292,0.26371,ZP>, +<-0.35355,0.27684,ZP>, +<-0.35436,0.29015,ZP>, +<-0.35494,0.30325,ZP>, +<-0.35551,0.31648,0.66010>, +<-0.35623,0.32985,0.66032>, +<-0.35900,0.34528,0.65713>, +<-0.35407,0.35337,0.64421>, +<-0.34765,0.35945,0.63409>, +<-0.34132,0.36541,0.62386>, +<-0.33501,0.37118,0.61310>, +<-0.32870,0.37679,0.60234>, +<-0.32172,0.38127,0.59156>, +<-0.31472,0.38597,0.58074>, +<-0.30792,0.39083,0.57015>, +<-0.30175,0.39654,0.55959>, +<-0.29683,0.40322,0.54924>, +<-0.29308,0.41073,0.53886>, +<-0.28949,0.41840,0.52881>, +<-0.28501,0.42562,0.51884>, +<-0.27927,0.43203,0.50894>, +<-0.27219,0.43689,0.49912>, +<-0.26426,0.43975,0.48927>, +<-0.25612,0.44082,0.47947>, +<-0.24807,0.44025,0.46958> +<-0.23696,-0.43304,0.47686>, +<-0.24435,-0.43550,0.48667>, +<-0.25217,-0.43712,0.49696>, +<-0.26010,-0.43704,0.50701>, +<-0.26840,-0.43519,0.51706>, +<-0.27594,-0.43131,0.52711>, +<-0.28224,-0.42558,0.53730>, +<-0.28727,-0.41870,0.54755>, +<-0.29153,-0.41136,0.55785>, +<-0.29601,-0.40429,0.56828>, +<-0.30145,-0.39816,0.57902>, +<-0.30761,-0.39283,0.58987>, +<-0.31463,-0.38863,0.60070>, +<-0.32100,-0.38337,0.61156>, +<-0.32740,-0.37795,0.62244>, +<-0.33380,-0.37236,0.63295>, +<-0.34028,-0.36664,0.64335>, +<-0.34569,-0.35943,0.65638>, +<-0.34318,-0.34378,0.66034>, +<-0.34266,-0.33030,0.66011>, +<-0.34218,-0.31701,ZP>, +<-0.34154,-0.30361,ZP>, +<-0.34081,-0.29016,ZP>, +<-0.34025,-0.27693,ZP>, +<-0.33969,-0.26375,ZP>, +<-0.33914,-0.25060,ZP>, +<-0.33862,-0.23751,ZP>, +<-0.33813,-0.22445,ZP>, +<-0.33767,-0.21143,ZP>, +<-0.33723,-0.19844,ZP>, +<-0.33683,-0.18548,ZP>, +<-0.33646,-0.17254,ZP>, +<-0.33613,-0.15963,ZP>, +<-0.33585,-0.14676,ZP>, +<-0.33560,-0.13390,ZP>, +<-0.33539,-0.12108,ZP>, +<-0.33521,-0.10827,ZP>, +<-0.33506,-0.09549,ZP>, +<-0.33494,-0.08273,ZP>, +<-0.33484,-0.06998,ZP>, +<-0.33477,-0.05724,ZP>, +<-0.33471,-0.04452,ZP>, +<-0.33467,-0.03181,ZP>, +<-0.33464,-0.01910,ZP>, +<-0.33463,-0.00640,ZP>, +<-0.33464,0.00630,ZP>, +<-0.33466,0.01900,ZP>, +<-0.33470,0.03171,ZP>, +<-0.33475,0.04441,ZP>, +<-0.33482,0.05712,ZP>, +<-0.33491,0.06985,ZP>, +<-0.33502,0.08258,ZP>, +<-0.33515,0.09533,ZP>, +<-0.33530,0.10809,ZP>, +<-0.33548,0.12088,ZP>, +<-0.33568,0.13368,ZP>, +<-0.33592,0.14652,ZP>, +<-0.33619,0.15939,ZP>, +<-0.33650,0.17229,ZP>, +<-0.33685,0.18522,ZP>, +<-0.33724,0.19817,ZP>, +<-0.33767,0.21116,ZP>, +<-0.33812,0.22416,ZP>, +<-0.33860,0.23719,ZP>, +<-0.33912,0.25025,ZP>, +<-0.33967,0.26335,ZP>, +<-0.34025,0.27646,ZP>, +<-0.34084,0.28961,ZP>, +<-0.34163,0.30296,ZP>, +<-0.34233,0.31625,ZP>, +<-0.34288,0.32943,0.66011>, +<-0.34346,0.34277,0.66031>, +<-0.34596,0.35822,0.65724>, +<-0.34112,0.36588,0.64404>, +<-0.33472,0.37153,0.63360>, +<-0.32835,0.37713,0.62290>, +<-0.32189,0.38263,0.61188>, +<-0.31548,0.38794,0.60098>, +<-0.30819,0.39211,0.59025>, +<-0.30194,0.39754,0.57949>, +<-0.29657,0.40376,0.56880>, +<-0.29226,0.41084,0.55831>, +<-0.28812,0.41823,0.54789>, +<-0.28330,0.42519,0.53771>, +<-0.27736,0.43114,0.52757>, +<-0.27017,0.43548,0.51739>, +<-0.26234,0.43786,0.50728>, +<-0.25439,0.43839,0.49719>, +<-0.24666,0.43735,0.48723>, +<-0.23936,0.43482,0.47700> +<-0.22746,-0.43075,0.48474>, +<-0.23544,-0.43110,0.49424>, +<-0.24337,-0.43221,0.50462>, +<-0.25062,-0.43489,0.51479>, +<-0.25865,-0.43536,0.52516>, +<-0.26652,-0.43382,0.53552>, +<-0.27397,-0.43018,0.54604>, +<-0.28035,-0.42473,0.55650>, +<-0.28561,-0.41813,0.56691>, +<-0.29031,-0.41124,0.57735>, +<-0.29532,-0.40479,0.58816>, +<-0.30098,-0.39910,0.59912>, +<-0.30744,-0.39433,0.61008>, +<-0.31387,-0.38926,0.62108>, +<-0.32035,-0.38399,0.63181>, +<-0.32412,-0.37573,0.64215>, +<-0.33258,-0.37236,0.65551>, +<-0.33019,-0.35654,0.66035>, +<-0.32978,-0.34317,0.66011>, +<-0.32940,-0.32986,ZP>, +<-0.32883,-0.31645,ZP>, +<-0.32813,-0.30298,ZP>, +<-0.32758,-0.28971,ZP>, +<-0.32704,-0.27649,ZP>, +<-0.32652,-0.26333,ZP>, +<-0.32602,-0.25022,ZP>, +<-0.32555,-0.23716,ZP>, +<-0.32510,-0.22414,ZP>, +<-0.32468,-0.21115,ZP>, +<-0.32428,-0.19819,ZP>, +<-0.32392,-0.18525,ZP>, +<-0.32358,-0.17234,ZP>, +<-0.32328,-0.15946,ZP>, +<-0.32302,-0.14660,ZP>, +<-0.32279,-0.13376,ZP>, +<-0.32259,-0.12095,ZP>, +<-0.32242,-0.10816,ZP>, +<-0.32228,-0.09539,ZP>, +<-0.32216,-0.08264,ZP>, +<-0.32207,-0.06990,ZP>, +<-0.32200,-0.05718,ZP>, +<-0.32194,-0.04447,ZP>, +<-0.32190,-0.03177,ZP>, +<-0.32187,-0.01907,ZP>, +<-0.32186,-0.00638,ZP>, +<-0.32187,0.00631,ZP>, +<-0.32189,0.01900,ZP>, +<-0.32192,0.03169,ZP>, +<-0.32197,0.04439,ZP>, +<-0.32204,0.05709,ZP>, +<-0.32212,0.06980,ZP>, +<-0.32222,0.08253,ZP>, +<-0.32234,0.09526,ZP>, +<-0.32249,0.10802,ZP>, +<-0.32265,0.12079,ZP>, +<-0.32285,0.13359,ZP>, +<-0.32307,0.14641,ZP>, +<-0.32333,0.15926,ZP>, +<-0.32362,0.17213,ZP>, +<-0.32394,0.18504,ZP>, +<-0.32429,0.19796,ZP>, +<-0.32467,0.21091,ZP>, +<-0.32508,0.22388,ZP>, +<-0.32551,0.23688,ZP>, +<-0.32597,0.24990,ZP>, +<-0.32647,0.26297,ZP>, +<-0.32700,0.27607,ZP>, +<-0.32756,0.28922,ZP>, +<-0.32815,0.30240,ZP>, +<-0.32890,0.31577,ZP>, +<-0.32954,0.32906,ZP>, +<-0.32997,0.34226,0.66010>, +<-0.33042,0.35548,0.66032>, +<-0.33287,0.37120,0.65654>, +<-0.32521,0.37512,0.64236>, +<-0.32132,0.38319,0.63231>, +<-0.31471,0.38858,0.62140>, +<-0.30826,0.39369,0.61041>, +<-0.30161,0.39838,0.59930>, +<-0.29592,0.40423,0.58872>, +<-0.29100,0.41072,0.57789>, +<-0.28642,0.41766,0.56726>, +<-0.28132,0.42433,0.55680>, +<-0.27525,0.42996,0.54640>, +<-0.26814,0.43395,0.53594>, +<-0.26036,0.43601,0.52540>, +<-0.25259,0.43622,0.51514>, +<-0.24529,0.43403,0.50495>, +<-0.23792,0.43213,0.49476>, +<-0.23018,0.43121,0.48473> +<-0.21762,-0.43293,0.49253>, +<-0.22556,-0.43124,0.50214>, +<-0.23374,-0.43032,0.51237>, +<-0.24134,-0.43085,0.52240>, +<-0.24906,-0.43278,0.53306>, +<-0.25668,-0.43385,0.54360>, +<-0.26451,-0.43234,0.55437>, +<-0.27173,-0.42879,0.56503>, +<-0.27807,-0.42353,0.57575>, +<-0.28343,-0.41732,0.58641>, +<-0.28859,-0.41102,0.59722>, +<-0.29409,-0.40530,0.60814>, +<-0.29999,-0.40003,0.61944>, +<-0.30647,-0.39515,0.63026>, +<-0.31301,-0.39012,0.64095>, +<-0.31936,-0.38496,0.65332>, +<-0.31718,-0.36933,0.66040>, +<-0.31676,-0.35577,0.66010>, +<-0.31654,-0.34262,ZP>, +<-0.31606,-0.32921,ZP>, +<-0.31544,-0.31577,ZP>, +<-0.31493,-0.30250,ZP>, +<-0.31440,-0.28926,ZP>, +<-0.31388,-0.27606,ZP>, +<-0.31339,-0.26293,ZP>, +<-0.31294,-0.24985,ZP>, +<-0.31251,-0.23682,ZP>, +<-0.31210,-0.22383,ZP>, +<-0.31172,-0.21087,ZP>, +<-0.31136,-0.19793,ZP>, +<-0.31103,-0.18503,ZP>, +<-0.31072,-0.17214,ZP>, +<-0.31045,-0.15928,ZP>, +<-0.31021,-0.14644,ZP>, +<-0.30999,-0.13362,ZP>, +<-0.30981,-0.12082,ZP>, +<-0.30965,-0.10805,ZP>, +<-0.30951,-0.09529,ZP>, +<-0.30940,-0.08256,ZP>, +<-0.30931,-0.06983,ZP>, +<-0.30924,-0.05712,ZP>, +<-0.30919,-0.04442,ZP>, +<-0.30915,-0.03173,ZP>, +<-0.30912,-0.01905,ZP>, +<-0.30911,-0.00637,ZP>, +<-0.30912,0.00631,ZP>, +<-0.30913,0.01899,ZP>, +<-0.30916,0.03167,ZP>, +<-0.30921,0.04436,ZP>, +<-0.30927,0.05706,ZP>, +<-0.30935,0.06976,ZP>, +<-0.30944,0.08247,ZP>, +<-0.30956,0.09520,ZP>, +<-0.30969,0.10794,ZP>, +<-0.30985,0.12070,ZP>, +<-0.31003,0.13348,ZP>, +<-0.31024,0.14629,ZP>, +<-0.31048,0.15912,ZP>, +<-0.31075,0.17197,ZP>, +<-0.31104,0.18484,ZP>, +<-0.31136,0.19773,ZP>, +<-0.31170,0.21065,ZP>, +<-0.31207,0.22359,ZP>, +<-0.31246,0.23656,ZP>, +<-0.31288,0.24956,ZP>, +<-0.31333,0.26259,ZP>, +<-0.31382,0.27568,ZP>, +<-0.31435,0.28882,ZP>, +<-0.31491,0.30198,ZP>, +<-0.31546,0.31517,ZP>, +<-0.31612,0.32849,ZP>, +<-0.31666,0.34179,ZP>, +<-0.31694,0.35483,0.66010>, +<-0.31744,0.36832,0.66038>, +<-0.31995,0.38408,0.65421>, +<-0.31424,0.38921,0.64029>, +<-0.30735,0.39447,0.63069>, +<-0.30084,0.39940,0.61983>, +<-0.29485,0.40469,0.60863>, +<-0.28933,0.41052,0.59773>, +<-0.28430,0.41681,0.58686>, +<-0.27909,0.42311,0.57604>, +<-0.27301,0.42853,0.56532>, +<-0.26602,0.43240,0.55466>, +<-0.25841,0.43442,0.54401>, +<-0.25075,0.43432,0.53334>, +<-0.24339,0.43217,0.52278>, +<-0.23586,0.43087,0.51248>, +<-0.22802,0.43085,0.50267>, +<-0.22010,0.43168,0.49251> +<-0.21001,-0.44028,0.49977>, +<-0.21646,-0.43604,0.50977>, +<-0.22380,-0.43279,0.52012>, +<-0.23135,-0.43107,0.53039>, +<-0.23945,-0.43073,0.54104>, +<-0.24711,-0.43164,0.55148>, +<-0.25484,-0.43253,0.56231>, +<-0.26226,-0.43098,0.57317>, +<-0.26925,-0.42727,0.58417>, +<-0.27530,-0.42220,0.59514>, +<-0.28099,-0.41660,0.60607>, +<-0.28626,-0.41076,0.61728>, +<-0.29229,-0.40572,0.62843>, +<-0.29876,-0.40108,0.63920>, +<-0.30539,-0.39661,0.65050>, +<-0.30427,-0.38213,0.66050>, +<-0.30375,-0.36855,0.66012>, +<-0.30347,-0.35517,ZP>, +<-0.30319,-0.34191,ZP>, +<-0.30264,-0.32845,ZP>, +<-0.30220,-0.31521,ZP>, +<-0.30173,-0.30198,ZP>, +<-0.30124,-0.28878,ZP>, +<-0.30077,-0.27564,ZP>, +<-0.30032,-0.26254,ZP>, +<-0.29990,-0.24949,ZP>, +<-0.29950,-0.23649,ZP>, +<-0.29913,-0.22352,ZP>, +<-0.29878,-0.21059,ZP>, +<-0.29846,-0.19768,ZP>, +<-0.29816,-0.18480,ZP>, +<-0.29788,-0.17194,ZP>, +<-0.29763,-0.15910,ZP>, +<-0.29741,-0.14628,ZP>, +<-0.29721,-0.13348,ZP>, +<-0.29704,-0.12070,ZP>, +<-0.29689,-0.10794,ZP>, +<-0.29676,-0.09520,ZP>, +<-0.29666,-0.08248,ZP>, +<-0.29657,-0.06977,ZP>, +<-0.29650,-0.05707,ZP>, +<-0.29645,-0.04438,ZP>, +<-0.29641,-0.03170,ZP>, +<-0.29639,-0.01903,ZP>, +<-0.29638,-0.00636,ZP>, +<-0.29638,0.00631,ZP>, +<-0.29640,0.01898,ZP>, +<-0.29642,0.03166,ZP>, +<-0.29647,0.04433,ZP>, +<-0.29652,0.05702,ZP>, +<-0.29660,0.06971,ZP>, +<-0.29668,0.08241,ZP>, +<-0.29679,0.09513,ZP>, +<-0.29692,0.10786,ZP>, +<-0.29707,0.12061,ZP>, +<-0.29724,0.13337,ZP>, +<-0.29743,0.14616,ZP>, +<-0.29765,0.15896,ZP>, +<-0.29789,0.17179,ZP>, +<-0.29816,0.18464,ZP>, +<-0.29844,0.19750,ZP>, +<-0.29876,0.21039,ZP>, +<-0.29909,0.22330,ZP>, +<-0.29944,0.23625,ZP>, +<-0.29983,0.24922,ZP>, +<-0.30025,0.26223,ZP>, +<-0.30069,0.27529,ZP>, +<-0.30117,0.28838,ZP>, +<-0.30168,0.30151,ZP>, +<-0.30218,0.31467,ZP>, +<-0.30264,0.32782,ZP>, +<-0.30324,0.34117,ZP>, +<-0.30359,0.35438,ZP>, +<-0.30404,0.36775,0.66013>, +<-0.30471,0.38121,0.66049>, +<-0.30628,0.39590,0.65106>, +<-0.29970,0.40039,0.63965>, +<-0.29316,0.40509,0.62885>, +<-0.28711,0.41017,0.61768>, +<-0.28190,0.41616,0.60645>, +<-0.27633,0.42183,0.59547>, +<-0.27037,0.42706,0.58449>, +<-0.26370,0.43096,0.57356>, +<-0.25638,0.43309,0.56269>, +<-0.24884,0.43299,0.55187>, +<-0.24125,0.43165,0.54119>, +<-0.23361,0.43129,0.53080>, +<-0.22578,0.43201,0.52045>, +<-0.21821,0.43392,0.51025>, +<-0.21125,0.43717,0.49986> +<-0.20638,-0.45062,0.50626>, +<-0.21059,-0.44502,0.51674>, +<-0.21590,-0.43994,0.52739>, +<-0.22224,-0.43578,0.53789>, +<-0.22971,-0.43286,0.54872>, +<-0.23737,-0.43173,0.55938>, +<-0.24519,-0.43194,0.57031>, +<-0.25269,-0.43198,0.58118>, +<-0.25998,-0.42983,0.59238>, +<-0.26652,-0.42603,0.60351>, +<-0.27256,-0.42142,0.61477>, +<-0.27787,-0.41569,0.62603>, +<-0.28429,-0.41140,0.63701>, +<-0.29080,-0.40722,0.64818>, +<-0.29145,-0.39493,0.66059>, +<-0.29092,-0.38127,0.66016>, +<-0.29069,-0.36800,0.66008>, +<-0.29033,-0.35462,ZP>, +<-0.28979,-0.34112,ZP>, +<-0.28941,-0.32786,ZP>, +<-0.28900,-0.31465,ZP>, +<-0.28856,-0.30146,ZP>, +<-0.28813,-0.28832,ZP>, +<-0.28770,-0.27522,ZP>, +<-0.28729,-0.26217,ZP>, +<-0.28690,-0.24915,ZP>, +<-0.28654,-0.23617,ZP>, +<-0.28619,-0.22323,ZP>, +<-0.28587,-0.21032,ZP>, +<-0.28558,-0.19743,ZP>, +<-0.28531,-0.18457,ZP>, +<-0.28506,-0.17174,ZP>, +<-0.28483,-0.15892,ZP>, +<-0.28462,-0.14612,ZP>, +<-0.28444,-0.13334,ZP>, +<-0.28428,-0.12058,ZP>, +<-0.28414,-0.10784,ZP>, +<-0.28403,-0.09511,ZP>, +<-0.28393,-0.08240,ZP>, +<-0.28385,-0.06970,ZP>, +<-0.28378,-0.05702,ZP>, +<-0.28373,-0.04434,ZP>, +<-0.28369,-0.03167,ZP>, +<-0.28367,-0.01901,ZP>, +<-0.28366,-0.00635,ZP>, +<-0.28366,0.00631,ZP>, +<-0.28368,0.01897,ZP>, +<-0.28370,0.03164,ZP>, +<-0.28374,0.04430,ZP>, +<-0.28379,0.05698,ZP>, +<-0.28386,0.06966,ZP>, +<-0.28394,0.08235,ZP>, +<-0.28404,0.09506,ZP>, +<-0.28416,0.10777,ZP>, +<-0.28430,0.12051,ZP>, +<-0.28446,0.13326,ZP>, +<-0.28463,0.14602,ZP>, +<-0.28483,0.15881,ZP>, +<-0.28505,0.17161,ZP>, +<-0.28529,0.18443,ZP>, +<-0.28556,0.19728,ZP>, +<-0.28584,0.21014,ZP>, +<-0.28614,0.22303,ZP>, +<-0.28647,0.23595,ZP>, +<-0.28683,0.24890,ZP>, +<-0.28721,0.26188,ZP>, +<-0.28762,0.27490,ZP>, +<-0.28805,0.28796,ZP>, +<-0.28849,0.30104,ZP>, +<-0.28895,0.31416,ZP>, +<-0.28938,0.32730,ZP>, +<-0.28981,0.34050,ZP>, +<-0.29042,0.35393,ZP>, +<-0.29098,0.36733,0.66009>, +<-0.29136,0.38053,0.66017>, +<-0.29194,0.39394,0.66061>, +<-0.29172,0.40659,0.64852>, +<-0.28521,0.41077,0.63737>, +<-0.27874,0.41510,0.62631>, +<-0.27346,0.42101,0.61505>, +<-0.26756,0.42576,0.60372>, +<-0.26115,0.42977,0.59271>, +<-0.25411,0.43229,0.58153>, +<-0.24670,0.43265,0.57067>, +<-0.23920,0.43222,0.55980>, +<-0.23159,0.43264,0.54914>, +<-0.22398,0.43417,0.53841>, +<-0.21681,0.43728,0.52765>, +<-0.21073,0.44153,0.51728>, +<-0.20571,0.44654,0.50655> +<-0.20649,-0.46182,0.51226>, +<-0.20843,-0.45560,0.52312>, +<-0.21150,-0.44961,0.53422>, +<-0.21586,-0.44409,0.54499>, +<-0.22156,-0.43946,0.55601>, +<-0.22824,-0.43615,0.56710>, +<-0.23576,-0.43433,0.57834>, +<-0.24315,-0.43353,0.58911>, +<-0.25074,-0.43260,0.60058>, +<-0.25742,-0.42959,0.61170>, +<-0.26326,-0.42511,0.62307>, +<-0.26959,-0.42114,0.63432>, +<-0.27594,-0.41723,0.64555>, +<-0.27912,-0.40869,0.65949>, +<-0.27782,-0.39385,0.66018>, +<-0.27765,-0.38058,0.66008>, +<-0.27744,-0.36726,ZP>, +<-0.27697,-0.35381,ZP>, +<-0.27660,-0.34053,ZP>, +<-0.27622,-0.32729,ZP>, +<-0.27583,-0.31410,ZP>, +<-0.27544,-0.30097,ZP>, +<-0.27506,-0.28788,ZP>, +<-0.27467,-0.27482,ZP>, +<-0.27430,-0.26180,ZP>, +<-0.27394,-0.24882,ZP>, +<-0.27360,-0.23587,ZP>, +<-0.27329,-0.22295,ZP>, +<-0.27299,-0.21006,ZP>, +<-0.27272,-0.19720,ZP>, +<-0.27247,-0.18436,ZP>, +<-0.27225,-0.17155,ZP>, +<-0.27204,-0.15875,ZP>, +<-0.27185,-0.14597,ZP>, +<-0.27169,-0.13321,ZP>, +<-0.27154,-0.12047,ZP>, +<-0.27141,-0.10774,ZP>, +<-0.27130,-0.09503,ZP>, +<-0.27121,-0.08233,ZP>, +<-0.27113,-0.06965,ZP>, +<-0.27107,-0.05697,ZP>, +<-0.27102,-0.04430,ZP>, +<-0.27099,-0.03164,ZP>, +<-0.27097,-0.01899,ZP>, +<-0.27096,-0.00634,ZP>, +<-0.27096,0.00631,ZP>, +<-0.27097,0.01896,ZP>, +<-0.27100,0.03162,ZP>, +<-0.27103,0.04428,ZP>, +<-0.27108,0.05694,ZP>, +<-0.27114,0.06961,ZP>, +<-0.27122,0.08229,ZP>, +<-0.27131,0.09498,ZP>, +<-0.27142,0.10769,ZP>, +<-0.27155,0.12041,ZP>, +<-0.27169,0.13314,ZP>, +<-0.27185,0.14589,ZP>, +<-0.27204,0.15865,ZP>, +<-0.27224,0.17143,ZP>, +<-0.27245,0.18423,ZP>, +<-0.27269,0.19705,ZP>, +<-0.27295,0.20990,ZP>, +<-0.27323,0.22276,ZP>, +<-0.27353,0.23566,ZP>, +<-0.27386,0.24858,ZP>, +<-0.27421,0.26154,ZP>, +<-0.27458,0.27453,ZP>, +<-0.27497,0.28754,ZP>, +<-0.27536,0.30059,ZP>, +<-0.27577,0.31367,ZP>, +<-0.27618,0.32680,ZP>, +<-0.27661,0.33999,ZP>, +<-0.27705,0.35324,ZP>, +<-0.27762,0.36665,ZP>, +<-0.27795,0.37993,0.66008>, +<-0.27824,0.39312,0.66018>, +<-0.27955,0.40774,0.65974>, +<-0.27675,0.41671,0.64585>, +<-0.27042,0.42060,0.63456>, +<-0.26425,0.42470,0.62331>, +<-0.25841,0.42930,0.61191>, +<-0.25172,0.43207,0.60076>, +<-0.24452,0.43366,0.58963>, +<-0.23715,0.43425,0.57852>, +<-0.22968,0.43521,0.56746>, +<-0.22256,0.43749,0.55652>, +<-0.21620,0.44125,0.54553>, +<-0.21084,0.44622,0.53461>, +<-0.20664,0.45162,0.52373>, +<-0.20376,0.45753,0.51261> +<-0.20368,-0.47191,0.51881>, +<-0.20749,-0.46663,0.52958>, +<-0.21101,-0.46066,0.54042>, +<-0.21306,-0.45433,0.55151>, +<-0.21586,-0.44857,0.56284>, +<-0.22101,-0.44372,0.57434>, +<-0.22740,-0.44016,0.58567>, +<-0.23425,-0.43767,0.59660>, +<-0.24230,-0.43742,0.60824>, +<-0.24842,-0.43396,0.61997>, +<-0.25463,-0.43034,0.63124>, +<-0.26093,-0.42664,0.64236>, +<-0.26631,-0.42184,0.65582>, +<-0.26471,-0.40640,0.66024>, +<-0.26458,-0.39310,0.66008>, +<-0.26449,-0.37987,ZP>, +<-0.26413,-0.36646,ZP>, +<-0.26381,-0.35320,ZP>, +<-0.26346,-0.33996,ZP>, +<-0.26309,-0.32675,ZP>, +<-0.26272,-0.31360,ZP>, +<-0.26237,-0.30051,ZP>, +<-0.26202,-0.28745,ZP>, +<-0.26167,-0.27443,ZP>, +<-0.26133,-0.26145,ZP>, +<-0.26100,-0.24850,ZP>, +<-0.26070,-0.23557,ZP>, +<-0.26041,-0.22268,ZP>, +<-0.26014,-0.20982,ZP>, +<-0.25989,-0.19698,ZP>, +<-0.25966,-0.18416,ZP>, +<-0.25946,-0.17136,ZP>, +<-0.25927,-0.15859,ZP>, +<-0.25910,-0.14583,ZP>, +<-0.25895,-0.13309,ZP>, +<-0.25881,-0.12036,ZP>, +<-0.25869,-0.10765,ZP>, +<-0.25859,-0.09495,ZP>, +<-0.25851,-0.08226,ZP>, +<-0.25844,-0.06959,ZP>, +<-0.25838,-0.05693,ZP>, +<-0.25833,-0.04427,ZP>, +<-0.25830,-0.03162,ZP>, +<-0.25828,-0.01897,ZP>, +<-0.25827,-0.00633,ZP>, +<-0.25827,0.00631,ZP>, +<-0.25828,0.01895,ZP>, +<-0.25830,0.03160,ZP>, +<-0.25834,0.04425,ZP>, +<-0.25838,0.05690,ZP>, +<-0.25844,0.06956,ZP>, +<-0.25851,0.08223,ZP>, +<-0.25860,0.09491,ZP>, +<-0.25870,0.10760,ZP>, +<-0.25881,0.12031,ZP>, +<-0.25894,0.13302,ZP>, +<-0.25909,0.14576,ZP>, +<-0.25926,0.15850,ZP>, +<-0.25944,0.17126,ZP>, +<-0.25964,0.18404,ZP>, +<-0.25985,0.19684,ZP>, +<-0.26009,0.20967,ZP>, +<-0.26035,0.22251,ZP>, +<-0.26062,0.23538,ZP>, +<-0.26092,0.24828,ZP>, +<-0.26124,0.26121,ZP>, +<-0.26158,0.27416,ZP>, +<-0.26193,0.28715,ZP>, +<-0.26229,0.30016,ZP>, +<-0.26266,0.31321,ZP>, +<-0.26305,0.32632,ZP>, +<-0.26347,0.33949,ZP>, +<-0.26389,0.35270,ZP>, +<-0.26430,0.36592,ZP>, +<-0.26475,0.37931,ZP>, +<-0.26496,0.39246,0.66008>, +<-0.26518,0.40573,0.66023>, +<-0.26717,0.42107,0.65627>, +<-0.26198,0.42607,0.64239>, +<-0.25551,0.42985,0.63125>, +<-0.24919,0.43351,0.62019>, +<-0.24312,0.43695,0.60857>, +<-0.23538,0.43721,0.59729>, +<-0.22830,0.43904,0.58608>, +<-0.22150,0.44163,0.57461>, +<-0.21565,0.44549,0.56332>, +<-0.21115,0.45045,0.55208>, +<-0.20829,0.45650,0.54088>, +<-0.20623,0.46274,0.52973>, +<-0.20333,0.46859,0.51872> +<-0.19556,-0.47939,0.52551>, +<-0.20067,-0.47522,0.53661>, +<-0.20579,-0.46996,0.54717>, +<-0.20993,-0.46447,0.55807>, +<-0.21300,-0.45891,0.56953>, +<-0.21604,-0.45267,0.58144>, +<-0.22041,-0.44786,0.59257>, +<-0.22741,-0.44532,0.60387>, +<-0.23347,-0.44220,0.61568>, +<-0.23952,-0.43897,0.62752>, +<-0.24554,-0.43564,0.63887>, +<-0.25174,-0.43244,0.65064>, +<-0.25161,-0.41865,0.66031>, +<-0.25140,-0.40552,0.66009>, +<-0.25148,-0.39240,ZP>, +<-0.25126,-0.37910,ZP>, +<-0.25094,-0.36580,ZP>, +<-0.25066,-0.35259,ZP>, +<-0.25034,-0.33939,ZP>, +<-0.25000,-0.32624,ZP>, +<-0.24967,-0.31313,ZP>, +<-0.24934,-0.30007,ZP>, +<-0.24902,-0.28705,ZP>, +<-0.24870,-0.27407,ZP>, +<-0.24839,-0.26112,ZP>, +<-0.24810,-0.24819,ZP>, +<-0.24782,-0.23530,ZP>, +<-0.24755,-0.22243,ZP>, +<-0.24731,-0.20959,ZP>, +<-0.24708,-0.19677,ZP>, +<-0.24687,-0.18397,ZP>, +<-0.24668,-0.17119,ZP>, +<-0.24651,-0.15843,ZP>, +<-0.24636,-0.14569,ZP>, +<-0.24622,-0.13297,ZP>, +<-0.24610,-0.12026,ZP>, +<-0.24599,-0.10756,ZP>, +<-0.24590,-0.09488,ZP>, +<-0.24582,-0.08220,ZP>, +<-0.24575,-0.06954,ZP>, +<-0.24570,-0.05688,ZP>, +<-0.24566,-0.04424,ZP>, +<-0.24563,-0.03160,ZP>, +<-0.24561,-0.01896,ZP>, +<-0.24560,-0.00632,ZP>, +<-0.24560,0.00631,ZP>, +<-0.24561,0.01894,ZP>, +<-0.24563,0.03158,ZP>, +<-0.24566,0.04422,ZP>, +<-0.24570,0.05686,ZP>, +<-0.24575,0.06952,ZP>, +<-0.24582,0.08217,ZP>, +<-0.24590,0.09484,ZP>, +<-0.24599,0.10752,ZP>, +<-0.24609,0.12021,ZP>, +<-0.24621,0.13291,ZP>, +<-0.24634,0.14563,ZP>, +<-0.24649,0.15836,ZP>, +<-0.24666,0.17110,ZP>, +<-0.24684,0.18386,ZP>, +<-0.24704,0.19665,ZP>, +<-0.24725,0.20945,ZP>, +<-0.24749,0.22227,ZP>, +<-0.24774,0.23512,ZP>, +<-0.24802,0.24799,ZP>, +<-0.24831,0.26089,ZP>, +<-0.24861,0.27382,ZP>, +<-0.24893,0.28677,ZP>, +<-0.24927,0.29976,ZP>, +<-0.24962,0.31279,ZP>, +<-0.24998,0.32586,ZP>, +<-0.25036,0.33898,ZP>, +<-0.25074,0.35215,ZP>, +<-0.25110,0.36533,ZP>, +<-0.25148,0.37859,ZP>, +<-0.25180,0.39184,ZP>, +<-0.25182,0.40495,0.66009>, +<-0.25225,0.41773,0.66047>, +<-0.25269,0.43200,0.65084>, +<-0.24637,0.43520,0.63904>, +<-0.24037,0.43848,0.62784>, +<-0.23434,0.44172,0.61598>, +<-0.22829,0.44488,0.60422>, +<-0.22091,0.44580,0.59287>, +<-0.21513,0.44977,0.58120>, +<-0.21110,0.45508,0.56991>, +<-0.20888,0.46102,0.55861>, +<-0.20574,0.46687,0.54733>, +<-0.20198,0.47247,0.53634>, +<-0.19770,0.47800,0.52537> +<-0.18403,-0.48026,0.53136>, +<-0.18991,-0.47865,0.54301>, +<-0.19614,-0.47567,0.55376>, +<-0.20165,-0.47168,0.56470>, +<-0.20643,-0.46684,0.57624>, +<-0.21061,-0.46118,0.58823>, +<-0.21386,-0.45546,0.59919>, +<-0.21835,-0.45047,0.61159>, +<-0.22428,-0.44697,0.62236>, +<-0.23041,-0.44390,0.63415>, +<-0.23863,-0.43351,0.65005>, +<-0.23838,-0.43185,0.65998>, +<-0.23804,-0.41742,ZP>, +<-0.23826,-0.40479,ZP>, +<-0.23826,-0.39162,ZP>, +<-0.23800,-0.37834,ZP>, +<-0.23781,-0.36517,ZP>, +<-0.23755,-0.35201,ZP>, +<-0.23726,-0.33887,ZP>, +<-0.23696,-0.32577,ZP>, +<-0.23666,-0.31270,ZP>, +<-0.23635,-0.29967,ZP>, +<-0.23606,-0.28668,ZP>, +<-0.23577,-0.27373,ZP>, +<-0.23549,-0.26080,ZP>, +<-0.23522,-0.24791,ZP>, +<-0.23496,-0.23504,ZP>, +<-0.23472,-0.22219,ZP>, +<-0.23450,-0.20937,ZP>, +<-0.23429,-0.19657,ZP>, +<-0.23410,-0.18379,ZP>, +<-0.23393,-0.17103,ZP>, +<-0.23377,-0.15829,ZP>, +<-0.23363,-0.14557,ZP>, +<-0.23351,-0.13286,ZP>, +<-0.23339,-0.12016,ZP>, +<-0.23330,-0.10748,ZP>, +<-0.23321,-0.09480,ZP>, +<-0.23314,-0.08214,ZP>, +<-0.23308,-0.06949,ZP>, +<-0.23303,-0.05684,ZP>, +<-0.23299,-0.04421,ZP>, +<-0.23296,-0.03157,ZP>, +<-0.23294,-0.01894,ZP>, +<-0.23294,-0.00632,ZP>, +<-0.23294,0.00631,ZP>, +<-0.23295,0.01893,ZP>, +<-0.23296,0.03156,ZP>, +<-0.23299,0.04419,ZP>, +<-0.23303,0.05683,ZP>, +<-0.23308,0.06947,ZP>, +<-0.23314,0.08212,ZP>, +<-0.23321,0.09478,ZP>, +<-0.23329,0.10744,ZP>, +<-0.23339,0.12012,ZP>, +<-0.23349,0.13281,ZP>, +<-0.23361,0.14551,ZP>, +<-0.23375,0.15822,ZP>, +<-0.23390,0.17095,ZP>, +<-0.23406,0.18370,ZP>, +<-0.23424,0.19646,ZP>, +<-0.23444,0.20924,ZP>, +<-0.23466,0.22205,ZP>, +<-0.23489,0.23487,ZP>, +<-0.23514,0.24772,ZP>, +<-0.23540,0.26060,ZP>, +<-0.23568,0.27350,ZP>, +<-0.23598,0.28643,ZP>, +<-0.23629,0.29939,ZP>, +<-0.23661,0.31239,ZP>, +<-0.23695,0.32543,ZP>, +<-0.23729,0.33850,ZP>, +<-0.23764,0.35161,ZP>, +<-0.23796,0.36474,ZP>, +<-0.23823,0.37789,ZP>, +<-0.23857,0.39111,ZP>, +<-0.23869,0.40428,ZP>, +<-0.23835,0.41669,0.66022>, +<-0.23912,0.43123,0.66017>, +<-0.22965,0.44030,0.64230>, +<-0.23254,0.44296,0.63281>, +<-0.22525,0.44652,0.62038>, +<-0.21923,0.44940,0.61111>, +<-0.21374,0.45302,0.59985>, +<-0.20986,0.45842,0.58797>, +<-0.20649,0.46433,0.57654>, +<-0.20276,0.46981,0.56524>, +<-0.19823,0.47490,0.55392>, +<-0.19311,0.47903,0.54276>, +<-0.18760,0.48307,0.53155> +<-0.17340,-0.47535,0.53624>, +<-0.17864,-0.47567,0.54829>, +<-0.18447,-0.47522,0.55947>, +<-0.19046,-0.47378,0.57074>, +<-0.19631,-0.47083,0.58247>, +<-0.20152,-0.46662,0.59459>, +<-0.20578,-0.46185,0.60594>, +<-0.21011,-0.45623,0.61821>, +<-0.21454,-0.45174,0.62898>, +<-0.22083,-0.44876,0.64137>, +<-0.22574,-0.44548,0.65492>, +<-0.22460,-0.43014,0.66019>, +<-0.22467,-0.41687,ZP>, +<-0.22505,-0.40400,ZP>, +<-0.22493,-0.39075,ZP>, +<-0.22486,-0.37768,ZP>, +<-0.22469,-0.36457,ZP>, +<-0.22447,-0.35146,ZP>, +<-0.22422,-0.33837,ZP>, +<-0.22395,-0.32532,ZP>, +<-0.22367,-0.31229,ZP>, +<-0.22340,-0.29930,ZP>, +<-0.22313,-0.28634,ZP>, +<-0.22286,-0.27341,ZP>, +<-0.22261,-0.26051,ZP>, +<-0.22236,-0.24764,ZP>, +<-0.22213,-0.23479,ZP>, +<-0.22191,-0.22197,ZP>, +<-0.22171,-0.20917,ZP>, +<-0.22152,-0.19639,ZP>, +<-0.22135,-0.18363,ZP>, +<-0.22119,-0.17089,ZP>, +<-0.22105,-0.15816,ZP>, +<-0.22092,-0.14545,ZP>, +<-0.22081,-0.13275,ZP>, +<-0.22070,-0.12007,ZP>, +<-0.22062,-0.10740,ZP>, +<-0.22054,-0.09474,ZP>, +<-0.22047,-0.08209,ZP>, +<-0.22042,-0.06944,ZP>, +<-0.22037,-0.05681,ZP>, +<-0.22034,-0.04418,ZP>, +<-0.22031,-0.03155,ZP>, +<-0.22029,-0.01893,ZP>, +<-0.22029,-0.00631,ZP>, +<-0.22029,0.00630,ZP>, +<-0.22030,0.01892,ZP>, +<-0.22031,0.03154,ZP>, +<-0.22034,0.04417,ZP>, +<-0.22037,0.05679,ZP>, +<-0.22042,0.06943,ZP>, +<-0.22047,0.08207,ZP>, +<-0.22053,0.09471,ZP>, +<-0.22061,0.10737,ZP>, +<-0.22069,0.12003,ZP>, +<-0.22079,0.13271,ZP>, +<-0.22090,0.14540,ZP>, +<-0.22102,0.15810,ZP>, +<-0.22116,0.17081,ZP>, +<-0.22131,0.18354,ZP>, +<-0.22147,0.19629,ZP>, +<-0.22165,0.20905,ZP>, +<-0.22185,0.22184,ZP>, +<-0.22206,0.23464,ZP>, +<-0.22229,0.24747,ZP>, +<-0.22253,0.26032,ZP>, +<-0.22279,0.27320,ZP>, +<-0.22306,0.28610,ZP>, +<-0.22334,0.29904,ZP>, +<-0.22364,0.31201,ZP>, +<-0.22395,0.32501,ZP>, +<-0.22426,0.33804,ZP>, +<-0.22456,0.35109,ZP>, +<-0.22485,0.36417,ZP>, +<-0.22509,0.37727,ZP>, +<-0.22523,0.39029,ZP>, +<-0.22545,0.40353,ZP>, +<-0.22517,0.41642,0.66010>, +<-0.22543,0.42960,0.66019>, +<-0.22676,0.44471,0.65512>, +<-0.22111,0.44888,0.64111>, +<-0.21432,0.45214,0.62776>, +<-0.21055,0.45457,0.61739>, +<-0.20643,0.46030,0.60643>, +<-0.20267,0.46581,0.59457>, +<-0.19853,0.47089,0.58297>, +<-0.19309,0.47519,0.57143>, +<-0.18737,0.47814,0.55990>, +<-0.18176,0.47995,0.54833>, +<-0.17603,0.48133,0.53667> +<-0.16437,-0.46739,0.54093>, +<-0.16960,-0.46787,0.55281>, +<-0.17448,-0.46911,0.56429>, +<-0.17939,-0.47086,0.57611>, +<-0.18511,-0.47061,0.58782>, +<-0.19072,-0.46832,0.59991>, +<-0.19554,-0.46489,0.61184>, +<-0.20005,-0.45988,0.62421>, +<-0.20510,-0.45608,0.63591>, +<-0.20216,-0.45179,0.65001>, +<-0.21162,-0.44279,0.66045>, +<-0.21138,-0.42933,0.66007>, +<-0.21161,-0.41634,ZP>, +<-0.21178,-0.40320,ZP>, +<-0.21176,-0.39010,ZP>, +<-0.21173,-0.37706,ZP>, +<-0.21159,-0.36399,ZP>, +<-0.21142,-0.35094,ZP>, +<-0.21120,-0.33791,ZP>, +<-0.21097,-0.32490,ZP>, +<-0.21072,-0.31191,ZP>, +<-0.21047,-0.29895,ZP>, +<-0.21023,-0.28602,ZP>, +<-0.20999,-0.27312,ZP>, +<-0.20975,-0.26024,ZP>, +<-0.20953,-0.24739,ZP>, +<-0.20932,-0.23457,ZP>, +<-0.20912,-0.22177,ZP>, +<-0.20894,-0.20898,ZP>, +<-0.20877,-0.19622,ZP>, +<-0.20861,-0.18348,ZP>, +<-0.20847,-0.17075,ZP>, +<-0.20834,-0.15804,ZP>, +<-0.20822,-0.14534,ZP>, +<-0.20812,-0.13266,ZP>, +<-0.20803,-0.11999,ZP>, +<-0.20795,-0.10733,ZP>, +<-0.20788,-0.09468,ZP>, +<-0.20782,-0.08204,ZP>, +<-0.20777,-0.06940,ZP>, +<-0.20773,-0.05677,ZP>, +<-0.20770,-0.04415,ZP>, +<-0.20767,-0.03154,ZP>, +<-0.20766,-0.01892,ZP>, +<-0.20765,-0.00631,ZP>, +<-0.20765,0.00630,ZP>, +<-0.20766,0.01891,ZP>, +<-0.20767,0.03153,ZP>, +<-0.20769,0.04414,ZP>, +<-0.20773,0.05676,ZP>, +<-0.20777,0.06939,ZP>, +<-0.20781,0.08202,ZP>, +<-0.20787,0.09465,ZP>, +<-0.20794,0.10730,ZP>, +<-0.20801,0.11995,ZP>, +<-0.20810,0.13262,ZP>, +<-0.20820,0.14529,ZP>, +<-0.20831,0.15798,ZP>, +<-0.20843,0.17068,ZP>, +<-0.20857,0.18339,ZP>, +<-0.20872,0.19613,ZP>, +<-0.20888,0.20887,ZP>, +<-0.20906,0.22164,ZP>, +<-0.20925,0.23443,ZP>, +<-0.20946,0.24724,ZP>, +<-0.20968,0.26007,ZP>, +<-0.20992,0.27292,ZP>, +<-0.21017,0.28580,ZP>, +<-0.21043,0.29871,ZP>, +<-0.21070,0.31165,ZP>, +<-0.21098,0.32461,ZP>, +<-0.21126,0.33760,ZP>, +<-0.21152,0.35060,ZP>, +<-0.21176,0.36363,ZP>, +<-0.21197,0.37667,ZP>, +<-0.21207,0.38968,ZP>, +<-0.21218,0.40277,ZP>, +<-0.21218,0.41593,ZP>, +<-0.21214,0.42881,ZP>, +<-0.21249,0.44208,0.66040>, +<-0.21545,0.44928,0.64426>, +<-0.20408,0.45660,0.63599>, +<-0.20099,0.45922,0.62433>, +<-0.19694,0.46516,0.61266>, +<-0.19250,0.46959,0.60076>, +<-0.18772,0.47300,0.58873>, +<-0.18189,0.47529,0.57694>, +<-0.17611,0.47622,0.56501>, +<-0.17091,0.47612,0.55317>, +<-0.16608,0.47511,0.54122> +<-0.15269,-0.46565,0.54660>, +<-0.15835,-0.46527,0.55807>, +<-0.16378,-0.46553,0.56966>, +<-0.16896,-0.46611,0.58143>, +<-0.17444,-0.46687,0.59310>, +<-0.17963,-0.46697,0.60494>, +<-0.18481,-0.46626,0.61739>, +<-0.18924,-0.46305,0.62951>, +<-0.19473,-0.46058,0.64154>, +<-0.19926,-0.45712,0.65587>, +<-0.19825,-0.44179,0.66010>, +<-0.19843,-0.42874,ZP>, +<-0.19868,-0.41581,ZP>, +<-0.19863,-0.40256,ZP>, +<-0.19866,-0.38953,ZP>, +<-0.19863,-0.37650,ZP>, +<-0.19853,-0.36347,ZP>, +<-0.19840,-0.35047,ZP>, +<-0.19822,-0.33748,ZP>, +<-0.19802,-0.32450,ZP>, +<-0.19780,-0.31155,ZP>, +<-0.19758,-0.29862,ZP>, +<-0.19735,-0.28572,ZP>, +<-0.19714,-0.27284,ZP>, +<-0.19693,-0.25999,ZP>, +<-0.19672,-0.24716,ZP>, +<-0.19653,-0.23436,ZP>, +<-0.19635,-0.22158,ZP>, +<-0.19619,-0.20881,ZP>, +<-0.19603,-0.19607,ZP>, +<-0.19589,-0.18334,ZP>, +<-0.19576,-0.17062,ZP>, +<-0.19564,-0.15793,ZP>, +<-0.19554,-0.14524,ZP>, +<-0.19545,-0.13257,ZP>, +<-0.19536,-0.11991,ZP>, +<-0.19529,-0.10726,ZP>, +<-0.19523,-0.09462,ZP>, +<-0.19517,-0.08199,ZP>, +<-0.19513,-0.06936,ZP>, +<-0.19509,-0.05674,ZP>, +<-0.19506,-0.04413,ZP>, +<-0.19504,-0.03152,ZP>, +<-0.19503,-0.01891,ZP>, +<-0.19502,-0.00631,ZP>, +<-0.19502,0.00630,ZP>, +<-0.19503,0.01891,ZP>, +<-0.19504,0.03151,ZP>, +<-0.19506,0.04412,ZP>, +<-0.19509,0.05673,ZP>, +<-0.19512,0.06935,ZP>, +<-0.19517,0.08197,ZP>, +<-0.19522,0.09460,ZP>, +<-0.19528,0.10724,ZP>, +<-0.19535,0.11988,ZP>, +<-0.19543,0.13253,ZP>, +<-0.19552,0.14520,ZP>, +<-0.19562,0.15787,ZP>, +<-0.19573,0.17056,ZP>, +<-0.19585,0.18326,ZP>, +<-0.19598,0.19598,ZP>, +<-0.19613,0.20871,ZP>, +<-0.19629,0.22146,ZP>, +<-0.19647,0.23423,ZP>, +<-0.19666,0.24702,ZP>, +<-0.19686,0.25983,ZP>, +<-0.19707,0.27266,ZP>, +<-0.19730,0.28552,ZP>, +<-0.19754,0.29840,ZP>, +<-0.19779,0.31131,ZP>, +<-0.19803,0.32423,ZP>, +<-0.19828,0.33718,ZP>, +<-0.19851,0.35015,ZP>, +<-0.19870,0.36312,ZP>, +<-0.19887,0.37612,ZP>, +<-0.19899,0.38914,ZP>, +<-0.19905,0.40217,ZP>, +<-0.19921,0.41540,ZP>, +<-0.19896,0.42823,0.66009>, +<-0.19877,0.44128,0.66020>, +<-0.19990,0.45665,0.65627>, +<-0.19568,0.46019,0.64221>, +<-0.19129,0.46244,0.63073>, +<-0.18640,0.46744,0.61833>, +<-0.18165,0.46998,0.60577>, +<-0.17674,0.47137,0.59359>, +<-0.17150,0.47109,0.58173>, +<-0.16629,0.47007,0.56968>, +<-0.16132,0.46933,0.55779>, +<-0.15653,0.46872,0.54611> +<-0.14237,-0.47192,0.55161>, +<-0.14710,-0.47008,0.56314>, +<-0.15232,-0.46873,0.57486>, +<-0.15769,-0.46799,0.58681>, +<-0.16320,-0.46787,0.59881>, +<-0.16950,-0.47043,0.61094>, +<-0.17429,-0.46865,0.62344>, +<-0.17862,-0.46702,0.63500>, +<-0.18411,-0.46503,0.64774>, +<-0.18533,-0.45502,0.66027>, +<-0.18425,-0.44097,ZP>, +<-0.18495,-0.42772,ZP>, +<-0.18551,-0.41512,ZP>, +<-0.18558,-0.40204,ZP>, +<-0.18561,-0.38902,ZP>, +<-0.18559,-0.37600,ZP>, +<-0.18552,-0.36301,ZP>, +<-0.18541,-0.35004,ZP>, +<-0.18526,-0.33708,ZP>, +<-0.18509,-0.32414,ZP>, +<-0.18490,-0.31122,ZP>, +<-0.18470,-0.29832,ZP>, +<-0.18450,-0.28545,ZP>, +<-0.18431,-0.27259,ZP>, +<-0.18412,-0.25976,ZP>, +<-0.18394,-0.24696,ZP>, +<-0.18376,-0.23417,ZP>, +<-0.18360,-0.22140,ZP>, +<-0.18345,-0.20865,ZP>, +<-0.18331,-0.19592,ZP>, +<-0.18318,-0.18321,ZP>, +<-0.18307,-0.17051,ZP>, +<-0.18296,-0.15782,ZP>, +<-0.18287,-0.14515,ZP>, +<-0.18278,-0.13249,ZP>, +<-0.18271,-0.11984,ZP>, +<-0.18264,-0.10720,ZP>, +<-0.18259,-0.09457,ZP>, +<-0.18254,-0.08195,ZP>, +<-0.18250,-0.06933,ZP>, +<-0.18247,-0.05672,ZP>, +<-0.18244,-0.04411,ZP>, +<-0.18242,-0.03150,ZP>, +<-0.18241,-0.01890,ZP>, +<-0.18240,-0.00630,ZP>, +<-0.18240,0.00630,ZP>, +<-0.18241,0.01890,ZP>, +<-0.18242,0.03150,ZP>, +<-0.18244,0.04410,ZP>, +<-0.18246,0.05671,ZP>, +<-0.18249,0.06932,ZP>, +<-0.18253,0.08193,ZP>, +<-0.18258,0.09455,ZP>, +<-0.18263,0.10718,ZP>, +<-0.18269,0.11981,ZP>, +<-0.18276,0.13246,ZP>, +<-0.18284,0.14511,ZP>, +<-0.18293,0.15777,ZP>, +<-0.18303,0.17045,ZP>, +<-0.18314,0.18314,ZP>, +<-0.18327,0.19584,ZP>, +<-0.18340,0.20856,ZP>, +<-0.18355,0.22130,ZP>, +<-0.18370,0.23405,ZP>, +<-0.18387,0.24682,ZP>, +<-0.18406,0.25961,ZP>, +<-0.18425,0.27243,ZP>, +<-0.18446,0.28526,ZP>, +<-0.18467,0.29812,ZP>, +<-0.18489,0.31099,ZP>, +<-0.18511,0.32389,ZP>, +<-0.18532,0.33680,ZP>, +<-0.18552,0.34973,ZP>, +<-0.18569,0.36267,ZP>, +<-0.18584,0.37564,ZP>, +<-0.18595,0.38864,ZP>, +<-0.18600,0.40164,ZP>, +<-0.18602,0.41468,ZP>, +<-0.18581,0.42766,0.66008>, +<-0.18548,0.44075,0.66012>, +<-0.18602,0.45441,0.66039>, +<-0.18499,0.46473,0.64800>, +<-0.18004,0.46648,0.63559>, +<-0.17551,0.46852,0.62367>, +<-0.17055,0.47002,0.61107>, +<-0.16555,0.46924,0.59882>, +<-0.16055,0.46900,0.58695>, +<-0.15523,0.46860,0.57486>, +<-0.14980,0.46824,0.56311>, +<-0.14478,0.46853,0.55140> +<-0.13729,-0.48276,0.55536>, +<-0.14016,-0.47973,0.56729>, +<-0.14414,-0.47704,0.57931>, +<-0.14851,-0.47503,0.59131>, +<-0.15466,-0.47551,0.60347>, +<-0.15922,-0.47399,0.61590>, +<-0.16387,-0.47241,0.62854>, +<-0.16866,-0.47072,0.64067>, +<-0.17282,-0.46865,0.65422>, +<-0.17227,-0.45413,0.66015>, +<-0.17233,-0.44110,ZP>, +<-0.17256,-0.42794,ZP>, +<-0.17251,-0.41465,ZP>, +<-0.17259,-0.40160,ZP>, +<-0.17262,-0.38857,ZP>, +<-0.17260,-0.37557,ZP>, +<-0.17254,-0.36260,ZP>, +<-0.17245,-0.34965,ZP>, +<-0.17233,-0.33672,ZP>, +<-0.17219,-0.32381,ZP>, +<-0.17202,-0.31092,ZP>, +<-0.17185,-0.29804,ZP>, +<-0.17168,-0.28519,ZP>, +<-0.17150,-0.27236,ZP>, +<-0.17133,-0.25955,ZP>, +<-0.17117,-0.24676,ZP>, +<-0.17101,-0.23399,ZP>, +<-0.17087,-0.22124,ZP>, +<-0.17073,-0.20851,ZP>, +<-0.17061,-0.19579,ZP>, +<-0.17049,-0.18309,ZP>, +<-0.17039,-0.17041,ZP>, +<-0.17029,-0.15773,ZP>, +<-0.17021,-0.14507,ZP>, +<-0.17013,-0.13242,ZP>, +<-0.17007,-0.11978,ZP>, +<-0.17001,-0.10715,ZP>, +<-0.16996,-0.09452,ZP>, +<-0.16991,-0.08191,ZP>, +<-0.16988,-0.06930,ZP>, +<-0.16985,-0.05669,ZP>, +<-0.16982,-0.04409,ZP>, +<-0.16981,-0.03149,ZP>, +<-0.16980,-0.01889,ZP>, +<-0.16979,-0.00630,ZP>, +<-0.16979,0.00629,ZP>, +<-0.16980,0.01889,ZP>, +<-0.16981,0.03148,ZP>, +<-0.16982,0.04408,ZP>, +<-0.16984,0.05668,ZP>, +<-0.16987,0.06928,ZP>, +<-0.16991,0.08189,ZP>, +<-0.16995,0.09451,ZP>, +<-0.17000,0.10713,ZP>, +<-0.17005,0.11975,ZP>, +<-0.17011,0.13239,ZP>, +<-0.17018,0.14503,ZP>, +<-0.17026,0.15769,ZP>, +<-0.17035,0.17035,ZP>, +<-0.17045,0.18303,ZP>, +<-0.17056,0.19572,ZP>, +<-0.17068,0.20843,ZP>, +<-0.17081,0.22115,ZP>, +<-0.17096,0.23389,ZP>, +<-0.17111,0.24664,ZP>, +<-0.17128,0.25941,ZP>, +<-0.17145,0.27221,ZP>, +<-0.17164,0.28502,ZP>, +<-0.17183,0.29785,ZP>, +<-0.17202,0.31070,ZP>, +<-0.17222,0.32357,ZP>, +<-0.17240,0.33645,ZP>, +<-0.17257,0.34935,ZP>, +<-0.17272,0.36227,ZP>, +<-0.17285,0.37521,ZP>, +<-0.17296,0.38819,ZP>, +<-0.17301,0.40118,ZP>, +<-0.17300,0.41420,ZP>, +<-0.17310,0.42744,ZP>, +<-0.17294,0.44058,ZP>, +<-0.17292,0.45362,0.66013>, +<-0.17356,0.46824,0.65449>, +<-0.16947,0.47043,0.64086>, +<-0.16473,0.47210,0.62875>, +<-0.16010,0.47369,0.61617>, +<-0.15562,0.47521,0.60372>, +<-0.14946,0.47174,0.59192>, +<-0.14434,0.47241,0.57970>, +<-0.13930,0.47365,0.56791>, +<-0.13483,0.47561,0.55594> +<-0.13307,-0.49386,0.55957>, +<-0.13621,-0.49110,0.57141>, +<-0.13929,-0.48800,0.58343>, +<-0.14198,-0.48444,0.59560>, +<-0.14488,-0.48060,0.60806>, +<-0.14844,-0.47781,0.62050>, +<-0.15316,-0.47598,0.63321>, +<-0.15752,-0.47461,0.64557>, +<-0.15969,-0.46795,0.65939>, +<-0.15918,-0.45364,ZP>, +<-0.15949,-0.44072,ZP>, +<-0.15953,-0.42740,ZP>, +<-0.15958,-0.41427,ZP>, +<-0.15965,-0.40120,ZP>, +<-0.15967,-0.38818,ZP>, +<-0.15966,-0.37519,ZP>, +<-0.15961,-0.36223,ZP>, +<-0.15953,-0.34930,ZP>, +<-0.15943,-0.33639,ZP>, +<-0.15931,-0.32351,ZP>, +<-0.15917,-0.31064,ZP>, +<-0.15902,-0.29779,ZP>, +<-0.15887,-0.28496,ZP>, +<-0.15871,-0.27215,ZP>, +<-0.15856,-0.25936,ZP>, +<-0.15842,-0.24659,ZP>, +<-0.15828,-0.23384,ZP>, +<-0.15815,-0.22110,ZP>, +<-0.15803,-0.20838,ZP>, +<-0.15792,-0.19568,ZP>, +<-0.15781,-0.18299,ZP>, +<-0.15772,-0.17031,ZP>, +<-0.15764,-0.15765,ZP>, +<-0.15756,-0.14500,ZP>, +<-0.15749,-0.13235,ZP>, +<-0.15743,-0.11972,ZP>, +<-0.15738,-0.10710,ZP>, +<-0.15734,-0.09448,ZP>, +<-0.15730,-0.08187,ZP>, +<-0.15726,-0.06927,ZP>, +<-0.15724,-0.05667,ZP>, +<-0.15722,-0.04407,ZP>, +<-0.15720,-0.03148,ZP>, +<-0.15719,-0.01889,ZP>, +<-0.15719,-0.00630,ZP>, +<-0.15719,0.00629,ZP>, +<-0.15719,0.01888,ZP>, +<-0.15720,0.03147,ZP>, +<-0.15721,0.04406,ZP>, +<-0.15723,0.05666,ZP>, +<-0.15726,0.06926,ZP>, +<-0.15729,0.08186,ZP>, +<-0.15733,0.09447,ZP>, +<-0.15737,0.10708,ZP>, +<-0.15742,0.11970,ZP>, +<-0.15747,0.13232,ZP>, +<-0.15754,0.14496,ZP>, +<-0.15761,0.15761,ZP>, +<-0.15769,0.17026,ZP>, +<-0.15778,0.18293,ZP>, +<-0.15787,0.19561,ZP>, +<-0.15798,0.20830,ZP>, +<-0.15810,0.22101,ZP>, +<-0.15823,0.23374,ZP>, +<-0.15837,0.24648,ZP>, +<-0.15851,0.25923,ZP>, +<-0.15867,0.27201,ZP>, +<-0.15883,0.28480,ZP>, +<-0.15900,0.29761,ZP>, +<-0.15917,0.31043,ZP>, +<-0.15934,0.32328,ZP>, +<-0.15950,0.33614,ZP>, +<-0.15965,0.34901,ZP>, +<-0.15979,0.36192,ZP>, +<-0.15991,0.37484,ZP>, +<-0.15999,0.38779,ZP>, +<-0.16005,0.40078,ZP>, +<-0.16007,0.41381,ZP>, +<-0.16009,0.42690,ZP>, +<-0.16012,0.44019,ZP>, +<-0.15987,0.45311,ZP>, +<-0.16042,0.46733,0.65954>, +<-0.15838,0.47434,0.64581>, +<-0.15406,0.47569,0.63346>, +<-0.14954,0.47713,0.62101>, +<-0.14520,0.47848,0.60841>, +<-0.13990,0.47825,0.59627>, +<-0.13560,0.48029,0.58394>, +<-0.13203,0.48286,0.57211>, +<-0.12903,0.48610,0.55971> +<-0.12189,-0.49974,0.56405>, +<-0.12582,-0.49750,0.57604>, +<-0.12954,-0.49467,0.58806>, +<-0.13281,-0.49131,0.60037>, +<-0.13594,-0.48755,0.61272>, +<-0.13875,-0.48309,0.62516>, +<-0.14217,-0.47938,0.63742>, +<-0.14606,-0.47841,0.65028>, +<-0.14637,-0.46643,0.66019>, +<-0.14634,-0.45331,ZP>, +<-0.14672,-0.44030,ZP>, +<-0.14668,-0.42703,ZP>, +<-0.14675,-0.41395,ZP>, +<-0.14677,-0.40087,ZP>, +<-0.14677,-0.38784,ZP>, +<-0.14676,-0.37486,ZP>, +<-0.14672,-0.36191,ZP>, +<-0.14665,-0.34900,ZP>, +<-0.14657,-0.33611,ZP>, +<-0.14646,-0.32324,ZP>, +<-0.14634,-0.31039,ZP>, +<-0.14621,-0.29756,ZP>, +<-0.14608,-0.28475,ZP>, +<-0.14594,-0.27196,ZP>, +<-0.14581,-0.25919,ZP>, +<-0.14568,-0.24643,ZP>, +<-0.14556,-0.23369,ZP>, +<-0.14544,-0.22097,ZP>, +<-0.14534,-0.20826,ZP>, +<-0.14524,-0.19557,ZP>, +<-0.14515,-0.18289,ZP>, +<-0.14506,-0.17023,ZP>, +<-0.14499,-0.15757,ZP>, +<-0.14492,-0.14493,ZP>, +<-0.14486,-0.13230,ZP>, +<-0.14481,-0.11967,ZP>, +<-0.14476,-0.10705,ZP>, +<-0.14472,-0.09444,ZP>, +<-0.14469,-0.08184,ZP>, +<-0.14466,-0.06924,ZP>, +<-0.14464,-0.05664,ZP>, +<-0.14462,-0.04405,ZP>, +<-0.14460,-0.03147,ZP>, +<-0.14459,-0.01888,ZP>, +<-0.14459,-0.00629,ZP>, +<-0.14459,0.00629,ZP>, +<-0.14459,0.01888,ZP>, +<-0.14460,0.03146,ZP>, +<-0.14461,0.04405,ZP>, +<-0.14463,0.05664,ZP>, +<-0.14465,0.06923,ZP>, +<-0.14468,0.08183,ZP>, +<-0.14471,0.09443,ZP>, +<-0.14475,0.10704,ZP>, +<-0.14479,0.11965,ZP>, +<-0.14484,0.13227,ZP>, +<-0.14490,0.14490,ZP>, +<-0.14496,0.15753,ZP>, +<-0.14503,0.17018,ZP>, +<-0.14511,0.18284,ZP>, +<-0.14520,0.19551,ZP>, +<-0.14529,0.20819,ZP>, +<-0.14540,0.22089,ZP>, +<-0.14551,0.23360,ZP>, +<-0.14564,0.24633,ZP>, +<-0.14577,0.25907,ZP>, +<-0.14591,0.27183,ZP>, +<-0.14605,0.28460,ZP>, +<-0.14620,0.29739,ZP>, +<-0.14635,0.31020,ZP>, +<-0.14650,0.32302,ZP>, +<-0.14664,0.33586,ZP>, +<-0.14677,0.34872,ZP>, +<-0.14689,0.36160,ZP>, +<-0.14700,0.37451,ZP>, +<-0.14709,0.38745,ZP>, +<-0.14717,0.40044,ZP>, +<-0.14723,0.41348,ZP>, +<-0.14724,0.42653,ZP>, +<-0.14736,0.43977,ZP>, +<-0.14707,0.45276,ZP>, +<-0.14714,0.46584,0.66018>, +<-0.14694,0.47813,0.65069>, +<-0.14304,0.47911,0.63785>, +<-0.13865,0.48040,0.62551>, +<-0.13500,0.48300,0.61272>, +<-0.13206,0.48659,0.60047>, +<-0.12998,0.49073,0.58807>, +<-0.12754,0.49396,0.57616>, +<-0.12467,0.49711,0.56386> +<-0.10977,-0.49675,0.56702>, +<-0.11346,-0.49585,0.57922>, +<-0.11724,-0.49441,0.59144>, +<-0.12098,-0.49223,0.60397>, +<-0.12445,-0.48948,0.61650>, +<-0.12748,-0.48518,0.62915>, +<-0.13079,-0.48259,0.64149>, +<-0.13386,-0.48047,0.65549>, +<-0.13338,-0.46586,0.66007>, +<-0.13356,-0.45302,ZP>, +<-0.13378,-0.43980,ZP>, +<-0.13382,-0.42668,ZP>, +<-0.13389,-0.41361,ZP>, +<-0.13391,-0.40055,ZP>, +<-0.13391,-0.38754,ZP>, +<-0.13390,-0.37457,ZP>, +<-0.13386,-0.36163,ZP>, +<-0.13380,-0.34873,ZP>, +<-0.13373,-0.33585,ZP>, +<-0.13364,-0.32300,ZP>, +<-0.13354,-0.31017,ZP>, +<-0.13343,-0.29736,ZP>, +<-0.13331,-0.28456,ZP>, +<-0.13319,-0.27179,ZP>, +<-0.13308,-0.25903,ZP>, +<-0.13296,-0.24629,ZP>, +<-0.13285,-0.23356,ZP>, +<-0.13275,-0.22085,ZP>, +<-0.13266,-0.20816,ZP>, +<-0.13257,-0.19548,ZP>, +<-0.13249,-0.18281,ZP>, +<-0.13242,-0.17015,ZP>, +<-0.13235,-0.15751,ZP>, +<-0.13229,-0.14487,ZP>, +<-0.13224,-0.13224,ZP>, +<-0.13219,-0.11963,ZP>, +<-0.13215,-0.10701,ZP>, +<-0.13211,-0.09441,ZP>, +<-0.13208,-0.08181,ZP>, +<-0.13206,-0.06922,ZP>, +<-0.13204,-0.05663,ZP>, +<-0.13202,-0.04404,ZP>, +<-0.13201,-0.03146,ZP>, +<-0.13200,-0.01887,ZP>, +<-0.13200,-0.00629,ZP>, +<-0.13200,0.00629,ZP>, +<-0.13200,0.01887,ZP>, +<-0.13201,0.03145,ZP>, +<-0.13202,0.04403,ZP>, +<-0.13204,0.05662,ZP>, +<-0.13205,0.06921,ZP>, +<-0.13208,0.08180,ZP>, +<-0.13211,0.09440,ZP>, +<-0.13214,0.10700,ZP>, +<-0.13218,0.11961,ZP>, +<-0.13222,0.13222,ZP>, +<-0.13227,0.14484,ZP>, +<-0.13233,0.15747,ZP>, +<-0.13239,0.17011,ZP>, +<-0.13246,0.18276,ZP>, +<-0.13253,0.19542,ZP>, +<-0.13262,0.20809,ZP>, +<-0.13271,0.22078,ZP>, +<-0.13281,0.23348,ZP>, +<-0.13292,0.24619,ZP>, +<-0.13304,0.25892,ZP>, +<-0.13316,0.27166,ZP>, +<-0.13328,0.28442,ZP>, +<-0.13341,0.29720,ZP>, +<-0.13354,0.30999,ZP>, +<-0.13367,0.32279,ZP>, +<-0.13380,0.33562,ZP>, +<-0.13392,0.34847,ZP>, +<-0.13403,0.36134,ZP>, +<-0.13413,0.37423,ZP>, +<-0.13422,0.38716,ZP>, +<-0.13429,0.40013,ZP>, +<-0.13436,0.41315,ZP>, +<-0.13438,0.42619,ZP>, +<-0.13442,0.43927,ZP>, +<-0.13429,0.45246,ZP>, +<-0.13415,0.46525,ZP>, +<-0.13468,0.47990,0.65599>, +<-0.13169,0.48235,0.64192>, +<-0.12831,0.48492,0.62976>, +<-0.12617,0.49024,0.61725>, +<-0.12349,0.49427,0.60499>, +<-0.12072,0.49793,0.59254>, +<-0.11756,0.50096,0.58043>, +<-0.11446,0.50365,0.56814> +<-0.10045,-0.48797,0.56933>, +<-0.10351,-0.48794,0.58166>, +<-0.10657,-0.48820,0.59413>, +<-0.10959,-0.48816,0.60680>, +<-0.11266,-0.48814,0.61963>, +<-0.11587,-0.48640,0.63260>, +<-0.11909,-0.48565,0.64519>, +<-0.12089,-0.47984,0.65914>, +<-0.12051,-0.46547,ZP>, +<-0.12084,-0.45272,ZP>, +<-0.12089,-0.43941,ZP>, +<-0.12100,-0.42637,ZP>, +<-0.12106,-0.41330,ZP>, +<-0.12108,-0.40026,ZP>, +<-0.12109,-0.38727,ZP>, +<-0.12107,-0.37431,ZP>, +<-0.12103,-0.36139,ZP>, +<-0.12098,-0.34849,ZP>, +<-0.12092,-0.33563,ZP>, +<-0.12084,-0.32279,ZP>, +<-0.12075,-0.30997,ZP>, +<-0.12066,-0.29718,ZP>, +<-0.12056,-0.28440,ZP>, +<-0.12046,-0.27164,ZP>, +<-0.12035,-0.25889,ZP>, +<-0.12026,-0.24616,ZP>, +<-0.12016,-0.23345,ZP>, +<-0.12007,-0.22075,ZP>, +<-0.11999,-0.20807,ZP>, +<-0.11991,-0.19539,ZP>, +<-0.11984,-0.18273,ZP>, +<-0.11978,-0.17008,ZP>, +<-0.11972,-0.15745,ZP>, +<-0.11967,-0.14482,ZP>, +<-0.11962,-0.13220,ZP>, +<-0.11958,-0.11959,ZP>, +<-0.11955,-0.10698,ZP>, +<-0.11951,-0.09438,ZP>, +<-0.11949,-0.08179,ZP>, +<-0.11947,-0.06920,ZP>, +<-0.11945,-0.05661,ZP>, +<-0.11943,-0.04403,ZP>, +<-0.11942,-0.03145,ZP>, +<-0.11942,-0.01887,ZP>, +<-0.11941,-0.00629,ZP>, +<-0.11941,0.00629,ZP>, +<-0.11942,0.01886,ZP>, +<-0.11942,0.03144,ZP>, +<-0.11943,0.04402,ZP>, +<-0.11944,0.05660,ZP>, +<-0.11946,0.06919,ZP>, +<-0.11948,0.08178,ZP>, +<-0.11951,0.09437,ZP>, +<-0.11953,0.10697,ZP>, +<-0.11957,0.11957,ZP>, +<-0.11961,0.13218,ZP>, +<-0.11965,0.14479,ZP>, +<-0.11970,0.15742,ZP>, +<-0.11975,0.17005,ZP>, +<-0.11981,0.18269,ZP>, +<-0.11988,0.19534,ZP>, +<-0.11995,0.20801,ZP>, +<-0.12004,0.22068,ZP>, +<-0.12012,0.23337,ZP>, +<-0.12022,0.24607,ZP>, +<-0.12032,0.25879,ZP>, +<-0.12043,0.27152,ZP>, +<-0.12054,0.28427,ZP>, +<-0.12065,0.29703,ZP>, +<-0.12076,0.30980,ZP>, +<-0.12088,0.32260,ZP>, +<-0.12099,0.33541,ZP>, +<-0.12109,0.34825,ZP>, +<-0.12120,0.36111,ZP>, +<-0.12129,0.37399,ZP>, +<-0.12138,0.38691,ZP>, +<-0.12146,0.39987,ZP>, +<-0.12153,0.41286,ZP>, +<-0.12156,0.42588,ZP>, +<-0.12153,0.43888,ZP>, +<-0.12157,0.45214,ZP>, +<-0.12128,0.46487,ZP>, +<-0.12165,0.47907,0.65940>, +<-0.12003,0.48541,0.64570>, +<-0.11709,0.48758,0.63325>, +<-0.11468,0.49275,0.62090>, +<-0.11168,0.49599,0.60835>, +<-0.10848,0.49865,0.59572>, +<-0.10510,0.50048,0.58333>, +<-0.10187,0.50179,0.57086> +<-0.08792,-0.48681,0.57271>, +<-0.09128,-0.48675,0.58514>, +<-0.09458,-0.48710,0.59758>, +<-0.09820,-0.49030,0.61025>, +<-0.10111,-0.48968,0.62310>, +<-0.10428,-0.48902,0.63580>, +<-0.10715,-0.48850,0.64860>, +<-0.10775,-0.47852,0.66022>, +<-0.10767,-0.46521,ZP>, +<-0.10807,-0.45234,ZP>, +<-0.10806,-0.43911,ZP>, +<-0.10819,-0.42607,ZP>, +<-0.10824,-0.41301,ZP>, +<-0.10827,-0.40000,ZP>, +<-0.10828,-0.38703,ZP>, +<-0.10826,-0.37408,ZP>, +<-0.10823,-0.36117,ZP>, +<-0.10819,-0.34829,ZP>, +<-0.10813,-0.33544,ZP>, +<-0.10806,-0.32261,ZP>, +<-0.10799,-0.30980,ZP>, +<-0.10791,-0.29702,ZP>, +<-0.10782,-0.28425,ZP>, +<-0.10773,-0.27150,ZP>, +<-0.10765,-0.25877,ZP>, +<-0.10756,-0.24605,ZP>, +<-0.10748,-0.23335,ZP>, +<-0.10740,-0.22066,ZP>, +<-0.10733,-0.20798,ZP>, +<-0.10727,-0.19532,ZP>, +<-0.10720,-0.18267,ZP>, +<-0.10715,-0.17003,ZP>, +<-0.10710,-0.15739,ZP>, +<-0.10705,-0.14477,ZP>, +<-0.10701,-0.13216,ZP>, +<-0.10698,-0.11955,ZP>, +<-0.10695,-0.10695,ZP>, +<-0.10692,-0.09435,ZP>, +<-0.10690,-0.08176,ZP>, +<-0.10688,-0.06918,ZP>, +<-0.10686,-0.05660,ZP>, +<-0.10685,-0.04402,ZP>, +<-0.10684,-0.03144,ZP>, +<-0.10684,-0.01886,ZP>, +<-0.10683,-0.00629,ZP>, +<-0.10683,0.00629,ZP>, +<-0.10683,0.01886,ZP>, +<-0.10684,0.03144,ZP>, +<-0.10685,0.04401,ZP>, +<-0.10686,0.05659,ZP>, +<-0.10687,0.06917,ZP>, +<-0.10689,0.08176,ZP>, +<-0.10691,0.09434,ZP>, +<-0.10694,0.10694,ZP>, +<-0.10697,0.11953,ZP>, +<-0.10700,0.13214,ZP>, +<-0.10704,0.14475,ZP>, +<-0.10708,0.15737,ZP>, +<-0.10713,0.16999,ZP>, +<-0.10718,0.18263,ZP>, +<-0.10724,0.19527,ZP>, +<-0.10730,0.20793,ZP>, +<-0.10737,0.22060,ZP>, +<-0.10745,0.23328,ZP>, +<-0.10753,0.24597,ZP>, +<-0.10762,0.25867,ZP>, +<-0.10771,0.27139,ZP>, +<-0.10780,0.28413,ZP>, +<-0.10790,0.29688,ZP>, +<-0.10800,0.30964,ZP>, +<-0.10810,0.32243,ZP>, +<-0.10820,0.33523,ZP>, +<-0.10830,0.34806,ZP>, +<-0.10839,0.36091,ZP>, +<-0.10848,0.37379,ZP>, +<-0.10856,0.38669,ZP>, +<-0.10864,0.39963,ZP>, +<-0.10869,0.41259,ZP>, +<-0.10873,0.42560,ZP>, +<-0.10870,0.43859,ZP>, +<-0.10878,0.45177,ZP>, +<-0.10845,0.46463,ZP>, +<-0.10858,0.47784,0.66021>, +<-0.10813,0.48829,0.64909>, +<-0.10539,0.48883,0.63611>, +<-0.10271,0.49207,0.62360>, +<-0.10003,0.49254,0.61067>, +<-0.09754,0.49280,0.59791>, +<-0.09505,0.49278,0.58522>, +<-0.09251,0.49295,0.57263> +<-0.07733,-0.49349,0.57531>, +<-0.08025,-0.49249,0.58781>, +<-0.08379,-0.49294,0.60031>, +<-0.08671,-0.49244,0.61302>, +<-0.08948,-0.49194,0.62605>, +<-0.09242,-0.49139,0.63860>, +<-0.09496,-0.49093,0.65199>, +<-0.09487,-0.47800,0.66011>, +<-0.09490,-0.46505,ZP>, +<-0.09523,-0.45193,ZP>, +<-0.09528,-0.43883,ZP>, +<-0.09540,-0.42579,ZP>, +<-0.09544,-0.41275,ZP>, +<-0.09548,-0.39976,ZP>, +<-0.09549,-0.38680,ZP>, +<-0.09548,-0.37388,ZP>, +<-0.09545,-0.36098,ZP>, +<-0.09541,-0.34811,ZP>, +<-0.09536,-0.33527,ZP>, +<-0.09530,-0.32245,ZP>, +<-0.09524,-0.30966,ZP>, +<-0.09517,-0.29688,ZP>, +<-0.09510,-0.28413,ZP>, +<-0.09503,-0.27139,ZP>, +<-0.09495,-0.25866,ZP>, +<-0.09488,-0.24595,ZP>, +<-0.09481,-0.23326,ZP>, +<-0.09475,-0.22058,ZP>, +<-0.09468,-0.20791,ZP>, +<-0.09463,-0.19526,ZP>, +<-0.09457,-0.18261,ZP>, +<-0.09453,-0.16997,ZP>, +<-0.09448,-0.15735,ZP>, +<-0.09444,-0.14473,ZP>, +<-0.09441,-0.13212,ZP>, +<-0.09438,-0.11952,ZP>, +<-0.09435,-0.10692,ZP>, +<-0.09433,-0.09433,ZP>, +<-0.09431,-0.08175,ZP>, +<-0.09429,-0.06916,ZP>, +<-0.09428,-0.05658,ZP>, +<-0.09427,-0.04401,ZP>, +<-0.09426,-0.03143,ZP>, +<-0.09426,-0.01886,ZP>, +<-0.09426,-0.00629,ZP>, +<-0.09426,0.00628,ZP>, +<-0.09426,0.01886,ZP>, +<-0.09426,0.03143,ZP>, +<-0.09427,0.04400,ZP>, +<-0.09428,0.05658,ZP>, +<-0.09429,0.06916,ZP>, +<-0.09431,0.08174,ZP>, +<-0.09432,0.09432,ZP>, +<-0.09434,0.10691,ZP>, +<-0.09437,0.11951,ZP>, +<-0.09440,0.13210,ZP>, +<-0.09443,0.14471,ZP>, +<-0.09446,0.15732,ZP>, +<-0.09451,0.16994,ZP>, +<-0.09455,0.18257,ZP>, +<-0.09460,0.19521,ZP>, +<-0.09466,0.20786,ZP>, +<-0.09472,0.22052,ZP>, +<-0.09478,0.23319,ZP>, +<-0.09485,0.24588,ZP>, +<-0.09492,0.25858,ZP>, +<-0.09500,0.27129,ZP>, +<-0.09508,0.28401,ZP>, +<-0.09517,0.29675,ZP>, +<-0.09526,0.30951,ZP>, +<-0.09534,0.32228,ZP>, +<-0.09543,0.33508,ZP>, +<-0.09552,0.34790,ZP>, +<-0.09561,0.36074,ZP>, +<-0.09569,0.37361,ZP>, +<-0.09577,0.38650,ZP>, +<-0.09583,0.39942,ZP>, +<-0.09588,0.41237,ZP>, +<-0.09593,0.42535,ZP>, +<-0.09590,0.43835,ZP>, +<-0.09593,0.45139,ZP>, +<-0.09570,0.46450,ZP>, +<-0.09575,0.47741,0.66010>, +<-0.09591,0.49063,0.65253>, +<-0.09346,0.49119,0.63894>, +<-0.09073,0.49170,0.62649>, +<-0.08832,0.49216,0.61347>, +<-0.08582,0.49262,0.60077>, +<-0.08302,0.49016,0.58815>, +<-0.08042,0.49019,0.57560> +<-0.07158,-0.50487,0.57772>, +<-0.07319,-0.50292,0.59029>, +<-0.07455,-0.50042,0.60294>, +<-0.07613,-0.49768,0.61566>, +<-0.07786,-0.49459,0.62870>, +<-0.08035,-0.49372,0.64118>, +<-0.08235,-0.49198,0.65530>, +<-0.08210,-0.47764,ZP>, +<-0.08223,-0.46491,ZP>, +<-0.08242,-0.45159,ZP>, +<-0.08251,-0.43858,ZP>, +<-0.08262,-0.42553,ZP>, +<-0.08267,-0.41252,ZP>, +<-0.08270,-0.39955,ZP>, +<-0.08271,-0.38661,ZP>, +<-0.08271,-0.37369,ZP>, +<-0.08269,-0.36081,ZP>, +<-0.08265,-0.34796,ZP>, +<-0.08261,-0.33513,ZP>, +<-0.08256,-0.32232,ZP>, +<-0.08251,-0.30953,ZP>, +<-0.08245,-0.29677,ZP>, +<-0.08239,-0.28402,ZP>, +<-0.08233,-0.27129,ZP>, +<-0.08227,-0.25857,ZP>, +<-0.08221,-0.24587,ZP>, +<-0.08215,-0.23318,ZP>, +<-0.08210,-0.22051,ZP>, +<-0.08204,-0.20785,ZP>, +<-0.08200,-0.19520,ZP>, +<-0.08195,-0.18256,ZP>, +<-0.08191,-0.16993,ZP>, +<-0.08187,-0.15731,ZP>, +<-0.08184,-0.14470,ZP>, +<-0.08181,-0.13209,ZP>, +<-0.08179,-0.11949,ZP>, +<-0.08176,-0.10690,ZP>, +<-0.08175,-0.09431,ZP>, +<-0.08173,-0.08173,ZP>, +<-0.08172,-0.06915,ZP>, +<-0.08170,-0.05657,ZP>, +<-0.08170,-0.04400,ZP>, +<-0.08169,-0.03143,ZP>, +<-0.08168,-0.01886,ZP>, +<-0.08168,-0.00629,ZP>, +<-0.08168,0.00628,ZP>, +<-0.08168,0.01885,ZP>, +<-0.08169,0.03142,ZP>, +<-0.08169,0.04400,ZP>, +<-0.08170,0.05657,ZP>, +<-0.08171,0.06914,ZP>, +<-0.08172,0.08172,ZP>, +<-0.08174,0.09430,ZP>, +<-0.08176,0.10689,ZP>, +<-0.08178,0.11948,ZP>, +<-0.08180,0.13208,ZP>, +<-0.08183,0.14468,ZP>, +<-0.08186,0.15729,ZP>, +<-0.08189,0.16990,ZP>, +<-0.08193,0.18253,ZP>, +<-0.08197,0.19516,ZP>, +<-0.08202,0.20780,ZP>, +<-0.08207,0.22046,ZP>, +<-0.08212,0.23312,ZP>, +<-0.08218,0.24580,ZP>, +<-0.08225,0.25849,ZP>, +<-0.08231,0.27119,ZP>, +<-0.08238,0.28391,ZP>, +<-0.08245,0.29664,ZP>, +<-0.08253,0.30939,ZP>, +<-0.08260,0.32216,ZP>, +<-0.08268,0.33495,ZP>, +<-0.08276,0.34776,ZP>, +<-0.08284,0.36059,ZP>, +<-0.08291,0.37345,ZP>, +<-0.08298,0.38633,ZP>, +<-0.08304,0.39924,ZP>, +<-0.08309,0.41218,ZP>, +<-0.08313,0.42513,ZP>, +<-0.08311,0.43814,ZP>, +<-0.08311,0.45110,ZP>, +<-0.08303,0.46439,ZP>, +<-0.08298,0.47706,ZP>, +<-0.08331,0.49152,0.65578>, +<-0.08139,0.49333,0.64152>, +<-0.07893,0.49374,0.62913>, +<-0.07653,0.49412,0.61592>, +<-0.07398,0.49451,0.60312>, +<-0.07116,0.49430,0.59049>, +<-0.06864,0.49515,0.57801> +<-0.06005,-0.51011,0.58040>, +<-0.06180,-0.50799,0.59308>, +<-0.06346,-0.50522,0.60567>, +<-0.06500,-0.50207,0.61834>, +<-0.06631,-0.49748,0.63115>, +<-0.06809,-0.49543,0.64350>, +<-0.06950,-0.49185,0.65780>, +<-0.06936,-0.47730,ZP>, +<-0.06959,-0.46470,ZP>, +<-0.06967,-0.45132,ZP>, +<-0.06977,-0.43835,ZP>, +<-0.06985,-0.42529,ZP>, +<-0.06991,-0.41231,ZP>, +<-0.06994,-0.39936,ZP>, +<-0.06995,-0.38643,ZP>, +<-0.06995,-0.37354,ZP>, +<-0.06993,-0.36067,ZP>, +<-0.06991,-0.34782,ZP>, +<-0.06987,-0.33500,ZP>, +<-0.06983,-0.32221,ZP>, +<-0.06979,-0.30943,ZP>, +<-0.06974,-0.29667,ZP>, +<-0.06970,-0.28393,ZP>, +<-0.06965,-0.27120,ZP>, +<-0.06960,-0.25850,ZP>, +<-0.06955,-0.24580,ZP>, +<-0.06950,-0.23312,ZP>, +<-0.06945,-0.22045,ZP>, +<-0.06941,-0.20780,ZP>, +<-0.06937,-0.19515,ZP>, +<-0.06933,-0.18252,ZP>, +<-0.06930,-0.16989,ZP>, +<-0.06927,-0.15728,ZP>, +<-0.06924,-0.14467,ZP>, +<-0.06922,-0.13207,ZP>, +<-0.06920,-0.11947,ZP>, +<-0.06918,-0.10688,ZP>, +<-0.06916,-0.09430,ZP>, +<-0.06915,-0.08172,ZP>, +<-0.06914,-0.06914,ZP>, +<-0.06913,-0.05656,ZP>, +<-0.06912,-0.04399,ZP>, +<-0.06912,-0.03142,ZP>, +<-0.06911,-0.01885,ZP>, +<-0.06911,-0.00628,ZP>, +<-0.06911,0.00628,ZP>, +<-0.06911,0.01885,ZP>, +<-0.06912,0.03142,ZP>, +<-0.06912,0.04399,ZP>, +<-0.06913,0.05656,ZP>, +<-0.06913,0.06913,ZP>, +<-0.06915,0.08171,ZP>, +<-0.06916,0.09429,ZP>, +<-0.06917,0.10687,ZP>, +<-0.06919,0.11946,ZP>, +<-0.06921,0.13205,ZP>, +<-0.06923,0.14465,ZP>, +<-0.06926,0.15726,ZP>, +<-0.06928,0.16987,ZP>, +<-0.06932,0.18249,ZP>, +<-0.06935,0.19512,ZP>, +<-0.06939,0.20776,ZP>, +<-0.06943,0.22041,ZP>, +<-0.06947,0.23306,ZP>, +<-0.06952,0.24574,ZP>, +<-0.06958,0.25842,ZP>, +<-0.06963,0.27112,ZP>, +<-0.06969,0.28383,ZP>, +<-0.06975,0.29656,ZP>, +<-0.06981,0.30930,ZP>, +<-0.06988,0.32206,ZP>, +<-0.06995,0.33484,ZP>, +<-0.07002,0.34765,ZP>, +<-0.07009,0.36047,ZP>, +<-0.07015,0.37332,ZP>, +<-0.07021,0.38619,ZP>, +<-0.07027,0.39909,ZP>, +<-0.07031,0.41201,ZP>, +<-0.07034,0.42495,ZP>, +<-0.07034,0.43796,ZP>, +<-0.07033,0.45090,ZP>, +<-0.07037,0.46422,ZP>, +<-0.07021,0.47676,ZP>, +<-0.07043,0.49122,0.65820>, +<-0.06911,0.49521,0.64394>, +<-0.06704,0.49549,0.63133>, +<-0.06562,0.49876,0.61825>, +<-0.06433,0.50151,0.60544>, +<-0.06323,0.50431,0.59277>, +<-0.06192,0.50622,0.58018> +<-0.04767,-0.50707,0.58132>, +<-0.04941,-0.50584,0.59413>, +<-0.05125,-0.50372,0.60685>, +<-0.05286,-0.50148,0.61976>, +<-0.05426,-0.49706,0.63267>, +<-0.05571,-0.49691,0.64547>, +<-0.05661,-0.49117,0.65928>, +<-0.05659,-0.47696,ZP>, +<-0.05689,-0.46439,ZP>, +<-0.05693,-0.45108,ZP>, +<-0.05704,-0.43813,ZP>, +<-0.05710,-0.42508,ZP>, +<-0.05715,-0.41213,ZP>, +<-0.05719,-0.39919,ZP>, +<-0.05720,-0.38628,ZP>, +<-0.05720,-0.37340,ZP>, +<-0.05719,-0.36054,ZP>, +<-0.05717,-0.34771,ZP>, +<-0.05715,-0.33490,ZP>, +<-0.05712,-0.32211,ZP>, +<-0.05708,-0.30934,ZP>, +<-0.05705,-0.29659,ZP>, +<-0.05701,-0.28385,ZP>, +<-0.05697,-0.27114,ZP>, +<-0.05693,-0.25843,ZP>, +<-0.05689,-0.24574,ZP>, +<-0.05686,-0.23307,ZP>, +<-0.05682,-0.22040,ZP>, +<-0.05678,-0.20775,ZP>, +<-0.05675,-0.19511,ZP>, +<-0.05672,-0.18248,ZP>, +<-0.05670,-0.16986,ZP>, +<-0.05667,-0.15725,ZP>, +<-0.05665,-0.14464,ZP>, +<-0.05663,-0.13205,ZP>, +<-0.05661,-0.11945,ZP>, +<-0.05660,-0.10687,ZP>, +<-0.05659,-0.09428,ZP>, +<-0.05657,-0.08170,ZP>, +<-0.05656,-0.06913,ZP>, +<-0.05656,-0.05656,ZP>, +<-0.05655,-0.04399,ZP>, +<-0.05655,-0.03142,ZP>, +<-0.05654,-0.01885,ZP>, +<-0.05654,-0.00628,ZP>, +<-0.05654,0.00628,ZP>, +<-0.05654,0.01885,ZP>, +<-0.05655,0.03142,ZP>, +<-0.05655,0.04398,ZP>, +<-0.05656,0.05655,ZP>, +<-0.05656,0.06912,ZP>, +<-0.05657,0.08170,ZP>, +<-0.05658,0.09428,ZP>, +<-0.05659,0.10686,ZP>, +<-0.05660,0.11944,ZP>, +<-0.05662,0.13203,ZP>, +<-0.05664,0.14463,ZP>, +<-0.05666,0.15723,ZP>, +<-0.05668,0.16984,ZP>, +<-0.05671,0.18246,ZP>, +<-0.05673,0.19508,ZP>, +<-0.05676,0.20772,ZP>, +<-0.05680,0.22036,ZP>, +<-0.05683,0.23302,ZP>, +<-0.05687,0.24568,ZP>, +<-0.05691,0.25836,ZP>, +<-0.05696,0.27106,ZP>, +<-0.05701,0.28376,ZP>, +<-0.05706,0.29649,ZP>, +<-0.05711,0.30923,ZP>, +<-0.05717,0.32198,ZP>, +<-0.05723,0.33476,ZP>, +<-0.05728,0.34755,ZP>, +<-0.05734,0.36037,ZP>, +<-0.05740,0.37321,ZP>, +<-0.05746,0.38607,ZP>, +<-0.05750,0.39896,ZP>, +<-0.05754,0.41188,ZP>, +<-0.05757,0.42480,ZP>, +<-0.05759,0.43781,ZP>, +<-0.05757,0.45073,ZP>, +<-0.05762,0.46397,ZP>, +<-0.05740,0.47651,ZP>, +<-0.05749,0.49054,0.65950>, +<-0.05674,0.49679,0.64593>, +<-0.05531,0.49765,0.63325>, +<-0.05435,0.50279,0.62055>, +<-0.05314,0.50619,0.60793>, +<-0.05174,0.50898,0.59521>, +<-0.05021,0.51123,0.58267> +<-0.03844,-0.49817,0.58190>, +<-0.03935,-0.49806,0.59474>, +<-0.04014,-0.49839,0.60765>, +<-0.04102,-0.49835,0.62070>, +<-0.04216,-0.49824,0.63407>, +<-0.04328,-0.49818,0.64697>, +<-0.04377,-0.49047,0.65996>, +<-0.04383,-0.47669,ZP>, +<-0.04414,-0.46405,ZP>, +<-0.04420,-0.45085,ZP>, +<-0.04431,-0.43792,ZP>, +<-0.04436,-0.42490,ZP>, +<-0.04441,-0.41197,ZP>, +<-0.04444,-0.39904,ZP>, +<-0.04445,-0.38615,ZP>, +<-0.04446,-0.37329,ZP>, +<-0.04445,-0.36044,ZP>, +<-0.04444,-0.34762,ZP>, +<-0.04443,-0.33482,ZP>, +<-0.04441,-0.32204,ZP>, +<-0.04439,-0.30927,ZP>, +<-0.04436,-0.29652,ZP>, +<-0.04433,-0.28379,ZP>, +<-0.04430,-0.27108,ZP>, +<-0.04428,-0.25838,ZP>, +<-0.04425,-0.24570,ZP>, +<-0.04422,-0.23303,ZP>, +<-0.04419,-0.22037,ZP>, +<-0.04416,-0.20772,ZP>, +<-0.04414,-0.19508,ZP>, +<-0.04412,-0.18246,ZP>, +<-0.04409,-0.16984,ZP>, +<-0.04408,-0.15723,ZP>, +<-0.04406,-0.14463,ZP>, +<-0.04404,-0.13203,ZP>, +<-0.04403,-0.11944,ZP>, +<-0.04402,-0.10685,ZP>, +<-0.04401,-0.09427,ZP>, +<-0.04400,-0.08170,ZP>, +<-0.04399,-0.06912,ZP>, +<-0.04399,-0.05655,ZP>, +<-0.04398,-0.04398,ZP>, +<-0.04398,-0.03141,ZP>, +<-0.04398,-0.01885,ZP>, +<-0.04398,-0.00628,ZP>, +<-0.04398,0.00628,ZP>, +<-0.04398,0.01885,ZP>, +<-0.04398,0.03141,ZP>, +<-0.04398,0.04398,ZP>, +<-0.04399,0.05655,ZP>, +<-0.04399,0.06912,ZP>, +<-0.04400,0.08169,ZP>, +<-0.04400,0.09427,ZP>, +<-0.04401,0.10685,ZP>, +<-0.04402,0.11943,ZP>, +<-0.04404,0.13202,ZP>, +<-0.04405,0.14461,ZP>, +<-0.04406,0.15721,ZP>, +<-0.04408,0.16982,ZP>, +<-0.04410,0.18243,ZP>, +<-0.04412,0.19505,ZP>, +<-0.04414,0.20769,ZP>, +<-0.04417,0.22033,ZP>, +<-0.04420,0.23298,ZP>, +<-0.04423,0.24564,ZP>, +<-0.04426,0.25832,ZP>, +<-0.04429,0.27101,ZP>, +<-0.04433,0.28371,ZP>, +<-0.04437,0.29643,ZP>, +<-0.04442,0.30917,ZP>, +<-0.04446,0.32192,ZP>, +<-0.04451,0.33469,ZP>, +<-0.04456,0.34748,ZP>, +<-0.04461,0.36029,ZP>, +<-0.04466,0.37312,ZP>, +<-0.04471,0.38598,ZP>, +<-0.04475,0.39886,ZP>, +<-0.04479,0.41177,ZP>, +<-0.04481,0.42469,ZP>, +<-0.04483,0.43768,ZP>, +<-0.04479,0.45058,ZP>, +<-0.04481,0.46372,ZP>, +<-0.04459,0.47635,ZP>, +<-0.04460,0.48998,ZP>, +<-0.04424,0.49810,0.64739>, +<-0.04320,0.49814,0.63445>, +<-0.04217,0.50208,0.62155>, +<-0.04093,0.50432,0.60874>, +<-0.03955,0.50663,0.59592>, +<-0.03808,0.50788,0.58309> +<-0.02601,-0.49535,0.58313>, +<-0.02699,-0.49568,0.59601>, +<-0.02811,-0.49925,0.60882>, +<-0.02900,-0.49917,0.62188>, +<-0.02996,-0.49913,0.63509>, +<-0.03078,-0.49915,0.64809>, +<-0.03100,-0.48995,0.66017>, +<-0.03109,-0.47649,ZP>, +<-0.03137,-0.46374,ZP>, +<-0.03145,-0.45065,ZP>, +<-0.03156,-0.43773,ZP>, +<-0.03161,-0.42475,ZP>, +<-0.03166,-0.41183,ZP>, +<-0.03169,-0.39893,ZP>, +<-0.03170,-0.38605,ZP>, +<-0.03172,-0.37320,ZP>, +<-0.03172,-0.36037,ZP>, +<-0.03172,-0.34755,ZP>, +<-0.03171,-0.33476,ZP>, +<-0.03171,-0.32198,ZP>, +<-0.03169,-0.30922,ZP>, +<-0.03168,-0.29648,ZP>, +<-0.03166,-0.28375,ZP>, +<-0.03164,-0.27104,ZP>, +<-0.03162,-0.25834,ZP>, +<-0.03160,-0.24566,ZP>, +<-0.03158,-0.23299,ZP>, +<-0.03156,-0.22034,ZP>, +<-0.03155,-0.20769,ZP>, +<-0.03153,-0.19506,ZP>, +<-0.03151,-0.18243,ZP>, +<-0.03150,-0.16982,ZP>, +<-0.03148,-0.15721,ZP>, +<-0.03147,-0.14461,ZP>, +<-0.03146,-0.13202,ZP>, +<-0.03145,-0.11943,ZP>, +<-0.03144,-0.10684,ZP>, +<-0.03143,-0.09427,ZP>, +<-0.03143,-0.08169,ZP>, +<-0.03142,-0.06912,ZP>, +<-0.03142,-0.05655,ZP>, +<-0.03142,-0.04398,ZP>, +<-0.03141,-0.03141,ZP>, +<-0.03141,-0.01885,ZP>, +<-0.03141,-0.00628,ZP>, +<-0.03141,0.00628,ZP>, +<-0.03141,0.01885,ZP>, +<-0.03141,0.03141,ZP>, +<-0.03141,0.04398,ZP>, +<-0.03142,0.05654,ZP>, +<-0.03142,0.06911,ZP>, +<-0.03143,0.08168,ZP>, +<-0.03143,0.09426,ZP>, +<-0.03144,0.10684,ZP>, +<-0.03144,0.11942,ZP>, +<-0.03145,0.13201,ZP>, +<-0.03146,0.14460,ZP>, +<-0.03147,0.15720,ZP>, +<-0.03148,0.16980,ZP>, +<-0.03150,0.18241,ZP>, +<-0.03151,0.19503,ZP>, +<-0.03153,0.20766,ZP>, +<-0.03155,0.22030,ZP>, +<-0.03157,0.23295,ZP>, +<-0.03159,0.24561,ZP>, +<-0.03161,0.25829,ZP>, +<-0.03164,0.27097,ZP>, +<-0.03166,0.28368,ZP>, +<-0.03169,0.29639,ZP>, +<-0.03173,0.30912,ZP>, +<-0.03176,0.32187,ZP>, +<-0.03180,0.33464,ZP>, +<-0.03184,0.34743,ZP>, +<-0.03188,0.36023,ZP>, +<-0.03193,0.37306,ZP>, +<-0.03197,0.38591,ZP>, +<-0.03200,0.39878,ZP>, +<-0.03204,0.41168,ZP>, +<-0.03205,0.42459,ZP>, +<-0.03206,0.43756,ZP>, +<-0.03202,0.45047,ZP>, +<-0.03199,0.46353,ZP>, +<-0.03180,0.47629,ZP>, +<-0.03180,0.48965,0.66018>, +<-0.03166,0.49909,0.64839>, +<-0.03096,0.49906,0.63536>, +<-0.03027,0.49909,0.62214>, +<-0.02983,0.49913,0.60907>, +<-0.02961,0.49822,0.59628>, +<-0.02903,0.49811,0.58361> +<-0.01411,-0.49971,0.58374>, +<-0.01486,-0.49942,0.59653>, +<-0.01604,-0.49975,0.60942>, +<-0.01691,-0.49972,0.62250>, +<-0.01768,-0.49971,0.63571>, +<-0.01823,-0.49979,0.64885>, +<-0.01832,-0.48964,0.66019>, +<-0.01840,-0.47637,ZP>, +<-0.01861,-0.46351,ZP>, +<-0.01870,-0.45047,ZP>, +<-0.01880,-0.43756,ZP>, +<-0.01886,-0.42462,ZP>, +<-0.01890,-0.41172,ZP>, +<-0.01893,-0.39884,ZP>, +<-0.01896,-0.38598,ZP>, +<-0.01897,-0.37313,ZP>, +<-0.01899,-0.36031,ZP>, +<-0.01900,-0.34750,ZP>, +<-0.01901,-0.33471,ZP>, +<-0.01901,-0.32194,ZP>, +<-0.01901,-0.30918,ZP>, +<-0.01900,-0.29644,ZP>, +<-0.01900,-0.28372,ZP>, +<-0.01899,-0.27101,ZP>, +<-0.01898,-0.25831,ZP>, +<-0.01897,-0.24564,ZP>, +<-0.01895,-0.23297,ZP>, +<-0.01894,-0.22032,ZP>, +<-0.01893,-0.20767,ZP>, +<-0.01892,-0.19504,ZP>, +<-0.01891,-0.18242,ZP>, +<-0.01890,-0.16981,ZP>, +<-0.01889,-0.15720,ZP>, +<-0.01888,-0.14460,ZP>, +<-0.01888,-0.13201,ZP>, +<-0.01887,-0.11942,ZP>, +<-0.01887,-0.10684,ZP>, +<-0.01886,-0.09426,ZP>, +<-0.01886,-0.08168,ZP>, +<-0.01885,-0.06911,ZP>, +<-0.01885,-0.05654,ZP>, +<-0.01885,-0.04398,ZP>, +<-0.01885,-0.03141,ZP>, +<-0.01885,-0.01885,ZP>, +<-0.01885,-0.00628,ZP>, +<-0.01885,0.00628,ZP>, +<-0.01885,0.01884,ZP>, +<-0.01885,0.03141,ZP>, +<-0.01885,0.04397,ZP>, +<-0.01885,0.05654,ZP>, +<-0.01885,0.06911,ZP>, +<-0.01886,0.08168,ZP>, +<-0.01886,0.09425,ZP>, +<-0.01886,0.10683,ZP>, +<-0.01887,0.11941,ZP>, +<-0.01887,0.13200,ZP>, +<-0.01888,0.14459,ZP>, +<-0.01888,0.15719,ZP>, +<-0.01889,0.16979,ZP>, +<-0.01890,0.18240,ZP>, +<-0.01891,0.19502,ZP>, +<-0.01892,0.20765,ZP>, +<-0.01893,0.22029,ZP>, +<-0.01894,0.23293,ZP>, +<-0.01895,0.24559,ZP>, +<-0.01897,0.25827,ZP>, +<-0.01898,0.27095,ZP>, +<-0.01900,0.28365,ZP>, +<-0.01902,0.29637,ZP>, +<-0.01904,0.30910,ZP>, +<-0.01907,0.32184,ZP>, +<-0.01910,0.33461,ZP>, +<-0.01913,0.34739,ZP>, +<-0.01916,0.36019,ZP>, +<-0.01919,0.37301,ZP>, +<-0.01923,0.38586,ZP>, +<-0.01926,0.39872,ZP>, +<-0.01929,0.41161,ZP>, +<-0.01930,0.42451,ZP>, +<-0.01930,0.43746,ZP>, +<-0.01926,0.45038,ZP>, +<-0.01921,0.46341,ZP>, +<-0.01906,0.47629,ZP>, +<-0.01903,0.48951,0.66019>, +<-0.01899,0.49976,0.64900>, +<-0.01854,0.49968,0.63589>, +<-0.01797,0.49968,0.62275>, +<-0.01743,0.49972,0.60968>, +<-0.01679,0.49795,0.59688>, +<-0.01614,0.49854,0.58421> +<-0.00578,-0.50942,0.58454>, +<-0.00567,-0.50798,0.59742>, +<-0.00532,-0.50580,0.61026>, +<-0.00528,-0.50333,0.62318>, +<-0.00533,-0.49998,0.63607>, +<-0.00560,-0.50010,0.64929>, +<-0.00567,-0.48952,0.66017>, +<-0.00574,-0.47629,ZP>, +<-0.00587,-0.46336,ZP>, +<-0.00596,-0.45035,ZP>, +<-0.00604,-0.43745,ZP>, +<-0.00609,-0.42453,ZP>, +<-0.00614,-0.41165,ZP>, +<-0.00617,-0.39878,ZP>, +<-0.00620,-0.38593,ZP>, +<-0.00623,-0.37309,ZP>, +<-0.00626,-0.36027,ZP>, +<-0.00628,-0.34747,ZP>, +<-0.00630,-0.33468,ZP>, +<-0.00631,-0.32191,ZP>, +<-0.00632,-0.30916,ZP>, +<-0.00633,-0.29642,ZP>, +<-0.00633,-0.28370,ZP>, +<-0.00633,-0.27099,ZP>, +<-0.00633,-0.25830,ZP>, +<-0.00633,-0.24562,ZP>, +<-0.00633,-0.23296,ZP>, +<-0.00632,-0.22030,ZP>, +<-0.00632,-0.20766,ZP>, +<-0.00631,-0.19503,ZP>, +<-0.00631,-0.18241,ZP>, +<-0.00631,-0.16980,ZP>, +<-0.00630,-0.15719,ZP>, +<-0.00630,-0.14460,ZP>, +<-0.00630,-0.13200,ZP>, +<-0.00629,-0.11942,ZP>, +<-0.00629,-0.10683,ZP>, +<-0.00629,-0.09426,ZP>, +<-0.00629,-0.08168,ZP>, +<-0.00629,-0.06911,ZP>, +<-0.00629,-0.05654,ZP>, +<-0.00629,-0.04398,ZP>, +<-0.00628,-0.03141,ZP>, +<-0.00628,-0.01885,ZP>, +<-0.00628,-0.00628,ZP>, +<-0.00628,0.00628,ZP>, +<-0.00628,0.01884,ZP>, +<-0.00628,0.03141,ZP>, +<-0.00628,0.04397,ZP>, +<-0.00628,0.05654,ZP>, +<-0.00629,0.06911,ZP>, +<-0.00629,0.08168,ZP>, +<-0.00629,0.09425,ZP>, +<-0.00629,0.10683,ZP>, +<-0.00629,0.11941,ZP>, +<-0.00629,0.13200,ZP>, +<-0.00629,0.14459,ZP>, +<-0.00629,0.15718,ZP>, +<-0.00630,0.16979,ZP>, +<-0.00630,0.18240,ZP>, +<-0.00630,0.19501,ZP>, +<-0.00630,0.20764,ZP>, +<-0.00631,0.22028,ZP>, +<-0.00631,0.23293,ZP>, +<-0.00632,0.24559,ZP>, +<-0.00632,0.25826,ZP>, +<-0.00633,0.27094,ZP>, +<-0.00634,0.28364,ZP>, +<-0.00635,0.29636,ZP>, +<-0.00636,0.30909,ZP>, +<-0.00638,0.32183,ZP>, +<-0.00639,0.33459,ZP>, +<-0.00641,0.34737,ZP>, +<-0.00644,0.36017,ZP>, +<-0.00646,0.37299,ZP>, +<-0.00649,0.38583,ZP>, +<-0.00651,0.39869,ZP>, +<-0.00653,0.41157,ZP>, +<-0.00655,0.42446,ZP>, +<-0.00655,0.43739,ZP>, +<-0.00652,0.45032,ZP>, +<-0.00647,0.46334,ZP>, +<-0.00636,0.47630,ZP>, +<-0.00629,0.48951,0.66018>, +<-0.00626,0.50010,0.64927>, +<-0.00615,0.49998,0.63613>, +<-0.00604,0.50304,0.62320>, +<-0.00607,0.50534,0.61041>, +<-0.00658,0.50682,0.59745>, +<-0.00661,0.50745,0.58482> +<0.00639,-0.51331,0.58540>, +<0.00658,-0.51126,0.59817>, +<0.00665,-0.50856,0.61094>, +<0.00676,-0.50536,0.62370>, +<0.00689,-0.49996,0.63613>, +<0.00703,-0.50008,0.64936>, +<0.00698,-0.48944,0.66017>, +<0.00690,-0.47623,ZP>, +<0.00685,-0.46329,ZP>, +<0.00678,-0.45028,ZP>, +<0.00674,-0.43739,ZP>, +<0.00668,-0.42448,ZP>, +<0.00664,-0.41161,ZP>, +<0.00659,-0.39875,ZP>, +<0.00655,-0.38590,ZP>, +<0.00651,-0.37307,ZP>, +<0.00647,-0.36025,ZP>, +<0.00644,-0.34745,ZP>, +<0.00641,-0.33467,ZP>, +<0.00638,-0.32190,ZP>, +<0.00636,-0.30914,ZP>, +<0.00634,-0.29641,ZP>, +<0.00633,-0.28369,ZP>, +<0.00632,-0.27098,ZP>, +<0.00631,-0.25829,ZP>, +<0.00630,-0.24562,ZP>, +<0.00630,-0.23295,ZP>, +<0.00630,-0.22030,ZP>, +<0.00629,-0.20766,ZP>, +<0.00629,-0.19503,ZP>, +<0.00629,-0.18241,ZP>, +<0.00629,-0.16980,ZP>, +<0.00629,-0.15719,ZP>, +<0.00629,-0.14460,ZP>, +<0.00629,-0.13200,ZP>, +<0.00628,-0.11942,ZP>, +<0.00628,-0.10683,ZP>, +<0.00628,-0.09426,ZP>, +<0.00628,-0.08168,ZP>, +<0.00628,-0.06911,ZP>, +<0.00628,-0.05654,ZP>, +<0.00628,-0.04398,ZP>, +<0.00628,-0.03141,ZP>, +<0.00628,-0.01885,ZP>, +<0.00628,-0.00628,ZP>, +<0.00628,0.00628,ZP>, +<0.00628,0.01884,ZP>, +<0.00628,0.03141,ZP>, +<0.00628,0.04397,ZP>, +<0.00628,0.05654,ZP>, +<0.00628,0.06911,ZP>, +<0.00628,0.08168,ZP>, +<0.00628,0.09425,ZP>, +<0.00629,0.10683,ZP>, +<0.00629,0.11941,ZP>, +<0.00629,0.13200,ZP>, +<0.00629,0.14459,ZP>, +<0.00629,0.15718,ZP>, +<0.00630,0.16979,ZP>, +<0.00630,0.18240,ZP>, +<0.00630,0.19501,ZP>, +<0.00631,0.20764,ZP>, +<0.00631,0.22028,ZP>, +<0.00631,0.23293,ZP>, +<0.00632,0.24559,ZP>, +<0.00632,0.25826,ZP>, +<0.00632,0.27094,ZP>, +<0.00632,0.28364,ZP>, +<0.00632,0.29636,ZP>, +<0.00632,0.30909,ZP>, +<0.00632,0.32183,ZP>, +<0.00631,0.33460,ZP>, +<0.00630,0.34738,ZP>, +<0.00629,0.36018,ZP>, +<0.00627,0.37299,ZP>, +<0.00625,0.38583,ZP>, +<0.00624,0.39868,ZP>, +<0.00622,0.41156,ZP>, +<0.00621,0.42445,ZP>, +<0.00621,0.43737,ZP>, +<0.00622,0.45028,ZP>, +<0.00626,0.46329,ZP>, +<0.00635,0.47626,ZP>, +<0.00656,0.48946,0.66019>, +<0.00673,0.50011,0.64931>, +<0.00646,0.49999,0.63619>, +<0.00646,0.50283,0.62338>, +<0.00641,0.50518,0.61030>, +<0.00601,0.50652,0.59743>, +<0.00598,0.50775,0.58458> +<0.01826,-0.50895,0.58428>, +<0.01847,-0.50758,0.59723>, +<0.01865,-0.50556,0.61004>, +<0.01877,-0.50309,0.62295>, +<0.01914,-0.49965,0.63583>, +<0.01966,-0.49973,0.64902>, +<0.01963,-0.48942,0.66018>, +<0.01955,-0.47617,ZP>, +<0.01958,-0.46329,ZP>, +<0.01954,-0.45027,ZP>, +<0.01952,-0.43739,ZP>, +<0.01947,-0.42448,ZP>, +<0.01942,-0.41161,ZP>, +<0.01936,-0.39875,ZP>, +<0.01931,-0.38590,ZP>, +<0.01926,-0.37307,ZP>, +<0.01920,-0.36026,ZP>, +<0.01916,-0.34745,ZP>, +<0.01911,-0.33467,ZP>, +<0.01908,-0.32190,ZP>, +<0.01904,-0.30915,ZP>, +<0.01901,-0.29641,ZP>, +<0.01899,-0.28369,ZP>, +<0.01897,-0.27099,ZP>, +<0.01895,-0.25830,ZP>, +<0.01894,-0.24562,ZP>, +<0.01893,-0.23296,ZP>, +<0.01892,-0.22031,ZP>, +<0.01891,-0.20767,ZP>, +<0.01890,-0.19504,ZP>, +<0.01889,-0.18242,ZP>, +<0.01888,-0.16980,ZP>, +<0.01888,-0.15720,ZP>, +<0.01887,-0.14460,ZP>, +<0.01887,-0.13201,ZP>, +<0.01886,-0.11942,ZP>, +<0.01886,-0.10684,ZP>, +<0.01885,-0.09426,ZP>, +<0.01885,-0.08168,ZP>, +<0.01885,-0.06911,ZP>, +<0.01885,-0.05654,ZP>, +<0.01885,-0.04398,ZP>, +<0.01884,-0.03141,ZP>, +<0.01884,-0.01885,ZP>, +<0.01884,-0.00628,ZP>, +<0.01884,0.00628,ZP>, +<0.01884,0.01884,ZP>, +<0.01884,0.03141,ZP>, +<0.01885,0.04397,ZP>, +<0.01885,0.05654,ZP>, +<0.01885,0.06911,ZP>, +<0.01885,0.08168,ZP>, +<0.01886,0.09425,ZP>, +<0.01886,0.10683,ZP>, +<0.01886,0.11941,ZP>, +<0.01887,0.13200,ZP>, +<0.01888,0.14459,ZP>, +<0.01888,0.15719,ZP>, +<0.01889,0.16979,ZP>, +<0.01890,0.18240,ZP>, +<0.01891,0.19502,ZP>, +<0.01892,0.20765,ZP>, +<0.01893,0.22029,ZP>, +<0.01894,0.23294,ZP>, +<0.01895,0.24560,ZP>, +<0.01896,0.25827,ZP>, +<0.01897,0.27096,ZP>, +<0.01899,0.28366,ZP>, +<0.01899,0.29637,ZP>, +<0.01900,0.30911,ZP>, +<0.01901,0.32185,ZP>, +<0.01901,0.33462,ZP>, +<0.01901,0.34740,ZP>, +<0.01901,0.36020,ZP>, +<0.01901,0.37302,ZP>, +<0.01900,0.38585,ZP>, +<0.01899,0.39871,ZP>, +<0.01898,0.41159,ZP>, +<0.01897,0.42447,ZP>, +<0.01898,0.43739,ZP>, +<0.01897,0.45027,ZP>, +<0.01901,0.46328,ZP>, +<0.01901,0.47614,ZP>, +<0.01925,0.48939,0.66020>, +<0.01945,0.49978,0.64903>, +<0.01883,0.49969,0.63584>, +<0.01820,0.49969,0.62272>, +<0.01721,0.49971,0.60941>, +<0.01668,0.49976,0.59671>, +<0.01600,0.49991,0.58354> +<0.02602,-0.49825,0.58343>, +<0.02743,-0.49815,0.59617>, +<0.02904,-0.49917,0.60895>, +<0.03027,-0.49909,0.62200>, +<0.03142,-0.49904,0.63526>, +<0.03227,-0.49906,0.64831>, +<0.03232,-0.48953,0.66019>, +<0.03222,-0.47614,ZP>, +<0.03235,-0.46338,ZP>, +<0.03231,-0.45033,ZP>, +<0.03231,-0.43745,ZP>, +<0.03225,-0.42452,ZP>, +<0.03220,-0.41165,ZP>, +<0.03213,-0.39878,ZP>, +<0.03207,-0.38593,ZP>, +<0.03200,-0.37309,ZP>, +<0.03194,-0.36028,ZP>, +<0.03188,-0.34747,ZP>, +<0.03182,-0.33469,ZP>, +<0.03177,-0.32192,ZP>, +<0.03173,-0.30917,ZP>, +<0.03169,-0.29643,ZP>, +<0.03165,-0.28371,ZP>, +<0.03163,-0.27100,ZP>, +<0.03160,-0.25831,ZP>, +<0.03158,-0.24564,ZP>, +<0.03156,-0.23297,ZP>, +<0.03154,-0.22032,ZP>, +<0.03152,-0.20768,ZP>, +<0.03151,-0.19505,ZP>, +<0.03149,-0.18243,ZP>, +<0.03148,-0.16981,ZP>, +<0.03147,-0.15721,ZP>, +<0.03146,-0.14461,ZP>, +<0.03145,-0.13201,ZP>, +<0.03144,-0.11943,ZP>, +<0.03143,-0.10684,ZP>, +<0.03143,-0.09426,ZP>, +<0.03142,-0.08169,ZP>, +<0.03142,-0.06912,ZP>, +<0.03141,-0.05655,ZP>, +<0.03141,-0.04398,ZP>, +<0.03141,-0.03141,ZP>, +<0.03141,-0.01885,ZP>, +<0.03141,-0.00628,ZP>, +<0.03141,0.00628,ZP>, +<0.03141,0.01885,ZP>, +<0.03141,0.03141,ZP>, +<0.03141,0.04398,ZP>, +<0.03141,0.05654,ZP>, +<0.03142,0.06911,ZP>, +<0.03142,0.08168,ZP>, +<0.03143,0.09426,ZP>, +<0.03143,0.10684,ZP>, +<0.03144,0.11942,ZP>, +<0.03145,0.13201,ZP>, +<0.03146,0.14460,ZP>, +<0.03147,0.15720,ZP>, +<0.03148,0.16980,ZP>, +<0.03150,0.18242,ZP>, +<0.03151,0.19504,ZP>, +<0.03153,0.20767,ZP>, +<0.03155,0.22031,ZP>, +<0.03157,0.23296,ZP>, +<0.03159,0.24562,ZP>, +<0.03161,0.25830,ZP>, +<0.03163,0.27098,ZP>, +<0.03165,0.28369,ZP>, +<0.03167,0.29641,ZP>, +<0.03169,0.30914,ZP>, +<0.03171,0.32189,ZP>, +<0.03172,0.33466,ZP>, +<0.03173,0.34744,ZP>, +<0.03174,0.36024,ZP>, +<0.03175,0.37306,ZP>, +<0.03175,0.38590,ZP>, +<0.03175,0.39876,ZP>, +<0.03175,0.41164,ZP>, +<0.03174,0.42452,ZP>, +<0.03176,0.43746,ZP>, +<0.03175,0.45031,ZP>, +<0.03181,0.46334,ZP>, +<0.03171,0.47594,ZP>, +<0.03188,0.48933,0.66019>, +<0.03722,0.49551,0.65000>, +<0.03110,0.49907,0.63537>, +<0.03011,0.49911,0.62206>, +<0.02924,0.49918,0.60887>, +<0.02842,0.49615,0.59609>, +<0.02755,0.49528,0.58308> +<0.03884,-0.49685,0.58213>, +<0.04017,-0.49656,0.59496>, +<0.04130,-0.49831,0.60786>, +<0.04241,-0.49821,0.62091>, +<0.04365,-0.49812,0.63427>, +<0.04478,-0.49806,0.64720>, +<0.04505,-0.48989,ZP>, +<0.04496,-0.47620,ZP>, +<0.04515,-0.46357,ZP>, +<0.04509,-0.45044,ZP>, +<0.04509,-0.43756,ZP>, +<0.04503,-0.42460,ZP>, +<0.04498,-0.41171,ZP>, +<0.04491,-0.39883,ZP>, +<0.04483,-0.38598,ZP>, +<0.04475,-0.37314,ZP>, +<0.04468,-0.36032,ZP>, +<0.04460,-0.34751,ZP>, +<0.04454,-0.33472,ZP>, +<0.04447,-0.32195,ZP>, +<0.04442,-0.30920,ZP>, +<0.04437,-0.29646,ZP>, +<0.04432,-0.28374,ZP>, +<0.04429,-0.27103,ZP>, +<0.04425,-0.25834,ZP>, +<0.04422,-0.24566,ZP>, +<0.04419,-0.23300,ZP>, +<0.04416,-0.22034,ZP>, +<0.04414,-0.20770,ZP>, +<0.04412,-0.19507,ZP>, +<0.04410,-0.18244,ZP>, +<0.04408,-0.16983,ZP>, +<0.04406,-0.15722,ZP>, +<0.04405,-0.14462,ZP>, +<0.04403,-0.13202,ZP>, +<0.04402,-0.11944,ZP>, +<0.04401,-0.10685,ZP>, +<0.04400,-0.09427,ZP>, +<0.04399,-0.08169,ZP>, +<0.04399,-0.06912,ZP>, +<0.04398,-0.05655,ZP>, +<0.04398,-0.04398,ZP>, +<0.04397,-0.03141,ZP>, +<0.04397,-0.01885,ZP>, +<0.04397,-0.00628,ZP>, +<0.04397,0.00628,ZP>, +<0.04397,0.01885,ZP>, +<0.04397,0.03141,ZP>, +<0.04398,0.04398,ZP>, +<0.04398,0.05655,ZP>, +<0.04399,0.06912,ZP>, +<0.04399,0.08169,ZP>, +<0.04400,0.09427,ZP>, +<0.04401,0.10685,ZP>, +<0.04402,0.11943,ZP>, +<0.04403,0.13202,ZP>, +<0.04405,0.14461,ZP>, +<0.04406,0.15721,ZP>, +<0.04408,0.16982,ZP>, +<0.04410,0.18243,ZP>, +<0.04412,0.19506,ZP>, +<0.04415,0.20769,ZP>, +<0.04417,0.22033,ZP>, +<0.04420,0.23299,ZP>, +<0.04423,0.24565,ZP>, +<0.04426,0.25833,ZP>, +<0.04429,0.27102,ZP>, +<0.04432,0.28373,ZP>, +<0.04435,0.29645,ZP>, +<0.04438,0.30919,ZP>, +<0.04441,0.32194,ZP>, +<0.04444,0.33471,ZP>, +<0.04446,0.34750,ZP>, +<0.04448,0.36031,ZP>, +<0.04449,0.37314,ZP>, +<0.04450,0.38598,ZP>, +<0.04451,0.39884,ZP>, +<0.04452,0.41173,ZP>, +<0.04452,0.42461,ZP>, +<0.04454,0.43756,ZP>, +<0.04455,0.45039,ZP>, +<0.04463,0.46349,ZP>, +<0.04474,0.47575,ZP>, +<0.04474,0.48953,0.66008>, +<0.04444,0.49808,0.64709>, +<0.04318,0.49815,0.63423>, +<0.04232,0.49821,0.62081>, +<0.04142,0.49829,0.60781>, +<0.04065,0.49770,0.59495>, +<0.04018,0.49764,0.58209> +<0.04922,-0.50534,0.58125>, +<0.05097,-0.50411,0.59391>, +<0.05272,-0.50243,0.60673>, +<0.05422,-0.50059,0.61979>, +<0.05564,-0.49690,0.63291>, +<0.05749,-0.49555,0.64538>, +<0.05787,-0.49048,0.65953>, +<0.05775,-0.47637,ZP>, +<0.05794,-0.46385,ZP>, +<0.05786,-0.45060,ZP>, +<0.05786,-0.43770,ZP>, +<0.05781,-0.42471,ZP>, +<0.05776,-0.41181,ZP>, +<0.05768,-0.39892,ZP>, +<0.05760,-0.38605,ZP>, +<0.05751,-0.37320,ZP>, +<0.05742,-0.36038,ZP>, +<0.05734,-0.34757,ZP>, +<0.05726,-0.33477,ZP>, +<0.05718,-0.32200,ZP>, +<0.05712,-0.30924,ZP>, +<0.05706,-0.29651,ZP>, +<0.05700,-0.28378,ZP>, +<0.05695,-0.27107,ZP>, +<0.05691,-0.25838,ZP>, +<0.05687,-0.24570,ZP>, +<0.05683,-0.23303,ZP>, +<0.05679,-0.22038,ZP>, +<0.05676,-0.20773,ZP>, +<0.05673,-0.19510,ZP>, +<0.05670,-0.18247,ZP>, +<0.05668,-0.16985,ZP>, +<0.05666,-0.15724,ZP>, +<0.05664,-0.14464,ZP>, +<0.05662,-0.13204,ZP>, +<0.05660,-0.11945,ZP>, +<0.05659,-0.10686,ZP>, +<0.05658,-0.09428,ZP>, +<0.05657,-0.08170,ZP>, +<0.05656,-0.06913,ZP>, +<0.05655,-0.05656,ZP>, +<0.05655,-0.04399,ZP>, +<0.05654,-0.03142,ZP>, +<0.05654,-0.01885,ZP>, +<0.05654,-0.00628,ZP>, +<0.05654,0.00628,ZP>, +<0.05654,0.01885,ZP>, +<0.05654,0.03142,ZP>, +<0.05655,0.04398,ZP>, +<0.05655,0.05655,ZP>, +<0.05656,0.06912,ZP>, +<0.05657,0.08170,ZP>, +<0.05658,0.09428,ZP>, +<0.05659,0.10686,ZP>, +<0.05660,0.11944,ZP>, +<0.05662,0.13203,ZP>, +<0.05664,0.14463,ZP>, +<0.05666,0.15723,ZP>, +<0.05668,0.16984,ZP>, +<0.05671,0.18246,ZP>, +<0.05674,0.19509,ZP>, +<0.05677,0.20772,ZP>, +<0.05680,0.22037,ZP>, +<0.05684,0.23303,ZP>, +<0.05687,0.24569,ZP>, +<0.05691,0.25838,ZP>, +<0.05695,0.27107,ZP>, +<0.05699,0.28378,ZP>, +<0.05704,0.29651,ZP>, +<0.05708,0.30925,ZP>, +<0.05712,0.32201,ZP>, +<0.05716,0.33479,ZP>, +<0.05719,0.34758,ZP>, +<0.05722,0.36040,ZP>, +<0.05725,0.37323,ZP>, +<0.05727,0.38608,ZP>, +<0.05728,0.39895,ZP>, +<0.05729,0.41185,ZP>, +<0.05730,0.42474,ZP>, +<0.05732,0.43771,ZP>, +<0.05735,0.45054,ZP>, +<0.05745,0.46375,ZP>, +<0.05762,0.47614,ZP>, +<0.05760,0.49032,0.65957>, +<0.05701,0.49676,0.64569>, +<0.05559,0.49700,0.63249>, +<0.05397,0.50187,0.62006>, +<0.05234,0.50415,0.60727>, +<0.05050,0.50631,0.59433>, +<0.04881,0.50745,0.58153> +<0.06187,-0.50360,0.57943>, +<0.06355,-0.50267,0.59206>, +<0.06495,-0.50094,0.60506>, +<0.06621,-0.49876,0.61800>, +<0.06762,-0.49541,0.63113>, +<0.06953,-0.49515,0.64378>, +<0.07077,-0.49120,0.65819>, +<0.07054,-0.47664,ZP>, +<0.07066,-0.46412,ZP>, +<0.07062,-0.45078,ZP>, +<0.07062,-0.43786,ZP>, +<0.07059,-0.42486,ZP>, +<0.07053,-0.41194,ZP>, +<0.07046,-0.39903,ZP>, +<0.07037,-0.38615,ZP>, +<0.07027,-0.37329,ZP>, +<0.07017,-0.36046,ZP>, +<0.07007,-0.34764,ZP>, +<0.06998,-0.33484,ZP>, +<0.06990,-0.32207,ZP>, +<0.06982,-0.30931,ZP>, +<0.06975,-0.29657,ZP>, +<0.06969,-0.28384,ZP>, +<0.06963,-0.27113,ZP>, +<0.06957,-0.25843,ZP>, +<0.06952,-0.24575,ZP>, +<0.06947,-0.23308,ZP>, +<0.06943,-0.22042,ZP>, +<0.06939,-0.20777,ZP>, +<0.06935,-0.19513,ZP>, +<0.06932,-0.18250,ZP>, +<0.06928,-0.16988,ZP>, +<0.06926,-0.15727,ZP>, +<0.06923,-0.14466,ZP>, +<0.06921,-0.13206,ZP>, +<0.06919,-0.11947,ZP>, +<0.06917,-0.10688,ZP>, +<0.06916,-0.09429,ZP>, +<0.06914,-0.08171,ZP>, +<0.06913,-0.06914,ZP>, +<0.06912,-0.05656,ZP>, +<0.06912,-0.04399,ZP>, +<0.06911,-0.03142,ZP>, +<0.06911,-0.01885,ZP>, +<0.06911,-0.00628,ZP>, +<0.06911,0.00628,ZP>, +<0.06911,0.01885,ZP>, +<0.06911,0.03142,ZP>, +<0.06912,0.04399,ZP>, +<0.06912,0.05656,ZP>, +<0.06913,0.06913,ZP>, +<0.06914,0.08171,ZP>, +<0.06916,0.09429,ZP>, +<0.06917,0.10687,ZP>, +<0.06919,0.11946,ZP>, +<0.06921,0.13205,ZP>, +<0.06923,0.14465,ZP>, +<0.06926,0.15726,ZP>, +<0.06928,0.16987,ZP>, +<0.06932,0.18249,ZP>, +<0.06935,0.19512,ZP>, +<0.06939,0.20776,ZP>, +<0.06943,0.22041,ZP>, +<0.06948,0.23307,ZP>, +<0.06952,0.24575,ZP>, +<0.06957,0.25844,ZP>, +<0.06963,0.27114,ZP>, +<0.06968,0.28385,ZP>, +<0.06973,0.29658,ZP>, +<0.06978,0.30933,ZP>, +<0.06984,0.32210,ZP>, +<0.06988,0.33488,ZP>, +<0.06993,0.34769,ZP>, +<0.06997,0.36051,ZP>, +<0.07001,0.37335,ZP>, +<0.07004,0.38622,ZP>, +<0.07006,0.39910,ZP>, +<0.07007,0.41200,ZP>, +<0.07009,0.42491,ZP>, +<0.07010,0.43789,ZP>, +<0.07013,0.45075,ZP>, +<0.07018,0.46407,ZP>, +<0.07000,0.47668,ZP>, +<0.07016,0.49126,0.65821>, +<0.06900,0.49522,0.64376>, +<0.06717,0.49812,0.63148>, +<0.06609,0.50266,0.61875>, +<0.06440,0.50623,0.60626>, +<0.06286,0.50905,0.59336>, +<0.06096,0.51145,0.58101> +<0.06975,-0.49319,0.57760>, +<0.07215,-0.49280,0.59023>, +<0.07488,-0.49439,0.60294>, +<0.07716,-0.49402,0.61572>, +<0.07938,-0.49367,0.62899>, +<0.08173,-0.49328,0.64150>, +<0.08361,-0.49148,0.65577>, +<0.08329,-0.47697,ZP>, +<0.08331,-0.46431,ZP>, +<0.08338,-0.45100,ZP>, +<0.08338,-0.43805,ZP>, +<0.08338,-0.42504,ZP>, +<0.08332,-0.41209,ZP>, +<0.08324,-0.39917,ZP>, +<0.08314,-0.38627,ZP>, +<0.08304,-0.37340,ZP>, +<0.08293,-0.36056,ZP>, +<0.08282,-0.34773,ZP>, +<0.08272,-0.33493,ZP>, +<0.08263,-0.32215,ZP>, +<0.08254,-0.30939,ZP>, +<0.08246,-0.29665,ZP>, +<0.08238,-0.28392,ZP>, +<0.08231,-0.27120,ZP>, +<0.08225,-0.25850,ZP>, +<0.08218,-0.24581,ZP>, +<0.08213,-0.23314,ZP>, +<0.08207,-0.22047,ZP>, +<0.08202,-0.20782,ZP>, +<0.08197,-0.19518,ZP>, +<0.08193,-0.18254,ZP>, +<0.08189,-0.16991,ZP>, +<0.08186,-0.15730,ZP>, +<0.08183,-0.14469,ZP>, +<0.08180,-0.13208,ZP>, +<0.08178,-0.11949,ZP>, +<0.08176,-0.10690,ZP>, +<0.08174,-0.09431,ZP>, +<0.08172,-0.08173,ZP>, +<0.08171,-0.06915,ZP>, +<0.08170,-0.05657,ZP>, +<0.08169,-0.04400,ZP>, +<0.08168,-0.03143,ZP>, +<0.08168,-0.01885,ZP>, +<0.08168,-0.00628,ZP>, +<0.08168,0.00628,ZP>, +<0.08168,0.01885,ZP>, +<0.08168,0.03142,ZP>, +<0.08169,0.04400,ZP>, +<0.08170,0.05657,ZP>, +<0.08171,0.06914,ZP>, +<0.08172,0.08172,ZP>, +<0.08174,0.09430,ZP>, +<0.08175,0.10689,ZP>, +<0.08178,0.11948,ZP>, +<0.08180,0.13208,ZP>, +<0.08183,0.14468,ZP>, +<0.08186,0.15729,ZP>, +<0.08189,0.16990,ZP>, +<0.08193,0.18253,ZP>, +<0.08197,0.19517,ZP>, +<0.08202,0.20781,ZP>, +<0.08207,0.22047,ZP>, +<0.08213,0.23313,ZP>, +<0.08218,0.24581,ZP>, +<0.08224,0.25851,ZP>, +<0.08231,0.27122,ZP>, +<0.08237,0.28394,ZP>, +<0.08244,0.29668,ZP>, +<0.08250,0.30943,ZP>, +<0.08256,0.32221,ZP>, +<0.08262,0.33500,ZP>, +<0.08268,0.34781,ZP>, +<0.08273,0.36065,ZP>, +<0.08278,0.37350,ZP>, +<0.08282,0.38638,ZP>, +<0.08285,0.39927,ZP>, +<0.08286,0.41219,ZP>, +<0.08289,0.42513,ZP>, +<0.08287,0.43812,ZP>, +<0.08287,0.45105,ZP>, +<0.08277,0.46437,ZP>, +<0.08267,0.47707,ZP>, +<0.08297,0.49156,0.65580>, +<0.08096,0.49357,0.64159>, +<0.07853,0.49507,0.62897>, +<0.07715,0.49865,0.61610>, +<0.07574,0.50139,0.60335>, +<0.07426,0.50394,0.59035>, +<0.07277,0.50603,0.57813> +<0.08225,-0.49080,0.57537>, +<0.08472,-0.49095,0.58797>, +<0.08695,-0.49241,0.60062>, +<0.08910,-0.49200,0.61331>, +<0.09119,-0.49185,0.62639>, +<0.09372,-0.49115,0.63897>, +<0.09616,-0.49057,0.65256>, +<0.09600,-0.47735,0.66010>, +<0.09595,-0.46442,ZP>, +<0.09619,-0.45130,ZP>, +<0.09615,-0.43827,ZP>, +<0.09617,-0.42526,ZP>, +<0.09610,-0.41228,ZP>, +<0.09603,-0.39934,ZP>, +<0.09592,-0.38642,ZP>, +<0.09581,-0.37354,ZP>, +<0.09570,-0.36068,ZP>, +<0.09559,-0.34785,ZP>, +<0.09548,-0.33504,ZP>, +<0.09537,-0.32226,ZP>, +<0.09528,-0.30949,ZP>, +<0.09518,-0.29674,ZP>, +<0.09509,-0.28401,ZP>, +<0.09501,-0.27129,ZP>, +<0.09493,-0.25859,ZP>, +<0.09486,-0.24589,ZP>, +<0.09479,-0.23321,ZP>, +<0.09472,-0.22054,ZP>, +<0.09466,-0.20788,ZP>, +<0.09461,-0.19523,ZP>, +<0.09456,-0.18259,ZP>, +<0.09451,-0.16996,ZP>, +<0.09447,-0.15733,ZP>, +<0.09443,-0.14472,ZP>, +<0.09440,-0.13211,ZP>, +<0.09437,-0.11951,ZP>, +<0.09434,-0.10692,ZP>, +<0.09432,-0.09433,ZP>, +<0.09430,-0.08174,ZP>, +<0.09429,-0.06916,ZP>, +<0.09428,-0.05658,ZP>, +<0.09427,-0.04400,ZP>, +<0.09426,-0.03143,ZP>, +<0.09425,-0.01886,ZP>, +<0.09425,-0.00629,ZP>, +<0.09425,0.00629,ZP>, +<0.09425,0.01886,ZP>, +<0.09426,0.03143,ZP>, +<0.09427,0.04400,ZP>, +<0.09428,0.05658,ZP>, +<0.09429,0.06916,ZP>, +<0.09430,0.08174,ZP>, +<0.09432,0.09432,ZP>, +<0.09434,0.10691,ZP>, +<0.09437,0.11951,ZP>, +<0.09440,0.13210,ZP>, +<0.09443,0.14471,ZP>, +<0.09447,0.15732,ZP>, +<0.09451,0.16995,ZP>, +<0.09455,0.18258,ZP>, +<0.09460,0.19522,ZP>, +<0.09466,0.20787,ZP>, +<0.09472,0.22053,ZP>, +<0.09478,0.23321,ZP>, +<0.09485,0.24589,ZP>, +<0.09492,0.25859,ZP>, +<0.09500,0.27131,ZP>, +<0.09508,0.28404,ZP>, +<0.09515,0.29679,ZP>, +<0.09523,0.30955,ZP>, +<0.09530,0.32233,ZP>, +<0.09538,0.33514,ZP>, +<0.09544,0.34796,ZP>, +<0.09551,0.36081,ZP>, +<0.09556,0.37368,ZP>, +<0.09561,0.38657,ZP>, +<0.09565,0.39949,ZP>, +<0.09566,0.41243,ZP>, +<0.09568,0.42540,ZP>, +<0.09563,0.43840,ZP>, +<0.09564,0.45145,ZP>, +<0.09536,0.46459,ZP>, +<0.09535,0.47751,0.66010>, +<0.09552,0.49073,0.65245>, +<0.09301,0.49128,0.63892>, +<0.09003,0.49184,0.62638>, +<0.08717,0.49236,0.61333>, +<0.08413,0.49289,0.60067>, +<0.08084,0.49308,0.58783>, +<0.07797,0.49418,0.57548> +<0.09297,-0.49695,0.57278>, +<0.09551,-0.49702,0.58557>, +<0.09789,-0.49705,0.59825>, +<0.10056,-0.49584,0.61104>, +<0.10319,-0.49347,0.62385>, +<0.10573,-0.48939,0.63621>, +<0.10836,-0.48823,0.64916>, +<0.10880,-0.47778,0.66021>, +<0.10868,-0.46456,ZP>, +<0.10902,-0.45169,ZP>, +<0.10893,-0.43852,ZP>, +<0.10896,-0.42551,ZP>, +<0.10889,-0.41250,ZP>, +<0.10881,-0.39953,ZP>, +<0.10871,-0.38660,ZP>, +<0.10860,-0.37370,ZP>, +<0.10848,-0.36083,ZP>, +<0.10836,-0.34799,ZP>, +<0.10825,-0.33518,ZP>, +<0.10814,-0.32239,ZP>, +<0.10803,-0.30962,ZP>, +<0.10792,-0.29686,ZP>, +<0.10782,-0.28412,ZP>, +<0.10772,-0.27140,ZP>, +<0.10763,-0.25868,ZP>, +<0.10754,-0.24598,ZP>, +<0.10746,-0.23329,ZP>, +<0.10738,-0.22061,ZP>, +<0.10731,-0.20795,ZP>, +<0.10724,-0.19529,ZP>, +<0.10719,-0.18264,ZP>, +<0.10713,-0.17001,ZP>, +<0.10708,-0.15738,ZP>, +<0.10704,-0.14476,ZP>, +<0.10700,-0.13215,ZP>, +<0.10697,-0.11954,ZP>, +<0.10694,-0.10694,ZP>, +<0.10691,-0.09435,ZP>, +<0.10689,-0.08176,ZP>, +<0.10687,-0.06917,ZP>, +<0.10686,-0.05659,ZP>, +<0.10684,-0.04401,ZP>, +<0.10684,-0.03144,ZP>, +<0.10683,-0.01886,ZP>, +<0.10683,-0.00629,ZP>, +<0.10683,0.00629,ZP>, +<0.10683,0.01886,ZP>, +<0.10684,0.03144,ZP>, +<0.10685,0.04401,ZP>, +<0.10686,0.05659,ZP>, +<0.10687,0.06917,ZP>, +<0.10689,0.08176,ZP>, +<0.10691,0.09434,ZP>, +<0.10694,0.10694,ZP>, +<0.10697,0.11953,ZP>, +<0.10700,0.13214,ZP>, +<0.10704,0.14475,ZP>, +<0.10708,0.15737,ZP>, +<0.10713,0.16999,ZP>, +<0.10718,0.18263,ZP>, +<0.10724,0.19528,ZP>, +<0.10730,0.20794,ZP>, +<0.10737,0.22061,ZP>, +<0.10745,0.23329,ZP>, +<0.10753,0.24598,ZP>, +<0.10762,0.25869,ZP>, +<0.10770,0.27142,ZP>, +<0.10779,0.28416,ZP>, +<0.10788,0.29692,ZP>, +<0.10797,0.30969,ZP>, +<0.10806,0.32248,ZP>, +<0.10814,0.33530,ZP>, +<0.10822,0.34813,ZP>, +<0.10829,0.36099,ZP>, +<0.10836,0.37388,ZP>, +<0.10841,0.38679,ZP>, +<0.10845,0.39973,ZP>, +<0.10847,0.41270,ZP>, +<0.10848,0.42571,ZP>, +<0.10841,0.43872,ZP>, +<0.10845,0.45192,ZP>, +<0.10808,0.46481,ZP>, +<0.10817,0.47803,0.66022>, +<0.10767,0.48840,0.64891>, +<0.10481,0.48890,0.63607>, +<0.10160,0.48958,0.62340>, +<0.09866,0.49021,0.61055>, +<0.09497,0.48684,0.59784>, +<0.09141,0.48665,0.58540>, +<0.08831,0.48689,0.57282> +<0.10289,-0.50470,0.57125>, +<0.10628,-0.50301,0.58378>, +<0.10949,-0.50066,0.59607>, +<0.11238,-0.49751,0.60867>, +<0.11513,-0.49372,0.62106>, +<0.11745,-0.48811,0.63329>, +<0.12024,-0.48536,0.64575>, +<0.12186,-0.47901,0.65940>, +<0.12149,-0.46481,ZP>, +<0.12178,-0.45208,ZP>, +<0.12174,-0.43880,ZP>, +<0.12175,-0.42579,ZP>, +<0.12170,-0.41275,ZP>, +<0.12161,-0.39975,ZP>, +<0.12151,-0.38680,ZP>, +<0.12140,-0.37388,ZP>, +<0.12128,-0.36101,ZP>, +<0.12116,-0.34816,ZP>, +<0.12104,-0.33534,ZP>, +<0.12092,-0.32255,ZP>, +<0.12080,-0.30977,ZP>, +<0.12068,-0.29701,ZP>, +<0.12056,-0.28426,ZP>, +<0.12045,-0.27152,ZP>, +<0.12034,-0.25880,ZP>, +<0.12024,-0.24609,ZP>, +<0.12014,-0.23339,ZP>, +<0.12005,-0.22070,ZP>, +<0.11997,-0.20803,ZP>, +<0.11989,-0.19536,ZP>, +<0.11982,-0.18271,ZP>, +<0.11976,-0.17006,ZP>, +<0.11970,-0.15743,ZP>, +<0.11965,-0.14480,ZP>, +<0.11961,-0.13219,ZP>, +<0.11957,-0.11958,ZP>, +<0.11953,-0.10697,ZP>, +<0.11951,-0.09437,ZP>, +<0.11948,-0.08178,ZP>, +<0.11946,-0.06919,ZP>, +<0.11944,-0.05661,ZP>, +<0.11943,-0.04402,ZP>, +<0.11942,-0.03144,ZP>, +<0.11941,-0.01886,ZP>, +<0.11941,-0.00629,ZP>, +<0.11941,0.00629,ZP>, +<0.11941,0.01887,ZP>, +<0.11942,0.03144,ZP>, +<0.11943,0.04402,ZP>, +<0.11944,0.05661,ZP>, +<0.11946,0.06919,ZP>, +<0.11948,0.08178,ZP>, +<0.11951,0.09437,ZP>, +<0.11953,0.10697,ZP>, +<0.11957,0.11957,ZP>, +<0.11961,0.13218,ZP>, +<0.11965,0.14479,ZP>, +<0.11970,0.15742,ZP>, +<0.11975,0.17005,ZP>, +<0.11982,0.18269,ZP>, +<0.11988,0.19535,ZP>, +<0.11996,0.20801,ZP>, +<0.12004,0.22069,ZP>, +<0.12013,0.23338,ZP>, +<0.12022,0.24609,ZP>, +<0.12032,0.25881,ZP>, +<0.12042,0.27155,ZP>, +<0.12053,0.28430,ZP>, +<0.12063,0.29707,ZP>, +<0.12073,0.30985,ZP>, +<0.12083,0.32266,ZP>, +<0.12093,0.33548,ZP>, +<0.12102,0.34833,ZP>, +<0.12109,0.36121,ZP>, +<0.12117,0.37411,ZP>, +<0.12123,0.38705,ZP>, +<0.12127,0.40001,ZP>, +<0.12130,0.41301,ZP>, +<0.12128,0.42605,ZP>, +<0.12121,0.43907,ZP>, +<0.12120,0.45236,ZP>, +<0.12088,0.46511,ZP>, +<0.12126,0.47941,0.65930>, +<0.11956,0.48554,0.64544>, +<0.11634,0.48628,0.63284>, +<0.11313,0.48787,0.61992>, +<0.11004,0.48774,0.60709>, +<0.10699,0.48765,0.59447>, +<0.10392,0.48753,0.58202>, +<0.10080,0.48754,0.56945> +<0.11588,-0.50450,0.56826>, +<0.11897,-0.50137,0.58035>, +<0.12153,-0.49794,0.59249>, +<0.12382,-0.49389,0.60487>, +<0.12604,-0.48948,0.61699>, +<0.12825,-0.48435,0.62954>, +<0.13186,-0.48230,0.64192>, +<0.13486,-0.47985,0.65598>, +<0.13432,-0.46521,ZP>, +<0.13446,-0.45240,ZP>, +<0.13458,-0.43919,ZP>, +<0.13453,-0.42609,ZP>, +<0.13450,-0.41303,ZP>, +<0.13441,-0.40000,ZP>, +<0.13432,-0.38703,ZP>, +<0.13422,-0.37410,ZP>, +<0.13411,-0.36122,ZP>, +<0.13399,-0.34837,ZP>, +<0.13386,-0.33554,ZP>, +<0.13373,-0.32274,ZP>, +<0.13359,-0.30995,ZP>, +<0.13346,-0.29718,ZP>, +<0.13332,-0.28442,ZP>, +<0.13319,-0.27167,ZP>, +<0.13306,-0.25893,ZP>, +<0.13295,-0.24621,ZP>, +<0.13283,-0.23350,ZP>, +<0.13273,-0.22080,ZP>, +<0.13264,-0.20812,ZP>, +<0.13255,-0.19544,ZP>, +<0.13247,-0.18278,ZP>, +<0.13240,-0.17013,ZP>, +<0.13233,-0.15749,ZP>, +<0.13227,-0.14485,ZP>, +<0.13222,-0.13223,ZP>, +<0.13218,-0.11961,ZP>, +<0.13214,-0.10700,ZP>, +<0.13210,-0.09440,ZP>, +<0.13208,-0.08180,ZP>, +<0.13205,-0.06921,ZP>, +<0.13203,-0.05662,ZP>, +<0.13202,-0.04403,ZP>, +<0.13201,-0.03145,ZP>, +<0.13200,-0.01887,ZP>, +<0.13199,-0.00629,ZP>, +<0.13199,0.00629,ZP>, +<0.13200,0.01887,ZP>, +<0.13201,0.03145,ZP>, +<0.13202,0.04404,ZP>, +<0.13203,0.05662,ZP>, +<0.13205,0.06921,ZP>, +<0.13208,0.08180,ZP>, +<0.13211,0.09440,ZP>, +<0.13214,0.10700,ZP>, +<0.13218,0.11961,ZP>, +<0.13222,0.13222,ZP>, +<0.13227,0.14484,ZP>, +<0.13233,0.15747,ZP>, +<0.13239,0.17011,ZP>, +<0.13246,0.18276,ZP>, +<0.13254,0.19543,ZP>, +<0.13262,0.20810,ZP>, +<0.13272,0.22079,ZP>, +<0.13281,0.23349,ZP>, +<0.13292,0.24621,ZP>, +<0.13303,0.25894,ZP>, +<0.13315,0.27169,ZP>, +<0.13327,0.28446,ZP>, +<0.13339,0.29724,ZP>, +<0.13351,0.31004,ZP>, +<0.13363,0.32286,ZP>, +<0.13373,0.33570,ZP>, +<0.13383,0.34856,ZP>, +<0.13392,0.36145,ZP>, +<0.13399,0.37437,ZP>, +<0.13406,0.38733,ZP>, +<0.13410,0.40031,ZP>, +<0.13413,0.41335,ZP>, +<0.13410,0.42641,ZP>, +<0.13409,0.43951,ZP>, +<0.13390,0.45270,ZP>, +<0.13373,0.46553,0.66007>, +<0.13424,0.48019,0.65576>, +<0.13124,0.48247,0.64170>, +<0.12788,0.48480,0.62944>, +<0.12498,0.48909,0.61673>, +<0.12133,0.49180,0.60423>, +<0.11762,0.49381,0.59162>, +<0.11401,0.49506,0.57946>, +<0.11030,0.49589,0.56702> +<0.12473,-0.49613,0.56373>, +<0.12714,-0.49287,0.57587>, +<0.12881,-0.48871,0.58790>, +<0.13079,-0.48453,0.60017>, +<0.13444,-0.48165,0.61264>, +<0.13880,-0.48036,0.62552>, +<0.14317,-0.47907,0.63781>, +<0.14707,-0.47809,0.65066>, +<0.14726,-0.46581,0.66018>, +<0.14718,-0.45271,ZP>, +<0.14747,-0.43969,ZP>, +<0.14733,-0.42642,ZP>, +<0.14731,-0.41334,ZP>, +<0.14724,-0.40028,ZP>, +<0.14716,-0.38729,ZP>, +<0.14707,-0.37436,ZP>, +<0.14696,-0.36147,ZP>, +<0.14684,-0.34861,ZP>, +<0.14671,-0.33578,ZP>, +<0.14656,-0.32297,ZP>, +<0.14641,-0.31016,ZP>, +<0.14625,-0.29738,ZP>, +<0.14610,-0.28460,ZP>, +<0.14595,-0.27184,ZP>, +<0.14580,-0.25909,ZP>, +<0.14567,-0.24635,ZP>, +<0.14554,-0.23363,ZP>, +<0.14542,-0.22092,ZP>, +<0.14531,-0.20822,ZP>, +<0.14521,-0.19553,ZP>, +<0.14512,-0.18286,ZP>, +<0.14504,-0.17020,ZP>, +<0.14497,-0.15755,ZP>, +<0.14490,-0.14491,ZP>, +<0.14484,-0.13228,ZP>, +<0.14479,-0.11966,ZP>, +<0.14475,-0.10704,ZP>, +<0.14471,-0.09443,ZP>, +<0.14468,-0.08183,ZP>, +<0.14465,-0.06923,ZP>, +<0.14463,-0.05664,ZP>, +<0.14461,-0.04405,ZP>, +<0.14460,-0.03146,ZP>, +<0.14459,-0.01887,ZP>, +<0.14458,-0.00629,ZP>, +<0.14459,0.00629,ZP>, +<0.14459,0.01888,ZP>, +<0.14460,0.03146,ZP>, +<0.14461,0.04405,ZP>, +<0.14463,0.05664,ZP>, +<0.14465,0.06923,ZP>, +<0.14468,0.08183,ZP>, +<0.14471,0.09443,ZP>, +<0.14475,0.10704,ZP>, +<0.14479,0.11965,ZP>, +<0.14485,0.13227,ZP>, +<0.14490,0.14490,ZP>, +<0.14497,0.15754,ZP>, +<0.14504,0.17019,ZP>, +<0.14512,0.18285,ZP>, +<0.14520,0.19552,ZP>, +<0.14530,0.20820,ZP>, +<0.14540,0.22090,ZP>, +<0.14552,0.23361,ZP>, +<0.14564,0.24635,ZP>, +<0.14577,0.25909,ZP>, +<0.14590,0.27186,ZP>, +<0.14604,0.28464,ZP>, +<0.14618,0.29744,ZP>, +<0.14631,0.31025,ZP>, +<0.14644,0.32309,ZP>, +<0.14657,0.33594,ZP>, +<0.14667,0.34882,ZP>, +<0.14677,0.36172,ZP>, +<0.14685,0.37466,ZP>, +<0.14691,0.38763,ZP>, +<0.14696,0.40065,ZP>, +<0.14699,0.41372,ZP>, +<0.14695,0.42679,ZP>, +<0.14703,0.44003,ZP>, +<0.14668,0.45303,ZP>, +<0.14672,0.46612,0.66018>, +<0.14647,0.47827,0.65054>, +<0.14265,0.47929,0.63759>, +<0.13929,0.48309,0.62544>, +<0.13663,0.48767,0.61296>, +<0.13319,0.49131,0.60082>, +<0.12977,0.49449,0.58817>, +<0.12605,0.49712,0.57643>, +<0.12217,0.49944,0.56410> +<0.12795,-0.48460,0.55973>, +<0.13107,-0.48148,0.57181>, +<0.13506,-0.47904,0.58379>, +<0.13946,-0.47729,0.59607>, +<0.14536,-0.47843,0.60832>, +<0.14964,-0.47710,0.62094>, +<0.15413,-0.47567,0.63340>, +<0.15844,-0.47431,0.64577>, +<0.16048,-0.46733,0.65953>, +<0.15990,-0.45306,ZP>, +<0.16014,-0.44011,ZP>, +<0.16009,-0.42677,ZP>, +<0.16007,-0.41364,ZP>, +<0.16006,-0.40058,ZP>, +<0.16002,-0.38760,ZP>, +<0.15995,-0.37467,ZP>, +<0.15986,-0.36177,ZP>, +<0.15973,-0.34891,ZP>, +<0.15959,-0.33606,ZP>, +<0.15942,-0.32323,ZP>, +<0.15925,-0.31041,ZP>, +<0.15907,-0.29760,ZP>, +<0.15890,-0.28481,ZP>, +<0.15872,-0.27202,ZP>, +<0.15856,-0.25926,ZP>, +<0.15841,-0.24650,ZP>, +<0.15826,-0.23377,ZP>, +<0.15813,-0.22104,ZP>, +<0.15800,-0.20833,ZP>, +<0.15789,-0.19564,ZP>, +<0.15779,-0.18295,ZP>, +<0.15770,-0.17028,ZP>, +<0.15761,-0.15762,ZP>, +<0.15754,-0.14498,ZP>, +<0.15747,-0.13234,ZP>, +<0.15742,-0.11971,ZP>, +<0.15737,-0.10708,ZP>, +<0.15732,-0.09447,ZP>, +<0.15729,-0.08186,ZP>, +<0.15725,-0.06926,ZP>, +<0.15723,-0.05666,ZP>, +<0.15721,-0.04406,ZP>, +<0.15719,-0.03147,ZP>, +<0.15719,-0.01888,ZP>, +<0.15718,-0.00629,ZP>, +<0.15718,0.00630,ZP>, +<0.15719,0.01889,ZP>, +<0.15720,0.03148,ZP>, +<0.15721,0.04407,ZP>, +<0.15723,0.05666,ZP>, +<0.15726,0.06926,ZP>, +<0.15729,0.08186,ZP>, +<0.15733,0.09447,ZP>, +<0.15737,0.10708,ZP>, +<0.15742,0.11970,ZP>, +<0.15748,0.13233,ZP>, +<0.15754,0.14497,ZP>, +<0.15761,0.15761,ZP>, +<0.15769,0.17027,ZP>, +<0.15778,0.18294,ZP>, +<0.15788,0.19562,ZP>, +<0.15799,0.20831,ZP>, +<0.15810,0.22102,ZP>, +<0.15823,0.23375,ZP>, +<0.15837,0.24650,ZP>, +<0.15851,0.25926,ZP>, +<0.15866,0.27204,ZP>, +<0.15882,0.28484,ZP>, +<0.15898,0.29766,ZP>, +<0.15914,0.31049,ZP>, +<0.15929,0.32335,ZP>, +<0.15943,0.33622,ZP>, +<0.15955,0.34912,ZP>, +<0.15965,0.36204,ZP>, +<0.15973,0.37499,ZP>, +<0.15979,0.38797,ZP>, +<0.15983,0.40101,ZP>, +<0.15984,0.41409,ZP>, +<0.15984,0.42720,ZP>, +<0.15985,0.44049,ZP>, +<0.15956,0.45337,ZP>, +<0.16007,0.46758,0.65948>, +<0.15799,0.47446,0.64577>, +<0.15364,0.47582,0.63343>, +<0.14946,0.47796,0.62083>, +<0.14592,0.48130,0.60827>, +<0.14299,0.48513,0.59629>, +<0.14009,0.48862,0.58360>, +<0.13713,0.49159,0.57200>, +<0.13356,0.49473,0.55975> +<0.13444,-0.47441,0.55573>, +<0.13914,-0.47265,0.56758>, +<0.14424,-0.47146,0.57960>, +<0.14938,-0.47132,0.59171>, +<0.15559,-0.47522,0.60362>, +<0.16009,-0.47370,0.61609>, +<0.16471,-0.47211,0.62869>, +<0.16945,-0.47044,0.64084>, +<0.17352,-0.46824,0.65450>, +<0.17287,-0.45358,0.66014>, +<0.17286,-0.44050,ZP>, +<0.17301,-0.42729,ZP>, +<0.17291,-0.41400,ZP>, +<0.17295,-0.40096,ZP>, +<0.17294,-0.38798,ZP>, +<0.17288,-0.37503,ZP>, +<0.17279,-0.36214,ZP>, +<0.17266,-0.34925,ZP>, +<0.17250,-0.33639,ZP>, +<0.17231,-0.32353,ZP>, +<0.17211,-0.31069,ZP>, +<0.17191,-0.29785,ZP>, +<0.17171,-0.28504,ZP>, +<0.17152,-0.27223,ZP>, +<0.17133,-0.25945,ZP>, +<0.17116,-0.24668,ZP>, +<0.17100,-0.23392,ZP>, +<0.17085,-0.22118,ZP>, +<0.17071,-0.20846,ZP>, +<0.17058,-0.19575,ZP>, +<0.17047,-0.18306,ZP>, +<0.17036,-0.17037,ZP>, +<0.17027,-0.15770,ZP>, +<0.17019,-0.14505,ZP>, +<0.17011,-0.13240,ZP>, +<0.17005,-0.11976,ZP>, +<0.16999,-0.10713,ZP>, +<0.16994,-0.09451,ZP>, +<0.16990,-0.08189,ZP>, +<0.16987,-0.06928,ZP>, +<0.16984,-0.05668,ZP>, +<0.16982,-0.04408,ZP>, +<0.16980,-0.03148,ZP>, +<0.16979,-0.01889,ZP>, +<0.16978,-0.00629,ZP>, +<0.16978,0.00630,ZP>, +<0.16979,0.01890,ZP>, +<0.16980,0.03149,ZP>, +<0.16982,0.04409,ZP>, +<0.16984,0.05669,ZP>, +<0.16987,0.06929,ZP>, +<0.16991,0.08190,ZP>, +<0.16995,0.09451,ZP>, +<0.17000,0.10713,ZP>, +<0.17005,0.11976,ZP>, +<0.17012,0.13239,ZP>, +<0.17019,0.14504,ZP>, +<0.17027,0.15769,ZP>, +<0.17036,0.17036,ZP>, +<0.17046,0.18304,ZP>, +<0.17057,0.19573,ZP>, +<0.17069,0.20844,ZP>, +<0.17082,0.22116,ZP>, +<0.17096,0.23390,ZP>, +<0.17111,0.24666,ZP>, +<0.17127,0.25944,ZP>, +<0.17144,0.27224,ZP>, +<0.17162,0.28506,ZP>, +<0.17180,0.29790,ZP>, +<0.17198,0.31076,ZP>, +<0.17215,0.32364,ZP>, +<0.17231,0.33654,ZP>, +<0.17246,0.34945,ZP>, +<0.17257,0.36239,ZP>, +<0.17266,0.37535,ZP>, +<0.17272,0.38836,ZP>, +<0.17275,0.40139,ZP>, +<0.17274,0.41447,ZP>, +<0.17286,0.42774,ZP>, +<0.17270,0.44087,ZP>, +<0.17266,0.45386,0.66012>, +<0.17325,0.46837,0.65445>, +<0.16916,0.47054,0.64088>, +<0.16438,0.47223,0.62878>, +<0.15967,0.47384,0.61615>, +<0.15505,0.47538,0.60373>, +<0.14978,0.47562,0.59189>, +<0.14556,0.47813,0.57940>, +<0.14245,0.48122,0.56773>, +<0.13941,0.48463,0.55528> +<0.14481,-0.46841,0.55119>, +<0.15024,-0.46836,0.56282>, +<0.15539,-0.46869,0.57473>, +<0.16047,-0.46946,0.58667>, +<0.16536,-0.46977,0.59874>, +<0.17053,-0.47003,0.61090>, +<0.17526,-0.46929,0.62344>, +<0.17987,-0.46656,0.63541>, +<0.18479,-0.46478,0.64801>, +<0.18586,-0.45443,0.66038>, +<0.18531,-0.44072,0.66010>, +<0.18562,-0.42759,ZP>, +<0.18577,-0.41442,ZP>, +<0.18585,-0.40138,ZP>, +<0.18589,-0.38841,ZP>, +<0.18587,-0.37548,ZP>, +<0.18577,-0.36257,ZP>, +<0.18563,-0.34966,ZP>, +<0.18544,-0.33676,ZP>, +<0.18522,-0.32387,ZP>, +<0.18500,-0.31100,ZP>, +<0.18477,-0.29814,ZP>, +<0.18455,-0.28529,ZP>, +<0.18433,-0.27247,ZP>, +<0.18412,-0.25966,ZP>, +<0.18393,-0.24687,ZP>, +<0.18375,-0.23409,ZP>, +<0.18358,-0.22134,ZP>, +<0.18343,-0.20860,ZP>, +<0.18328,-0.19588,ZP>, +<0.18316,-0.18317,ZP>, +<0.18304,-0.17048,ZP>, +<0.18294,-0.15779,ZP>, +<0.18284,-0.14513,ZP>, +<0.18276,-0.13247,ZP>, +<0.18269,-0.11982,ZP>, +<0.18263,-0.10718,ZP>, +<0.18257,-0.09455,ZP>, +<0.18252,-0.08193,ZP>, +<0.18249,-0.06931,ZP>, +<0.18245,-0.05670,ZP>, +<0.18243,-0.04410,ZP>, +<0.18241,-0.03149,ZP>, +<0.18240,-0.01889,ZP>, +<0.18239,-0.00629,ZP>, +<0.18240,0.00631,ZP>, +<0.18240,0.01890,ZP>, +<0.18242,0.03150,ZP>, +<0.18243,0.04411,ZP>, +<0.18246,0.05671,ZP>, +<0.18249,0.06932,ZP>, +<0.18253,0.08194,ZP>, +<0.18258,0.09456,ZP>, +<0.18263,0.10719,ZP>, +<0.18270,0.11982,ZP>, +<0.18277,0.13246,ZP>, +<0.18285,0.14512,ZP>, +<0.18294,0.15778,ZP>, +<0.18304,0.17046,ZP>, +<0.18315,0.18315,ZP>, +<0.18327,0.19586,ZP>, +<0.18341,0.20858,ZP>, +<0.18355,0.22131,ZP>, +<0.18371,0.23407,ZP>, +<0.18387,0.24685,ZP>, +<0.18405,0.25964,ZP>, +<0.18424,0.27246,ZP>, +<0.18444,0.28530,ZP>, +<0.18464,0.29817,ZP>, +<0.18485,0.31106,ZP>, +<0.18505,0.32396,ZP>, +<0.18523,0.33689,ZP>, +<0.18540,0.34983,ZP>, +<0.18553,0.36279,ZP>, +<0.18563,0.37577,ZP>, +<0.18570,0.38878,ZP>, +<0.18570,0.40180,ZP>, +<0.18571,0.41488,ZP>, +<0.18566,0.42806,ZP>, +<0.18558,0.44112,ZP>, +<0.18612,0.45460,0.66028>, +<0.18505,0.46470,0.64807>, +<0.18009,0.46647,0.63585>, +<0.17484,0.46845,0.62375>, +<0.17000,0.47025,0.61121>, +<0.16350,0.46787,0.59900>, +<0.15853,0.46830,0.58726>, +<0.15328,0.46925,0.57492>, +<0.14824,0.47090,0.56361>, +<0.14338,0.47309,0.55163> +<0.15658,-0.46936,0.54610>, +<0.16180,-0.47020,0.55770>, +<0.16656,-0.47112,0.56956>, +<0.17139,-0.47223,0.58151>, +<0.17631,-0.47280,0.59370>, +<0.18123,-0.47154,0.60578>, +<0.18641,-0.46913,0.61816>, +<0.19062,-0.46408,0.62998>, +<0.19530,-0.46032,0.64213>, +<0.19960,-0.45679,0.65627>, +<0.19839,-0.44128,0.66020>, +<0.19857,-0.42816,0.66007>, +<0.19886,-0.41514,ZP>, +<0.19886,-0.40192,ZP>, +<0.19894,-0.38896,ZP>, +<0.19892,-0.37602,ZP>, +<0.19880,-0.36306,ZP>, +<0.19862,-0.35012,ZP>, +<0.19840,-0.33718,ZP>, +<0.19816,-0.32425,ZP>, +<0.19791,-0.31134,ZP>, +<0.19765,-0.29844,ZP>, +<0.19740,-0.28557,ZP>, +<0.19716,-0.27272,ZP>, +<0.19693,-0.25989,ZP>, +<0.19672,-0.24708,ZP>, +<0.19651,-0.23428,ZP>, +<0.19633,-0.22151,ZP>, +<0.19616,-0.20875,ZP>, +<0.19600,-0.19602,ZP>, +<0.19586,-0.18329,ZP>, +<0.19573,-0.17059,ZP>, +<0.19562,-0.15789,ZP>, +<0.19551,-0.14521,ZP>, +<0.19542,-0.13254,ZP>, +<0.19534,-0.11989,ZP>, +<0.19527,-0.10724,ZP>, +<0.19521,-0.09460,ZP>, +<0.19516,-0.08197,ZP>, +<0.19511,-0.06935,ZP>, +<0.19508,-0.05673,ZP>, +<0.19505,-0.04411,ZP>, +<0.19503,-0.03151,ZP>, +<0.19502,-0.01890,ZP>, +<0.19501,-0.00629,ZP>, +<0.19501,0.00631,ZP>, +<0.19502,0.01891,ZP>, +<0.19504,0.03152,ZP>, +<0.19506,0.04413,ZP>, +<0.19509,0.05674,ZP>, +<0.19512,0.06936,ZP>, +<0.19517,0.08198,ZP>, +<0.19522,0.09461,ZP>, +<0.19528,0.10725,ZP>, +<0.19535,0.11989,ZP>, +<0.19543,0.13254,ZP>, +<0.19552,0.14521,ZP>, +<0.19562,0.15788,ZP>, +<0.19573,0.17057,ZP>, +<0.19586,0.18328,ZP>, +<0.19599,0.19599,ZP>, +<0.19614,0.20873,ZP>, +<0.19630,0.22148,ZP>, +<0.19647,0.23425,ZP>, +<0.19666,0.24705,ZP>, +<0.19685,0.25986,ZP>, +<0.19706,0.27270,ZP>, +<0.19728,0.28557,ZP>, +<0.19751,0.29846,ZP>, +<0.19774,0.31138,ZP>, +<0.19797,0.32432,ZP>, +<0.19818,0.33728,ZP>, +<0.19838,0.35025,ZP>, +<0.19854,0.36324,ZP>, +<0.19867,0.37624,ZP>, +<0.19873,0.38926,ZP>, +<0.19874,0.40227,ZP>, +<0.19888,0.41549,ZP>, +<0.19864,0.42838,ZP>, +<0.19869,0.44150,0.66011>, +<0.19999,0.45657,0.65622>, +<0.19575,0.46016,0.64241>, +<0.19044,0.46233,0.63044>, +<0.18526,0.46537,0.61819>, +<0.18025,0.46639,0.60586>, +<0.17452,0.46591,0.59365>, +<0.16955,0.46537,0.58185>, +<0.16438,0.46488,0.56983>, +<0.15852,0.46491,0.55853>, +<0.15295,0.46546,0.54682> +<0.16608,-0.47637,0.54137>, +<0.17106,-0.47761,0.55324>, +<0.17628,-0.47769,0.56488>, +<0.18176,-0.47678,0.57681>, +<0.18718,-0.47470,0.58884>, +<0.19236,-0.47115,0.60056>, +<0.19701,-0.46667,0.61219>, +<0.20084,-0.46044,0.62403>, +<0.20470,-0.45622,0.63581>, +<0.20531,-0.45004,0.65044>, +<0.21099,-0.44216,0.66056>, +<0.21114,-0.42862,0.66014>, +<0.21154,-0.41536,0.66008>, +<0.21201,-0.40265,ZP>, +<0.21204,-0.38963,ZP>, +<0.21201,-0.37665,ZP>, +<0.21186,-0.36363,ZP>, +<0.21165,-0.35063,ZP>, +<0.21140,-0.33764,ZP>, +<0.21112,-0.32466,ZP>, +<0.21084,-0.31171,ZP>, +<0.21056,-0.29878,ZP>, +<0.21028,-0.28588,ZP>, +<0.21001,-0.27299,ZP>, +<0.20976,-0.26014,ZP>, +<0.20952,-0.24730,ZP>, +<0.20930,-0.23449,ZP>, +<0.20910,-0.22170,ZP>, +<0.20891,-0.20892,ZP>, +<0.20873,-0.19617,ZP>, +<0.20858,-0.18343,ZP>, +<0.20843,-0.17071,ZP>, +<0.20831,-0.15800,ZP>, +<0.20819,-0.14531,ZP>, +<0.20809,-0.13263,ZP>, +<0.20800,-0.11996,ZP>, +<0.20792,-0.10730,ZP>, +<0.20786,-0.09465,ZP>, +<0.20780,-0.08201,ZP>, +<0.20775,-0.06938,ZP>, +<0.20771,-0.05676,ZP>, +<0.20768,-0.04414,ZP>, +<0.20766,-0.03152,ZP>, +<0.20765,-0.01891,ZP>, +<0.20764,-0.00630,ZP>, +<0.20764,0.00631,ZP>, +<0.20765,0.01893,ZP>, +<0.20767,0.03154,ZP>, +<0.20769,0.04415,ZP>, +<0.20772,0.05677,ZP>, +<0.20776,0.06940,ZP>, +<0.20781,0.08203,ZP>, +<0.20787,0.09467,ZP>, +<0.20794,0.10731,ZP>, +<0.20802,0.11997,ZP>, +<0.20811,0.13263,ZP>, +<0.20821,0.14531,ZP>, +<0.20832,0.15799,ZP>, +<0.20844,0.17070,ZP>, +<0.20858,0.18341,ZP>, +<0.20873,0.19615,ZP>, +<0.20889,0.20890,ZP>, +<0.20907,0.22167,ZP>, +<0.20926,0.23446,ZP>, +<0.20946,0.24727,ZP>, +<0.20968,0.26010,ZP>, +<0.20990,0.27296,ZP>, +<0.21014,0.28585,ZP>, +<0.21040,0.29877,ZP>, +<0.21065,0.31172,ZP>, +<0.21091,0.32469,ZP>, +<0.21116,0.33769,ZP>, +<0.21139,0.35071,ZP>, +<0.21160,0.36374,ZP>, +<0.21176,0.37679,ZP>, +<0.21183,0.38979,ZP>, +<0.21189,0.40283,ZP>, +<0.21186,0.41593,ZP>, +<0.21178,0.42852,ZP>, +<0.21214,0.44190,0.66037>, +<0.21344,0.44713,0.65000>, +<0.20582,0.45571,0.63654>, +<0.20086,0.45890,0.62541>, +<0.19600,0.46420,0.61210>, +<0.19123,0.46712,0.60062>, +<0.18537,0.46916,0.58828>, +<0.17996,0.46862,0.57636>, +<0.17518,0.46714,0.56449>, +<0.16994,0.46638,0.55277>, +<0.16462,0.46594,0.54133> +<0.17598,-0.48278,0.53718>, +<0.18208,-0.48161,0.54848>, +<0.18792,-0.47971,0.55974>, +<0.19311,-0.47664,0.57153>, +<0.19818,-0.47245,0.58300>, +<0.20270,-0.46712,0.59438>, +<0.20627,-0.46142,0.60561>, +<0.20960,-0.45534,0.61766>, +<0.21469,-0.45162,0.62880>, +<0.22050,-0.44887,0.64140>, +<0.22534,-0.44524,0.65561>, +<0.22443,-0.42952,0.66025>, +<0.22482,-0.41647,0.66008>, +<0.22523,-0.40363,ZP>, +<0.22519,-0.39040,ZP>, +<0.22512,-0.37735,ZP>, +<0.22495,-0.36426,ZP>, +<0.22470,-0.35118,ZP>, +<0.22441,-0.33813,ZP>, +<0.22411,-0.32511,ZP>, +<0.22379,-0.31211,ZP>, +<0.22348,-0.29914,ZP>, +<0.22318,-0.28621,ZP>, +<0.22289,-0.27329,ZP>, +<0.22261,-0.26041,ZP>, +<0.22235,-0.24755,ZP>, +<0.22211,-0.23471,ZP>, +<0.22188,-0.22190,ZP>, +<0.22167,-0.20910,ZP>, +<0.22148,-0.19633,ZP>, +<0.22131,-0.18357,ZP>, +<0.22115,-0.17084,ZP>, +<0.22101,-0.15811,ZP>, +<0.22089,-0.14541,ZP>, +<0.22077,-0.13271,ZP>, +<0.22068,-0.12003,ZP>, +<0.22059,-0.10737,ZP>, +<0.22052,-0.09471,ZP>, +<0.22045,-0.08206,ZP>, +<0.22040,-0.06942,ZP>, +<0.22036,-0.05679,ZP>, +<0.22032,-0.04416,ZP>, +<0.22030,-0.03153,ZP>, +<0.22028,-0.01891,ZP>, +<0.22028,-0.00630,ZP>, +<0.22028,0.00632,ZP>, +<0.22029,0.01894,ZP>, +<0.22031,0.03156,ZP>, +<0.22033,0.04418,ZP>, +<0.22037,0.05681,ZP>, +<0.22041,0.06944,ZP>, +<0.22047,0.08208,ZP>, +<0.22053,0.09473,ZP>, +<0.22061,0.10738,ZP>, +<0.22069,0.12005,ZP>, +<0.22079,0.13273,ZP>, +<0.22090,0.14541,ZP>, +<0.22103,0.15811,ZP>, +<0.22116,0.17083,ZP>, +<0.22131,0.18356,ZP>, +<0.22148,0.19631,ZP>, +<0.22166,0.20908,ZP>, +<0.22185,0.22187,ZP>, +<0.22206,0.23468,ZP>, +<0.22228,0.24751,ZP>, +<0.22252,0.26036,ZP>, +<0.22277,0.27325,ZP>, +<0.22303,0.28616,ZP>, +<0.22331,0.29910,ZP>, +<0.22359,0.31208,ZP>, +<0.22388,0.32509,ZP>, +<0.22416,0.33813,ZP>, +<0.22444,0.35120,ZP>, +<0.22469,0.36429,ZP>, +<0.22489,0.37737,ZP>, +<0.22500,0.39039,ZP>, +<0.22520,0.40357,ZP>, +<0.22496,0.41644,0.66008>, +<0.22526,0.42925,0.66018>, +<0.22663,0.44459,0.65548>, +<0.22132,0.44842,0.64179>, +<0.21452,0.45169,0.62950>, +<0.21066,0.45599,0.61868>, +<0.20639,0.46166,0.60598>, +<0.20208,0.46605,0.59505>, +<0.19658,0.46984,0.58306>, +<0.19049,0.47238,0.57134>, +<0.18478,0.47348,0.55977>, +<0.17919,0.47384,0.54819>, +<0.17372,0.47323,0.53653> +<0.18790,-0.48425,0.53200>, +<0.19365,-0.48050,0.54285>, +<0.19849,-0.47612,0.55388>, +<0.20283,-0.47106,0.56520>, +<0.20643,-0.46556,0.57618>, +<0.20962,-0.45945,0.58749>, +<0.21296,-0.45359,0.59896>, +<0.21827,-0.44987,0.61031>, +<0.22428,-0.44691,0.62311>, +<0.23011,-0.44396,0.63503>, +<0.23874,-0.43670,0.64348>, +<0.23800,-0.43175,0.66013>, +<0.23787,-0.41766,0.66009>, +<0.23835,-0.40459,ZP>, +<0.23846,-0.39140,ZP>, +<0.23824,-0.37809,ZP>, +<0.23804,-0.36493,ZP>, +<0.23777,-0.35178,ZP>, +<0.23745,-0.33867,ZP>, +<0.23712,-0.32559,ZP>, +<0.23678,-0.31255,ZP>, +<0.23643,-0.29954,ZP>, +<0.23610,-0.28656,ZP>, +<0.23579,-0.27362,ZP>, +<0.23548,-0.26070,ZP>, +<0.23520,-0.24782,ZP>, +<0.23493,-0.23495,ZP>, +<0.23468,-0.22212,ZP>, +<0.23445,-0.20930,ZP>, +<0.23425,-0.19651,ZP>, +<0.23406,-0.18373,ZP>, +<0.23389,-0.17098,ZP>, +<0.23373,-0.15824,ZP>, +<0.23359,-0.14552,ZP>, +<0.23347,-0.13281,ZP>, +<0.23336,-0.12012,ZP>, +<0.23327,-0.10744,ZP>, +<0.23319,-0.09477,ZP>, +<0.23312,-0.08211,ZP>, +<0.23306,-0.06946,ZP>, +<0.23301,-0.05682,ZP>, +<0.23298,-0.04418,ZP>, +<0.23295,-0.03155,ZP>, +<0.23293,-0.01892,ZP>, +<0.23293,-0.00630,ZP>, +<0.23293,0.00633,ZP>, +<0.23294,0.01895,ZP>, +<0.23296,0.03158,ZP>, +<0.23299,0.04421,ZP>, +<0.23303,0.05685,ZP>, +<0.23308,0.06949,ZP>, +<0.23314,0.08214,ZP>, +<0.23321,0.09479,ZP>, +<0.23329,0.10746,ZP>, +<0.23339,0.12014,ZP>, +<0.23349,0.13283,ZP>, +<0.23361,0.14553,ZP>, +<0.23375,0.15825,ZP>, +<0.23390,0.17098,ZP>, +<0.23406,0.18372,ZP>, +<0.23425,0.19649,ZP>, +<0.23444,0.20928,ZP>, +<0.23466,0.22208,ZP>, +<0.23489,0.23491,ZP>, +<0.23513,0.24777,ZP>, +<0.23539,0.26064,ZP>, +<0.23567,0.27355,ZP>, +<0.23595,0.28649,ZP>, +<0.23625,0.29946,ZP>, +<0.23656,0.31247,ZP>, +<0.23688,0.32552,ZP>, +<0.23719,0.33860,ZP>, +<0.23751,0.35172,ZP>, +<0.23780,0.36486,ZP>, +<0.23804,0.37799,ZP>, +<0.23835,0.39121,ZP>, +<0.23846,0.40431,ZP>, +<0.23826,0.41691,0.66016>, +<0.23906,0.43092,0.66023>, +<0.23217,0.43989,0.64326>, +<0.23088,0.44357,0.63402>, +<0.22470,0.44670,0.62290>, +<0.21890,0.45038,0.61169>, +<0.21491,0.45580,0.59940>, +<0.21142,0.46143,0.58853>, +<0.20721,0.46675,0.57694>, +<0.20164,0.47146,0.56560>, +<0.19603,0.47477,0.55422>, +<0.19008,0.47716,0.54306>, +<0.18396,0.47893,0.53190> +<0.19797,-0.47891,0.52557>, +<0.20220,-0.47346,0.53637>, +<0.20565,-0.46790,0.54727>, +<0.20850,-0.46200,0.55841>, +<0.21060,-0.45568,0.56951>, +<0.21430,-0.45017,0.58104>, +<0.21974,-0.44602,0.59252>, +<0.22753,-0.44528,0.60418>, +<0.23329,-0.44228,0.61615>, +<0.23916,-0.43914,0.62775>, +<0.24584,-0.43547,0.63848>, +<0.25115,-0.43278,0.65105>, +<0.25117,-0.41892,0.66033>, +<0.25142,-0.40547,0.66009>, +<0.25161,-0.39231,ZP>, +<0.25145,-0.37895,ZP>, +<0.25115,-0.36563,ZP>, +<0.25087,-0.35242,ZP>, +<0.25052,-0.33924,ZP>, +<0.25016,-0.32610,ZP>, +<0.24979,-0.31301,ZP>, +<0.24942,-0.29996,ZP>, +<0.24906,-0.28694,ZP>, +<0.24871,-0.27397,ZP>, +<0.24838,-0.26102,ZP>, +<0.24807,-0.24810,ZP>, +<0.24777,-0.23521,ZP>, +<0.24750,-0.22235,ZP>, +<0.24725,-0.20951,ZP>, +<0.24703,-0.19669,ZP>, +<0.24682,-0.18390,ZP>, +<0.24663,-0.17113,ZP>, +<0.24647,-0.15837,ZP>, +<0.24632,-0.14564,ZP>, +<0.24618,-0.13291,ZP>, +<0.24606,-0.12021,ZP>, +<0.24596,-0.10751,ZP>, +<0.24587,-0.09483,ZP>, +<0.24579,-0.08216,ZP>, +<0.24573,-0.06950,ZP>, +<0.24568,-0.05685,ZP>, +<0.24564,-0.04421,ZP>, +<0.24561,-0.03157,ZP>, +<0.24559,-0.01893,ZP>, +<0.24559,-0.00630,ZP>, +<0.24559,0.00633,ZP>, +<0.24560,0.01897,ZP>, +<0.24562,0.03160,ZP>, +<0.24565,0.04424,ZP>, +<0.24569,0.05689,ZP>, +<0.24575,0.06954,ZP>, +<0.24581,0.08220,ZP>, +<0.24589,0.09487,ZP>, +<0.24598,0.10755,ZP>, +<0.24609,0.12024,ZP>, +<0.24621,0.13294,ZP>, +<0.24634,0.14566,ZP>, +<0.24649,0.15839,ZP>, +<0.24665,0.17113,ZP>, +<0.24684,0.18390,ZP>, +<0.24703,0.19668,ZP>, +<0.24725,0.20949,ZP>, +<0.24748,0.22231,ZP>, +<0.24774,0.23517,ZP>, +<0.24801,0.24804,ZP>, +<0.24830,0.26095,ZP>, +<0.24860,0.27388,ZP>, +<0.24891,0.28684,ZP>, +<0.24923,0.29984,ZP>, +<0.24956,0.31287,ZP>, +<0.24990,0.32595,ZP>, +<0.25025,0.33909,ZP>, +<0.25061,0.35226,ZP>, +<0.25093,0.36545,ZP>, +<0.25129,0.37872,ZP>, +<0.25159,0.39196,ZP>, +<0.25160,0.40501,0.66009>, +<0.25188,0.41805,0.66040>, +<0.25230,0.43218,0.65105>, +<0.24611,0.43534,0.63917>, +<0.24011,0.43862,0.62789>, +<0.23401,0.44189,0.61611>, +<0.22793,0.44505,0.60447>, +<0.22128,0.44771,0.59266>, +<0.21730,0.45296,0.58149>, +<0.21428,0.45908,0.57005>, +<0.21037,0.46495,0.55913>, +<0.20604,0.47028,0.54791>, +<0.20111,0.47496,0.53707>, +<0.19557,0.47934,0.52617> +<0.20317,-0.46931,0.51873>, +<0.20591,-0.46340,0.52980>, +<0.20762,-0.45730,0.54081>, +<0.21014,-0.45123,0.55202>, +<0.21449,-0.44598,0.56314>, +<0.22039,-0.44179,0.57437>, +<0.22723,-0.43915,0.58577>, +<0.23433,-0.43743,0.59723>, +<0.24206,-0.43754,0.60859>, +<0.24845,-0.43398,0.61941>, +<0.25523,-0.43005,0.63064>, +<0.26046,-0.42693,0.64265>, +<0.26573,-0.42211,0.65595>, +<0.26463,-0.40648,0.66024>, +<0.26462,-0.39310,0.66008>, +<0.26463,-0.37980,ZP>, +<0.26431,-0.36636,ZP>, +<0.26400,-0.35309,ZP>, +<0.26363,-0.33985,ZP>, +<0.26323,-0.32665,ZP>, +<0.26283,-0.31350,ZP>, +<0.26243,-0.30041,ZP>, +<0.26204,-0.28736,ZP>, +<0.26166,-0.27434,ZP>, +<0.26130,-0.26135,ZP>, +<0.26096,-0.24840,ZP>, +<0.26064,-0.23548,ZP>, +<0.26035,-0.22259,ZP>, +<0.26008,-0.20973,ZP>, +<0.25983,-0.19689,ZP>, +<0.25961,-0.18408,ZP>, +<0.25940,-0.17129,ZP>, +<0.25922,-0.15852,ZP>, +<0.25905,-0.14576,ZP>, +<0.25891,-0.13302,ZP>, +<0.25878,-0.12030,ZP>, +<0.25866,-0.10759,ZP>, +<0.25857,-0.09490,ZP>, +<0.25848,-0.08222,ZP>, +<0.25842,-0.06955,ZP>, +<0.25836,-0.05689,ZP>, +<0.25832,-0.04423,ZP>, +<0.25829,-0.03159,ZP>, +<0.25827,-0.01894,ZP>, +<0.25826,-0.00630,ZP>, +<0.25826,0.00634,ZP>, +<0.25827,0.01898,ZP>, +<0.25830,0.03163,ZP>, +<0.25833,0.04427,ZP>, +<0.25838,0.05693,ZP>, +<0.25843,0.06959,ZP>, +<0.25850,0.08226,ZP>, +<0.25859,0.09494,ZP>, +<0.25869,0.10764,ZP>, +<0.25880,0.12034,ZP>, +<0.25893,0.13306,ZP>, +<0.25908,0.14579,ZP>, +<0.25925,0.15854,ZP>, +<0.25943,0.17131,ZP>, +<0.25963,0.18409,ZP>, +<0.25984,0.19689,ZP>, +<0.26008,0.20971,ZP>, +<0.26033,0.22256,ZP>, +<0.26061,0.23544,ZP>, +<0.26091,0.24834,ZP>, +<0.26122,0.26127,ZP>, +<0.26156,0.27423,ZP>, +<0.26190,0.28722,ZP>, +<0.26225,0.30024,ZP>, +<0.26260,0.31330,ZP>, +<0.26297,0.32642,ZP>, +<0.26336,0.33961,ZP>, +<0.26375,0.35283,ZP>, +<0.26411,0.36606,ZP>, +<0.26454,0.37945,ZP>, +<0.26471,0.39263,0.66008>, +<0.26492,0.40588,0.66023>, +<0.26664,0.42133,0.65629>, +<0.26146,0.42636,0.64262>, +<0.25515,0.43005,0.63149>, +<0.24891,0.43367,0.62028>, +<0.24279,0.43714,0.60860>, +<0.23495,0.43722,0.59709>, +<0.22801,0.44004,0.58568>, +<0.22178,0.44388,0.57454>, +<0.21708,0.44901,0.56341>, +<0.21466,0.45522,0.55232>, +<0.21211,0.46142,0.54105>, +<0.20857,0.46699,0.53028>, +<0.20436,0.47271,0.51931> +<0.20311,-0.45835,0.51251>, +<0.20576,-0.45232,0.52381>, +<0.20965,-0.44675,0.53463>, +<0.21482,-0.44165,0.54552>, +<0.22119,-0.43778,0.55644>, +<0.22840,-0.43546,0.56747>, +<0.23598,-0.43450,0.57849>, +<0.24342,-0.43403,0.58962>, +<0.25056,-0.43275,0.60089>, +<0.25735,-0.43006,0.61214>, +<0.26306,-0.42558,0.62336>, +<0.26939,-0.42126,0.63443>, +<0.27574,-0.41736,0.64560>, +<0.27900,-0.40882,0.65947>, +<0.27781,-0.39393,0.66019>, +<0.27775,-0.38058,0.66008>, +<0.27758,-0.36724,ZP>, +<0.27714,-0.35377,ZP>, +<0.27676,-0.34048,ZP>, +<0.27635,-0.32723,ZP>, +<0.27592,-0.31404,ZP>, +<0.27548,-0.30089,ZP>, +<0.27506,-0.28779,ZP>, +<0.27464,-0.27473,ZP>, +<0.27425,-0.26170,ZP>, +<0.27387,-0.24872,ZP>, +<0.27353,-0.23577,ZP>, +<0.27321,-0.22285,ZP>, +<0.27292,-0.20996,ZP>, +<0.27265,-0.19711,ZP>, +<0.27241,-0.18427,ZP>, +<0.27219,-0.17146,ZP>, +<0.27199,-0.15867,ZP>, +<0.27180,-0.14589,ZP>, +<0.27164,-0.13314,ZP>, +<0.27150,-0.12040,ZP>, +<0.27138,-0.10768,ZP>, +<0.27128,-0.09497,ZP>, +<0.27119,-0.08228,ZP>, +<0.27112,-0.06959,ZP>, +<0.27106,-0.05692,ZP>, +<0.27101,-0.04426,ZP>, +<0.27098,-0.03160,ZP>, +<0.27096,-0.01895,ZP>, +<0.27095,-0.00630,ZP>, +<0.27095,0.00635,ZP>, +<0.27096,0.01900,ZP>, +<0.27098,0.03165,ZP>, +<0.27102,0.04431,ZP>, +<0.27107,0.05698,ZP>, +<0.27113,0.06965,ZP>, +<0.27121,0.08233,ZP>, +<0.27130,0.09502,ZP>, +<0.27141,0.10773,ZP>, +<0.27153,0.12045,ZP>, +<0.27168,0.13319,ZP>, +<0.27184,0.14594,ZP>, +<0.27202,0.15870,ZP>, +<0.27222,0.17149,ZP>, +<0.27243,0.18429,ZP>, +<0.27267,0.19711,ZP>, +<0.27293,0.20996,ZP>, +<0.27321,0.22282,ZP>, +<0.27351,0.23572,ZP>, +<0.27384,0.24865,ZP>, +<0.27418,0.26161,ZP>, +<0.27455,0.27460,ZP>, +<0.27493,0.28762,ZP>, +<0.27531,0.30068,ZP>, +<0.27570,0.31377,ZP>, +<0.27608,0.32692,ZP>, +<0.27647,0.34012,ZP>, +<0.27687,0.35338,ZP>, +<0.27740,0.36682,ZP>, +<0.27770,0.38012,0.66008>, +<0.27793,0.39335,0.66018>, +<0.27921,0.40800,0.65972>, +<0.27638,0.41696,0.64587>, +<0.27005,0.42085,0.63462>, +<0.26371,0.42481,0.62345>, +<0.25774,0.42922,0.61203>, +<0.25117,0.43235,0.60091>, +<0.24354,0.43289,0.58968>, +<0.23609,0.43400,0.57874>, +<0.22857,0.43633,0.56764>, +<0.22205,0.44000,0.55668>, +<0.21689,0.44469,0.54583>, +<0.21280,0.45035,0.53477>, +<0.21036,0.45640,0.52385>, +<0.20817,0.46273,0.51232> +<0.20448,-0.44745,0.50647>, +<0.20943,-0.44208,0.51735>, +<0.21541,-0.43769,0.52792>, +<0.22253,-0.43441,0.53853>, +<0.23023,-0.43281,0.54916>, +<0.23787,-0.43249,0.55984>, +<0.24550,-0.43315,0.57059>, +<0.25302,-0.43292,0.58164>, +<0.26001,-0.43052,0.59273>, +<0.26644,-0.42647,0.60390>, +<0.27229,-0.42167,0.61507>, +<0.27770,-0.41580,0.62610>, +<0.28413,-0.41151,0.63702>, +<0.29066,-0.40732,0.64816>, +<0.29144,-0.39506,0.66059>, +<0.29098,-0.38133,0.66016>, +<0.29081,-0.36803,0.66008>, +<0.29047,-0.35463,ZP>, +<0.28993,-0.34112,ZP>, +<0.28951,-0.32784,ZP>, +<0.28906,-0.31460,ZP>, +<0.28857,-0.30139,ZP>, +<0.28810,-0.28824,ZP>, +<0.28765,-0.27513,ZP>, +<0.28722,-0.26206,ZP>, +<0.28682,-0.24904,ZP>, +<0.28645,-0.23606,ZP>, +<0.28610,-0.22312,ZP>, +<0.28579,-0.21021,ZP>, +<0.28550,-0.19733,ZP>, +<0.28523,-0.18447,ZP>, +<0.28499,-0.17164,ZP>, +<0.28477,-0.15882,ZP>, +<0.28457,-0.14603,ZP>, +<0.28440,-0.13326,ZP>, +<0.28425,-0.12050,ZP>, +<0.28411,-0.10776,ZP>, +<0.28400,-0.09504,ZP>, +<0.28391,-0.08234,ZP>, +<0.28383,-0.06964,ZP>, +<0.28377,-0.05696,ZP>, +<0.28372,-0.04429,ZP>, +<0.28368,-0.03162,ZP>, +<0.28366,-0.01896,ZP>, +<0.28365,-0.00630,ZP>, +<0.28365,0.00636,ZP>, +<0.28366,0.01902,ZP>, +<0.28369,0.03168,ZP>, +<0.28373,0.04435,ZP>, +<0.28378,0.05702,ZP>, +<0.28384,0.06971,ZP>, +<0.28393,0.08240,ZP>, +<0.28403,0.09511,ZP>, +<0.28414,0.10783,ZP>, +<0.28428,0.12057,ZP>, +<0.28443,0.13332,ZP>, +<0.28461,0.14609,ZP>, +<0.28481,0.15887,ZP>, +<0.28502,0.17168,ZP>, +<0.28527,0.18450,ZP>, +<0.28553,0.19735,ZP>, +<0.28581,0.21021,ZP>, +<0.28611,0.22310,ZP>, +<0.28644,0.23602,ZP>, +<0.28679,0.24897,ZP>, +<0.28717,0.26196,ZP>, +<0.28757,0.27499,ZP>, +<0.28799,0.28805,ZP>, +<0.28842,0.30115,ZP>, +<0.28886,0.31429,ZP>, +<0.28926,0.32745,ZP>, +<0.28965,0.34066,ZP>, +<0.29020,0.35412,ZP>, +<0.29065,0.36749,0.66008>, +<0.29095,0.38075,0.66015>, +<0.29149,0.39425,0.66059>, +<0.29123,0.40694,0.64854>, +<0.28476,0.41108,0.63735>, +<0.27831,0.41539,0.62634>, +<0.27305,0.42113,0.61516>, +<0.26684,0.42570,0.60388>, +<0.26029,0.42928,0.59288>, +<0.25291,0.43120,0.58156>, +<0.24535,0.43118,0.57092>, +<0.23748,0.43139,0.56011>, +<0.22987,0.43296,0.54940>, +<0.22298,0.43591,0.53876>, +<0.21663,0.44055,0.52800>, +<0.21163,0.44571,0.51762>, +<0.20754,0.45149,0.50627> +<0.20965,-0.43780,0.49989>, +<0.21663,-0.43433,0.51033>, +<0.22420,-0.43215,0.52054>, +<0.23218,-0.43143,0.53082>, +<0.23998,-0.43188,0.54128>, +<0.24751,-0.43344,0.55187>, +<0.25506,-0.43366,0.56269>, +<0.26246,-0.43155,0.57359>, +<0.26923,-0.42762,0.58453>, +<0.27515,-0.42239,0.59545>, +<0.28074,-0.41670,0.60633>, +<0.28605,-0.41084,0.61730>, +<0.29219,-0.40579,0.62839>, +<0.29871,-0.40112,0.63913>, +<0.30540,-0.39661,0.65032>, +<0.30441,-0.38222,0.66065>, +<0.30390,-0.36864,0.66027>, +<0.30360,-0.35524,0.66017>, +<0.30330,-0.34194,ZP>, +<0.30270,-0.32845,ZP>, +<0.30222,-0.31517,ZP>, +<0.30170,-0.30191,ZP>, +<0.30118,-0.28869,ZP>, +<0.30068,-0.27553,ZP>, +<0.30022,-0.26243,ZP>, +<0.29979,-0.24938,ZP>, +<0.29939,-0.23637,ZP>, +<0.29902,-0.22340,ZP>, +<0.29868,-0.21047,ZP>, +<0.29837,-0.19756,ZP>, +<0.29808,-0.18468,ZP>, +<0.29781,-0.17182,ZP>, +<0.29757,-0.15899,ZP>, +<0.29736,-0.14617,ZP>, +<0.29717,-0.13338,ZP>, +<0.29700,-0.12060,ZP>, +<0.29686,-0.10785,ZP>, +<0.29675,-0.09512,ZP>, +<0.29664,-0.08240,ZP>, +<0.29656,-0.06969,ZP>, +<0.29649,-0.05700,ZP>, +<0.29644,-0.04432,ZP>, +<0.29640,-0.03164,ZP>, +<0.29638,-0.01897,ZP>, +<0.29636,-0.00630,ZP>, +<0.29636,0.00637,ZP>, +<0.29638,0.01904,ZP>, +<0.29641,0.03171,ZP>, +<0.29645,0.04439,ZP>, +<0.29650,0.05708,ZP>, +<0.29657,0.06977,ZP>, +<0.29666,0.08248,ZP>, +<0.29676,0.09520,ZP>, +<0.29689,0.10794,ZP>, +<0.29703,0.12069,ZP>, +<0.29720,0.13346,ZP>, +<0.29739,0.14625,ZP>, +<0.29761,0.15905,ZP>, +<0.29785,0.17188,ZP>, +<0.29812,0.18473,ZP>, +<0.29840,0.19759,ZP>, +<0.29871,0.21048,ZP>, +<0.29905,0.22339,ZP>, +<0.29940,0.23633,ZP>, +<0.29978,0.24930,ZP>, +<0.30019,0.26232,ZP>, +<0.30062,0.27537,ZP>, +<0.30109,0.28848,ZP>, +<0.30158,0.30164,ZP>, +<0.30205,0.31483,ZP>, +<0.30249,0.32801,ZP>, +<0.30303,0.34139,ZP>, +<0.30332,0.35460,ZP>, +<0.30363,0.36795,0.66012>, +<0.30421,0.38151,0.66047>, +<0.30574,0.39630,0.65118>, +<0.29918,0.40077,0.63962>, +<0.29271,0.40541,0.62881>, +<0.28676,0.41054,0.61763>, +<0.28145,0.41648,0.60653>, +<0.27575,0.42198,0.59550>, +<0.26950,0.42689,0.58451>, +<0.26234,0.43033,0.57345>, +<0.25488,0.43153,0.56301>, +<0.24720,0.43058,0.55229>, +<0.23942,0.43009,0.54160>, +<0.23172,0.43071,0.53114>, +<0.22380,0.43282,0.52068>, +<0.21685,0.43627,0.51060>, +<0.21066,0.44087,0.49974> +<0.21832,-0.43186,0.49255>, +<0.22623,-0.43106,0.50267>, +<0.23419,-0.43103,0.51277>, +<0.24187,-0.43238,0.52299>, +<0.24934,-0.43479,0.53341>, +<0.25705,-0.43487,0.54396>, +<0.26472,-0.43286,0.55467>, +<0.27176,-0.42896,0.56539>, +<0.27783,-0.42355,0.57604>, +<0.28303,-0.41732,0.58670>, +<0.28824,-0.41106,0.59743>, +<0.29388,-0.40534,0.60812>, +<0.29993,-0.40008,0.61940>, +<0.30639,-0.39520,0.63020>, +<0.31298,-0.39014,0.64087>, +<0.31947,-0.38504,0.65297>, +<0.31731,-0.36946,0.66060>, +<0.31686,-0.35586,0.66024>, +<0.31661,-0.34264,ZP>, +<0.31608,-0.32920,ZP>, +<0.31541,-0.31572,ZP>, +<0.31486,-0.30242,ZP>, +<0.31430,-0.28916,ZP>, +<0.31376,-0.27595,ZP>, +<0.31326,-0.26280,ZP>, +<0.31280,-0.24972,ZP>, +<0.31237,-0.23669,ZP>, +<0.31197,-0.22370,ZP>, +<0.31160,-0.21073,ZP>, +<0.31126,-0.19780,ZP>, +<0.31094,-0.18489,ZP>, +<0.31065,-0.17201,ZP>, +<0.31039,-0.15915,ZP>, +<0.31016,-0.14631,ZP>, +<0.30995,-0.13350,ZP>, +<0.30978,-0.12071,ZP>, +<0.30963,-0.10794,ZP>, +<0.30950,-0.09519,ZP>, +<0.30940,-0.08246,ZP>, +<0.30931,-0.06975,ZP>, +<0.30924,-0.05704,ZP>, +<0.30918,-0.04435,ZP>, +<0.30914,-0.03166,ZP>, +<0.30911,-0.01898,ZP>, +<0.30910,-0.00630,ZP>, +<0.30910,0.00638,ZP>, +<0.30911,0.01906,ZP>, +<0.30914,0.03174,ZP>, +<0.30918,0.04443,ZP>, +<0.30924,0.05713,ZP>, +<0.30932,0.06984,ZP>, +<0.30941,0.08256,ZP>, +<0.30952,0.09530,ZP>, +<0.30965,0.10805,ZP>, +<0.30981,0.12081,ZP>, +<0.30999,0.13360,ZP>, +<0.31019,0.14641,ZP>, +<0.31043,0.15924,ZP>, +<0.31069,0.17209,ZP>, +<0.31099,0.18496,ZP>, +<0.31130,0.19785,ZP>, +<0.31165,0.21076,ZP>, +<0.31201,0.22369,ZP>, +<0.31240,0.23665,ZP>, +<0.31281,0.24965,ZP>, +<0.31325,0.26268,ZP>, +<0.31372,0.27577,ZP>, +<0.31423,0.28893,ZP>, +<0.31476,0.30213,ZP>, +<0.31528,0.31536,ZP>, +<0.31590,0.32874,ZP>, +<0.31638,0.34208,ZP>, +<0.31660,0.35519,0.66009>, +<0.31701,0.36867,0.66037>, +<0.31943,0.38444,0.65432>, +<0.31351,0.38973,0.64141>, +<0.30686,0.39484,0.63074>, +<0.30038,0.39974,0.61987>, +<0.29456,0.40521,0.60859>, +<0.28900,0.41111,0.59772>, +<0.28392,0.41734,0.58680>, +<0.27825,0.42349,0.57611>, +<0.27168,0.42840,0.56541>, +<0.26447,0.43155,0.55488>, +<0.25691,0.43268,0.54414>, +<0.24912,0.43132,0.53342>, +<0.24148,0.42979,0.52305>, +<0.23360,0.42957,0.51289>, +<0.22564,0.43067,0.50292>, +<0.21764,0.43287,0.49263> +<0.22831,-0.43111,0.48466>, +<0.23601,-0.43217,0.49477>, +<0.24346,-0.43421,0.50484>, +<0.25094,-0.43652,0.51522>, +<0.25891,-0.43636,0.52548>, +<0.26682,-0.43428,0.53585>, +<0.27399,-0.43022,0.54630>, +<0.28006,-0.42457,0.55667>, +<0.28520,-0.41797,0.56706>, +<0.28989,-0.41114,0.57760>, +<0.29502,-0.40481,0.58829>, +<0.30082,-0.39911,0.59900>, +<0.30741,-0.39435,0.61004>, +<0.31377,-0.38934,0.62097>, +<0.32027,-0.38405,0.63173>, +<0.32824,-0.37810,0.63300>, +<0.33274,-0.37254,0.65520>, +<0.33025,-0.35663,0.66049>, +<0.32981,-0.34317,0.66011>, +<0.32939,-0.32981,ZP>, +<0.32876,-0.31637,ZP>, +<0.32802,-0.30288,ZP>, +<0.32744,-0.28959,ZP>, +<0.32688,-0.27636,ZP>, +<0.32635,-0.26319,ZP>, +<0.32585,-0.25008,ZP>, +<0.32539,-0.23702,ZP>, +<0.32496,-0.22400,ZP>, +<0.32455,-0.21101,ZP>, +<0.32417,-0.19804,ZP>, +<0.32382,-0.18510,ZP>, +<0.32350,-0.17219,ZP>, +<0.32322,-0.15931,ZP>, +<0.32297,-0.14645,ZP>, +<0.32276,-0.13362,ZP>, +<0.32257,-0.12082,ZP>, +<0.32242,-0.10803,ZP>, +<0.32228,-0.09527,ZP>, +<0.32217,-0.08253,ZP>, +<0.32208,-0.06980,ZP>, +<0.32200,-0.05708,ZP>, +<0.32194,-0.04438,ZP>, +<0.32189,-0.03168,ZP>, +<0.32186,-0.01899,ZP>, +<0.32185,-0.00630,ZP>, +<0.32185,0.00639,ZP>, +<0.32186,0.01908,ZP>, +<0.32189,0.03178,ZP>, +<0.32193,0.04448,ZP>, +<0.32199,0.05719,ZP>, +<0.32207,0.06991,ZP>, +<0.32217,0.08265,ZP>, +<0.32229,0.09539,ZP>, +<0.32243,0.10816,ZP>, +<0.32259,0.12094,ZP>, +<0.32279,0.13375,ZP>, +<0.32301,0.14657,ZP>, +<0.32327,0.15942,ZP>, +<0.32355,0.17229,ZP>, +<0.32388,0.18519,ZP>, +<0.32423,0.19810,ZP>, +<0.32461,0.21104,ZP>, +<0.32501,0.22400,ZP>, +<0.32544,0.23699,ZP>, +<0.32589,0.25001,ZP>, +<0.32637,0.26307,ZP>, +<0.32686,0.27618,ZP>, +<0.32739,0.28935,ZP>, +<0.32794,0.30258,ZP>, +<0.32863,0.31600,ZP>, +<0.32923,0.32938,ZP>, +<0.32960,0.34265,0.66010>, +<0.32998,0.35597,0.66032>, +<0.33236,0.37169,0.65651>, +<0.32463,0.37513,0.64206>, +<0.32067,0.38373,0.63235>, +<0.31419,0.38900,0.62159>, +<0.30778,0.39406,0.61056>, +<0.30133,0.39904,0.59955>, +<0.29574,0.40501,0.58867>, +<0.29096,0.41143,0.57788>, +<0.28609,0.41832,0.56739>, +<0.28069,0.42462,0.55696>, +<0.27404,0.42975,0.54646>, +<0.26664,0.43295,0.53587>, +<0.25850,0.43420,0.52543>, +<0.25079,0.43320,0.51516>, +<0.24342,0.43066,0.50479>, +<0.23558,0.42993,0.49482>, +<0.22730,0.42992,0.48487> +<0.23740,-0.43464,0.47681>, +<0.24467,-0.43741,0.48703>, +<0.25248,-0.43846,0.49710>, +<0.26062,-0.43801,0.50721>, +<0.26868,-0.43565,0.51720>, +<0.27599,-0.43127,0.52732>, +<0.28195,-0.42528,0.53756>, +<0.28675,-0.41849,0.54772>, +<0.29101,-0.41127,0.55797>, +<0.29564,-0.40433,0.56843>, +<0.30121,-0.39826,0.57906>, +<0.30745,-0.39294,0.58977>, +<0.31463,-0.38862,0.60068>, +<0.32094,-0.38344,0.61127>, +<0.32740,-0.37796,0.62221>, +<0.33388,-0.37228,0.63291>, +<0.34030,-0.36662,0.64328>, +<0.34576,-0.35947,0.65634>, +<0.34318,-0.34371,0.66034>, +<0.34261,-0.33021,0.66011>, +<0.34207,-0.31688,ZP>, +<0.34139,-0.30346,ZP>, +<0.34063,-0.29001,ZP>, +<0.34005,-0.27677,ZP>, +<0.33950,-0.26360,ZP>, +<0.33895,-0.25045,ZP>, +<0.33844,-0.23736,ZP>, +<0.33797,-0.22430,ZP>, +<0.33752,-0.21127,ZP>, +<0.33710,-0.19828,ZP>, +<0.33672,-0.18531,ZP>, +<0.33638,-0.17237,ZP>, +<0.33607,-0.15946,ZP>, +<0.33581,-0.14659,ZP>, +<0.33558,-0.13374,ZP>, +<0.33539,-0.12092,ZP>, +<0.33522,-0.10813,ZP>, +<0.33508,-0.09535,ZP>, +<0.33496,-0.08259,ZP>, +<0.33486,-0.06985,ZP>, +<0.33478,-0.05712,ZP>, +<0.33472,-0.04440,ZP>, +<0.33467,-0.03170,ZP>, +<0.33463,-0.01899,ZP>, +<0.33461,-0.00629,ZP>, +<0.33461,0.00641,ZP>, +<0.33462,0.01911,ZP>, +<0.33465,0.03182,ZP>, +<0.33470,0.04453,ZP>, +<0.33476,0.05725,ZP>, +<0.33485,0.06999,ZP>, +<0.33495,0.08274,ZP>, +<0.33508,0.09550,ZP>, +<0.33522,0.10828,ZP>, +<0.33540,0.12108,ZP>, +<0.33560,0.13389,ZP>, +<0.33584,0.14673,ZP>, +<0.33612,0.15960,ZP>, +<0.33643,0.17249,ZP>, +<0.33678,0.18541,ZP>, +<0.33717,0.19836,ZP>, +<0.33759,0.21132,ZP>, +<0.33804,0.22432,ZP>, +<0.33851,0.23733,ZP>, +<0.33901,0.25038,ZP>, +<0.33954,0.26348,ZP>, +<0.34007,0.27660,ZP>, +<0.34061,0.28977,ZP>, +<0.34132,0.30317,ZP>, +<0.34197,0.31654,ZP>, +<0.34246,0.32982,0.66010>, +<0.34298,0.34325,0.66031>, +<0.34542,0.35880,0.65718>, +<0.34050,0.36645,0.64397>, +<0.33408,0.37211,0.63350>, +<0.32769,0.37770,0.62295>, +<0.32130,0.38313,0.61206>, +<0.31495,0.38837,0.60119>, +<0.30780,0.39276,0.59039>, +<0.30181,0.39828,0.57948>, +<0.29663,0.40459,0.56881>, +<0.29228,0.41173,0.55846>, +<0.28792,0.41892,0.54812>, +<0.28252,0.42570,0.53774>, +<0.27604,0.43100,0.52756>, +<0.26826,0.43448,0.51752>, +<0.26021,0.43594,0.50736>, +<0.25227,0.43562,0.49710>, +<0.24476,0.43347,0.48688>, +<0.23709,0.43140,0.47694> +<0.24587,-0.44014,0.46932>, +<0.25387,-0.44072,0.47921>, +<0.26218,-0.43970,0.48900>, +<0.27025,-0.43691,0.49889>, +<0.27747,-0.43217,0.50861>, +<0.28342,-0.42577,0.51855>, +<0.28807,-0.41858,0.52855>, +<0.29183,-0.41109,0.53859>, +<0.29592,-0.40381,0.54881>, +<0.30112,-0.39729,0.55921>, +<0.30739,-0.39169,0.56970>, +<0.31412,-0.38687,0.58034>, +<0.32101,-0.38217,0.59101>, +<0.32794,-0.37748,0.60139>, +<0.33481,-0.37138,0.61038>, +<0.34067,-0.36602,0.62316>, +<0.34696,-0.36011,0.63352>, +<0.35341,-0.35401,0.64371>, +<0.35870,-0.34622,0.65660>, +<0.35588,-0.33063,0.66034>, +<0.35516,-0.31712,0.66010>, +<0.35460,-0.30378,ZP>, +<0.35406,-0.29058,ZP>, +<0.35328,-0.27719,ZP>, +<0.35268,-0.26400,ZP>, +<0.35209,-0.25082,ZP>, +<0.35153,-0.23769,ZP>, +<0.35100,-0.22459,ZP>, +<0.35051,-0.21153,ZP>, +<0.35005,-0.19850,ZP>, +<0.34964,-0.18550,ZP>, +<0.34927,-0.17254,ZP>, +<0.34894,-0.15961,ZP>, +<0.34867,-0.14672,ZP>, +<0.34843,-0.13386,ZP>, +<0.34822,-0.12103,ZP>, +<0.34805,-0.10822,ZP>, +<0.34790,-0.09543,ZP>, +<0.34777,-0.08266,ZP>, +<0.34767,-0.06990,ZP>, +<0.34758,-0.05716,ZP>, +<0.34751,-0.04443,ZP>, +<0.34746,-0.03171,ZP>, +<0.34742,-0.01900,ZP>, +<0.34740,-0.00629,ZP>, +<0.34739,0.00642,ZP>, +<0.34740,0.01913,ZP>, +<0.34743,0.03185,ZP>, +<0.34748,0.04458,ZP>, +<0.34755,0.05732,ZP>, +<0.34764,0.07007,ZP>, +<0.34775,0.08283,ZP>, +<0.34788,0.09561,ZP>, +<0.34804,0.10840,ZP>, +<0.34822,0.12121,ZP>, +<0.34844,0.13404,ZP>, +<0.34870,0.14689,ZP>, +<0.34899,0.15977,ZP>, +<0.34933,0.17268,ZP>, +<0.34971,0.18562,ZP>, +<0.35013,0.19859,ZP>, +<0.35060,0.21159,ZP>, +<0.35110,0.22462,ZP>, +<0.35163,0.23768,ZP>, +<0.35218,0.25076,ZP>, +<0.35275,0.26389,ZP>, +<0.35333,0.27703,ZP>, +<0.35406,0.29037,ZP>, +<0.35455,0.30351,ZP>, +<0.35504,0.31682,0.66010>, +<0.35570,0.33028,0.66032>, +<0.35845,0.34579,0.65719>, +<0.35351,0.35393,0.64423>, +<0.34704,0.36004,0.63406>, +<0.34075,0.36595,0.62378>, +<0.33446,0.37167,0.61308>, +<0.32816,0.37727,0.60230>, +<0.32105,0.38184,0.59154>, +<0.31428,0.38647,0.58092>, +<0.30764,0.39149,0.57018>, +<0.30169,0.39739,0.55961>, +<0.29694,0.40426,0.54924>, +<0.29322,0.41177,0.53900>, +<0.28923,0.41936,0.52881>, +<0.28421,0.42626,0.51894>, +<0.27778,0.43203,0.50914>, +<0.26999,0.43595,0.49914>, +<0.26178,0.43784,0.48912>, +<0.25369,0.43812,0.47927>, +<0.24564,0.43675,0.46936> +<0.25529,-0.44329,0.46154>, +<0.26363,-0.44151,0.47106>, +<0.27160,-0.43804,0.48059>, +<0.27867,-0.43276,0.49020>, +<0.28441,-0.42612,0.49973>, +<0.28886,-0.41862,0.50948>, +<0.29228,-0.41077,0.51933>, +<0.29592,-0.40320,0.52937>, +<0.30085,-0.39643,0.53962>, +<0.30688,-0.39057,0.54991>, +<0.31384,-0.38563,0.56025>, +<0.32104,-0.38129,0.57077>, +<0.32810,-0.37687,0.58132>, +<0.33489,-0.37198,0.59185>, +<0.34141,-0.36647,0.60240>, +<0.34748,-0.36050,0.61295>, +<0.35328,-0.35385,0.62359>, +<0.35957,-0.34752,0.63364>, +<0.36603,-0.34094,0.64357>, +<0.37162,-0.33302,0.65593>, +<0.36865,-0.31756,0.66039>, +<0.36793,-0.30411,0.66012>, +<0.36740,-0.29101,0.66008>, +<0.36668,-0.27771,ZP>, +<0.36589,-0.26437,ZP>, +<0.36525,-0.25116,ZP>, +<0.36464,-0.23800,ZP>, +<0.36406,-0.22487,ZP>, +<0.36351,-0.21176,ZP>, +<0.36301,-0.19869,ZP>, +<0.36257,-0.18566,ZP>, +<0.36218,-0.17268,ZP>, +<0.36184,-0.15974,ZP>, +<0.36155,-0.14684,ZP>, +<0.36130,-0.13397,ZP>, +<0.36108,-0.12113,ZP>, +<0.36090,-0.10831,ZP>, +<0.36074,-0.09551,ZP>, +<0.36060,-0.08272,ZP>, +<0.36049,-0.06995,ZP>, +<0.36040,-0.05720,ZP>, +<0.36032,-0.04446,ZP>, +<0.36027,-0.03172,ZP>, +<0.36023,-0.01900,ZP>, +<0.36020,-0.00628,ZP>, +<0.36019,0.00644,ZP>, +<0.36020,0.01916,ZP>, +<0.36023,0.03189,ZP>, +<0.36028,0.04463,ZP>, +<0.36035,0.05738,ZP>, +<0.36044,0.07015,ZP>, +<0.36056,0.08293,ZP>, +<0.36070,0.09572,ZP>, +<0.36087,0.10852,ZP>, +<0.36107,0.12134,ZP>, +<0.36131,0.13418,ZP>, +<0.36158,0.14704,ZP>, +<0.36189,0.15993,ZP>, +<0.36225,0.17285,ZP>, +<0.36265,0.18580,ZP>, +<0.36311,0.19880,ZP>, +<0.36362,0.21184,ZP>, +<0.36418,0.22491,ZP>, +<0.36476,0.23801,ZP>, +<0.36536,0.25112,ZP>, +<0.36598,0.26429,ZP>, +<0.36674,0.27759,ZP>, +<0.36746,0.29090,0.66009>, +<0.36794,0.30395,0.66013>, +<0.36856,0.31732,0.66038>, +<0.37146,0.33274,0.65640>, +<0.36609,0.34090,0.64396>, +<0.35963,0.34746,0.63408>, +<0.35337,0.35376,0.62405>, +<0.34772,0.36033,0.61341>, +<0.34154,0.36635,0.60283>, +<0.33491,0.37173,0.59230>, +<0.32810,0.37642,0.58176>, +<0.32101,0.38072,0.57121>, +<0.31376,0.38518,0.56071>, +<0.30698,0.39040,0.55027>, +<0.30132,0.39663,0.53995>, +<0.29700,0.40376,0.52975>, +<0.29382,0.41162,0.51968>, +<0.29024,0.41942,0.50994>, +<0.28541,0.42663,0.50028>, +<0.27900,0.43287,0.49062>, +<0.27145,0.43726,0.48101>, +<0.26323,0.43975,0.47128>, +<0.25485,0.44072,0.46167> +<0.26497,-0.44332,0.45326>, +<0.27273,-0.43900,0.46245>, +<0.27962,-0.43328,0.47160>, +<0.28519,-0.42627,0.48112>, +<0.28931,-0.41853,0.49060>, +<0.29234,-0.41040,0.50028>, +<0.29577,-0.40262,0.51010>, +<0.30053,-0.39560,0.52009>, +<0.30648,-0.38956,0.53027>, +<0.31333,-0.38459,0.54036>, +<0.32076,-0.38041,0.55058>, +<0.32827,-0.37645,0.56104>, +<0.33544,-0.37206,0.57147>, +<0.34204,-0.36697,0.58191>, +<0.34830,-0.36105,0.59235>, +<0.35414,-0.35478,0.60266>, +<0.35980,-0.34803,0.61308>, +<0.36556,-0.34117,0.62345>, +<0.37176,-0.33447,0.63318>, +<0.37511,-0.32527,0.64239>, +<0.38433,-0.31987,0.65380>, +<0.38145,-0.30467,0.66048>, +<0.38063,-0.29129,0.66016>, +<0.37995,-0.27799,0.66008>, +<0.37925,-0.26480,ZP>, +<0.37849,-0.25153,ZP>, +<0.37775,-0.23827,ZP>, +<0.37712,-0.22510,ZP>, +<0.37653,-0.21196,ZP>, +<0.37598,-0.19885,ZP>, +<0.37551,-0.18580,ZP>, +<0.37511,-0.17280,ZP>, +<0.37477,-0.15986,ZP>, +<0.37446,-0.14696,ZP>, +<0.37420,-0.13408,ZP>, +<0.37397,-0.12123,ZP>, +<0.37377,-0.10840,ZP>, +<0.37360,-0.09559,ZP>, +<0.37345,-0.08279,ZP>, +<0.37333,-0.07000,ZP>, +<0.37324,-0.05723,ZP>, +<0.37316,-0.04447,ZP>, +<0.37310,-0.03173,ZP>, +<0.37305,-0.01900,ZP>, +<0.37302,-0.00627,ZP>, +<0.37301,0.00645,ZP>, +<0.37302,0.01919,ZP>, +<0.37304,0.03193,ZP>, +<0.37309,0.04468,ZP>, +<0.37316,0.05745,ZP>, +<0.37326,0.07023,ZP>, +<0.37339,0.08302,ZP>, +<0.37354,0.09583,ZP>, +<0.37373,0.10864,ZP>, +<0.37395,0.12148,ZP>, +<0.37420,0.13432,ZP>, +<0.37449,0.14718,ZP>, +<0.37482,0.16007,ZP>, +<0.37519,0.17298,ZP>, +<0.37561,0.18595,ZP>, +<0.37610,0.19897,ZP>, +<0.37666,0.21205,ZP>, +<0.37726,0.22516,ZP>, +<0.37789,0.23829,ZP>, +<0.37862,0.25152,ZP>, +<0.37936,0.26475,ZP>, +<0.38002,0.27792,0.66008>, +<0.38067,0.29126,0.66016>, +<0.38141,0.30459,0.66049>, +<0.38430,0.31979,0.65404>, +<0.37533,0.32493,0.64234>, +<0.37174,0.33449,0.63353>, +<0.36560,0.34112,0.62382>, +<0.36013,0.34795,0.61354>, +<0.35446,0.35476,0.60309>, +<0.34856,0.36111,0.59283>, +<0.34230,0.36675,0.58238>, +<0.33547,0.37163,0.57185>, +<0.32815,0.37580,0.56143>, +<0.32053,0.37969,0.55114>, +<0.31317,0.38402,0.54082>, +<0.30656,0.38929,0.53059>, +<0.30101,0.39576,0.52052>, +<0.29685,0.40321,0.51055>, +<0.29397,0.41138,0.50076>, +<0.29082,0.41937,0.49114>, +<0.28616,0.42687,0.48165>, +<0.28006,0.43340,0.47229>, +<0.27256,0.43833,0.46293>, +<0.26456,0.44184,0.45357> +<0.27363,-0.44006,0.44447>, +<0.28014,-0.43367,0.45353>, +<0.28554,-0.42642,0.46256>, +<0.28944,-0.41840,0.47200>, +<0.29213,-0.41014,0.48142>, +<0.29547,-0.40212,0.49102>, +<0.30019,-0.39493,0.50079>, +<0.30612,-0.38871,0.51067>, +<0.31308,-0.38368,0.52073>, +<0.32060,-0.37970,0.53070>, +<0.32830,-0.37619,0.54087>, +<0.33584,-0.37233,0.55121>, +<0.34293,-0.36755,0.56149>, +<0.34925,-0.36190,0.57181>, +<0.35499,-0.35553,0.58212>, +<0.36038,-0.34875,0.59236>, +<0.36576,-0.34182,0.60255>, +<0.37134,-0.33484,0.61281>, +<0.37739,-0.32806,0.62268>, +<0.38344,-0.32101,0.63208>, +<0.38958,-0.31370,0.64110>, +<0.39611,-0.30603,0.65091>, +<0.39414,-0.29179,0.66060>, +<0.39318,-0.27821,0.66018>, +<0.39243,-0.26496,0.66008>, +<0.39174,-0.25184,ZP>, +<0.39097,-0.23860,ZP>, +<0.39013,-0.22525,ZP>, +<0.38951,-0.21206,ZP>, +<0.38898,-0.19895,ZP>, +<0.38851,-0.18590,ZP>, +<0.38809,-0.17291,ZP>, +<0.38773,-0.15996,ZP>, +<0.38741,-0.14706,ZP>, +<0.38713,-0.13418,ZP>, +<0.38689,-0.12133,ZP>, +<0.38667,-0.10849,ZP>, +<0.38648,-0.09566,ZP>, +<0.38632,-0.08284,ZP>, +<0.38619,-0.07004,ZP>, +<0.38609,-0.05726,ZP>, +<0.38601,-0.04449,ZP>, +<0.38595,-0.03173,ZP>, +<0.38590,-0.01899,ZP>, +<0.38587,-0.00626,ZP>, +<0.38585,0.00647,ZP>, +<0.38585,0.01921,ZP>, +<0.38587,0.03196,ZP>, +<0.38591,0.04472,ZP>, +<0.38599,0.05750,ZP>, +<0.38609,0.07030,ZP>, +<0.38623,0.08311,ZP>, +<0.38640,0.09593,ZP>, +<0.38661,0.10876,ZP>, +<0.38685,0.12160,ZP>, +<0.38713,0.13444,ZP>, +<0.38744,0.14730,ZP>, +<0.38779,0.16018,ZP>, +<0.38818,0.17310,ZP>, +<0.38862,0.18606,ZP>, +<0.38911,0.19908,ZP>, +<0.38966,0.21217,ZP>, +<0.39029,0.22532,ZP>, +<0.39112,0.23864,ZP>, +<0.39188,0.25185,ZP>, +<0.39254,0.26496,0.66008>, +<0.39324,0.27819,0.66018>, +<0.39413,0.29183,0.66061>, +<0.39606,0.30609,0.65093>, +<0.38950,0.31385,0.64040>, +<0.38340,0.32107,0.63221>, +<0.37734,0.32811,0.62285>, +<0.37136,0.33481,0.61307>, +<0.36603,0.34191,0.60285>, +<0.36079,0.34894,0.59270>, +<0.35551,0.35563,0.58262>, +<0.34958,0.36197,0.57243>, +<0.34303,0.36739,0.56201>, +<0.33582,0.37179,0.55169>, +<0.32817,0.37534,0.54149>, +<0.32040,0.37876,0.53125>, +<0.31291,0.38294,0.52114>, +<0.30619,0.38839,0.51117>, +<0.30068,0.39510,0.50133>, +<0.29651,0.40281,0.49157>, +<0.29392,0.41100,0.48190>, +<0.29098,0.41921,0.47253>, +<0.28661,0.42697,0.46335>, +<0.28058,0.43383,0.45421>, +<0.27370,0.43962,0.44502> +<0.28027,-0.43414,0.43541>, +<0.28532,-0.42647,0.44449>, +<0.28935,-0.41846,0.45346>, +<0.29176,-0.40986,0.46285>, +<0.29509,-0.40185,0.47221>, +<0.29986,-0.39441,0.48172>, +<0.30587,-0.38803,0.49145>, +<0.31290,-0.38299,0.50123>, +<0.32057,-0.37912,0.51114>, +<0.32842,-0.37598,0.52109>, +<0.33619,-0.37261,0.53120>, +<0.34352,-0.36830,0.54135>, +<0.35016,-0.36287,0.55151>, +<0.35600,-0.35646,0.56174>, +<0.36117,-0.34958,0.57192>, +<0.36604,-0.34245,0.58206>, +<0.37112,-0.33528,0.59210>, +<0.37696,-0.32852,0.60206>, +<0.38283,-0.32165,0.61181>, +<0.38874,-0.31452,0.62135>, +<0.39463,-0.30714,0.63053>, +<0.40058,-0.29944,0.63949>, +<0.40678,-0.29145,0.64848>, +<0.40783,-0.27945,0.65974>, +<0.40569,-0.26515,0.66023>, +<0.40481,-0.25184,0.66009>, +<0.40407,-0.23871,ZP>, +<0.40330,-0.22547,ZP>, +<0.40253,-0.21217,ZP>, +<0.40196,-0.19900,ZP>, +<0.40150,-0.18595,ZP>, +<0.40111,-0.17299,ZP>, +<0.40074,-0.16005,ZP>, +<0.40041,-0.14716,ZP>, +<0.40010,-0.13427,ZP>, +<0.39983,-0.12141,ZP>, +<0.39959,-0.10856,ZP>, +<0.39939,-0.09572,ZP>, +<0.39921,-0.08289,ZP>, +<0.39907,-0.07008,ZP>, +<0.39896,-0.05728,ZP>, +<0.39888,-0.04450,ZP>, +<0.39881,-0.03173,ZP>, +<0.39877,-0.01898,ZP>, +<0.39874,-0.00624,ZP>, +<0.39871,0.00649,ZP>, +<0.39870,0.01924,ZP>, +<0.39871,0.03199,ZP>, +<0.39875,0.04476,ZP>, +<0.39883,0.05755,ZP>, +<0.39894,0.07036,ZP>, +<0.39909,0.08318,ZP>, +<0.39929,0.09602,ZP>, +<0.39952,0.10885,ZP>, +<0.39979,0.12170,ZP>, +<0.40010,0.13454,ZP>, +<0.40045,0.14741,ZP>, +<0.40082,0.16027,ZP>, +<0.40122,0.17318,ZP>, +<0.40163,0.18611,ZP>, +<0.40210,0.19913,ZP>, +<0.40268,0.21228,ZP>, +<0.40345,0.22556,ZP>, +<0.40422,0.23879,ZP>, +<0.40494,0.25190,0.66009>, +<0.40580,0.26520,0.66023>, +<0.40791,0.27951,0.65969>, +<0.40672,0.29153,0.64846>, +<0.40054,0.29949,0.63955>, +<0.39464,0.30712,0.63056>, +<0.38874,0.31451,0.62131>, +<0.38281,0.32168,0.61184>, +<0.37697,0.32850,0.60229>, +<0.37134,0.33539,0.59233>, +<0.36660,0.34254,0.58231>, +<0.36179,0.34982,0.57227>, +<0.35648,0.35683,0.56223>, +<0.35050,0.36297,0.55209>, +<0.34371,0.36802,0.54188>, +<0.33626,0.37189,0.53176>, +<0.32826,0.37493,0.52172>, +<0.32022,0.37813,0.51171>, +<0.31264,0.38225,0.50178>, +<0.30586,0.38779,0.49199>, +<0.30030,0.39467,0.48235>, +<0.29621,0.40236,0.47274>, +<0.29352,0.41074,0.46338>, +<0.29087,0.41919,0.45425>, +<0.28634,0.42704,0.44527>, +<0.28107,0.43438,0.43620> +<0.28486,-0.42670,0.42629>, +<0.28839,-0.41828,0.43536>, +<0.29124,-0.40980,0.44435>, +<0.29475,-0.40160,0.45368>, +<0.29951,-0.39416,0.46298>, +<0.30562,-0.38763,0.47242>, +<0.31282,-0.38250,0.48208>, +<0.32063,-0.37869,0.49173>, +<0.32871,-0.37575,0.50152>, +<0.33665,-0.37279,0.51141>, +<0.34416,-0.36885,0.52146>, +<0.35101,-0.36368,0.53149>, +<0.35690,-0.35747,0.54154>, +<0.36196,-0.35045,0.55167>, +<0.36650,-0.34303,0.56171>, +<0.37103,-0.33558,0.57167>, +<0.37598,-0.32841,0.58154>, +<0.38150,-0.32148,0.59122>, +<0.38811,-0.31527,0.60094>, +<0.39382,-0.30808,0.61034>, +<0.39954,-0.30064,0.61971>, +<0.40524,-0.29295,0.62871>, +<0.41094,-0.28497,0.63732>, +<0.41680,-0.27661,0.64588>, +<0.42102,-0.26696,0.65631>, +<0.41773,-0.25220,0.66027>, +<0.41649,-0.23839,ZP>, +<0.41620,-0.22523,ZP>, +<0.41564,-0.21218,ZP>, +<0.41518,-0.19918,ZP>, +<0.41456,-0.18600,ZP>, +<0.41417,-0.17303,ZP>, +<0.41380,-0.16011,ZP>, +<0.41346,-0.14724,ZP>, +<0.41312,-0.13435,ZP>, +<0.41281,-0.12148,ZP>, +<0.41254,-0.10861,ZP>, +<0.41231,-0.09576,ZP>, +<0.41212,-0.08292,ZP>, +<0.41197,-0.07010,ZP>, +<0.41185,-0.05729,ZP>, +<0.41177,-0.04450,ZP>, +<0.41171,-0.03172,ZP>, +<0.41167,-0.01897,ZP>, +<0.41163,-0.00622,ZP>, +<0.41160,0.00652,ZP>, +<0.41159,0.01926,ZP>, +<0.41158,0.03201,ZP>, +<0.41161,0.04478,ZP>, +<0.41168,0.05757,ZP>, +<0.41179,0.07039,ZP>, +<0.41196,0.08322,ZP>, +<0.41218,0.09607,ZP>, +<0.41245,0.10892,ZP>, +<0.41277,0.12177,ZP>, +<0.41312,0.13462,ZP>, +<0.41351,0.14748,ZP>, +<0.41390,0.16032,ZP>, +<0.41430,0.17321,ZP>, +<0.41472,0.18615,ZP>, +<0.41533,0.19930,ZP>, +<0.41578,0.21228,ZP>, +<0.41634,0.22535,ZP>, +<0.41666,0.23858,ZP>, +<0.41794,0.25227,0.66025>, +<0.42116,0.26696,0.65611>, +<0.41677,0.27665,0.64582>, +<0.41089,0.28503,0.63731>, +<0.40523,0.29297,0.62874>, +<0.39955,0.30063,0.61971>, +<0.39384,0.30806,0.61030>, +<0.38811,0.31527,0.60091>, +<0.38147,0.32145,0.59137>, +<0.37614,0.32838,0.58175>, +<0.37145,0.33567,0.57191>, +<0.36721,0.34321,0.56200>, +<0.36278,0.35070,0.55206>, +<0.35758,0.35768,0.54210>, +<0.35142,0.36373,0.53202>, +<0.34435,0.36854,0.52200>, +<0.33648,0.37208,0.51203>, +<0.32824,0.37475,0.50210>, +<0.32017,0.37771,0.49228>, +<0.31244,0.38184,0.48257>, +<0.30562,0.38741,0.47301>, +<0.30005,0.39431,0.46346>, +<0.29574,0.40218,0.45426>, +<0.29287,0.41058,0.44516>, +<0.28998,0.41912,0.43617>, +<0.28615,0.42721,0.42716> +<0.28755,-0.41846,0.41722>, +<0.29060,-0.40976,0.42621>, +<0.29442,-0.40163,0.43515>, +<0.29935,-0.39402,0.44441>, +<0.30541,-0.38747,0.45367>, +<0.31268,-0.38230,0.46305>, +<0.32063,-0.37847,0.47264>, +<0.32885,-0.37568,0.48221>, +<0.33698,-0.37296,0.49192>, +<0.34466,-0.36929,0.50179>, +<0.35164,-0.36437,0.51180>, +<0.35772,-0.35822,0.52173>, +<0.36276,-0.35112,0.53165>, +<0.36701,-0.34348,0.54153>, +<0.37097,-0.33577,0.55144>, +<0.37535,-0.32829,0.56132>, +<0.38048,-0.32133,0.57103>, +<0.38634,-0.31474,0.58064>, +<0.39261,-0.30832,0.59007>, +<0.39893,-0.30178,0.59933>, +<0.40507,-0.29493,0.60841>, +<0.41040,-0.28699,0.61757>, +<0.41522,-0.27857,0.62632>, +<0.42069,-0.27029,0.63463>, +<0.42611,-0.26179,0.64256>, +<0.43191,-0.25255,0.65107>, +<0.43076,-0.23917,0.66012>, +<0.42910,-0.22552,0.66015>, +<0.42825,-0.21209,ZP>, +<0.42804,-0.19896,ZP>, +<0.42770,-0.18596,ZP>, +<0.42742,-0.17320,ZP>, +<0.42690,-0.16016,ZP>, +<0.42651,-0.14726,ZP>, +<0.42616,-0.13437,ZP>, +<0.42583,-0.12151,ZP>, +<0.42553,-0.10865,ZP>, +<0.42527,-0.09580,ZP>, +<0.42504,-0.08295,ZP>, +<0.42487,-0.07011,ZP>, +<0.42474,-0.05728,ZP>, +<0.42466,-0.04448,ZP>, +<0.42461,-0.03171,ZP>, +<0.42457,-0.01894,ZP>, +<0.42454,-0.00619,ZP>, +<0.42451,0.00656,ZP>, +<0.42449,0.01930,ZP>, +<0.42448,0.03204,ZP>, +<0.42449,0.04479,ZP>, +<0.42455,0.05757,ZP>, +<0.42467,0.07039,ZP>, +<0.42487,0.08324,ZP>, +<0.42513,0.09610,ZP>, +<0.42544,0.10894,ZP>, +<0.42580,0.12178,ZP>, +<0.42618,0.13461,ZP>, +<0.42659,0.14746,ZP>, +<0.42703,0.16034,ZP>, +<0.42757,0.17335,ZP>, +<0.42791,0.18614,ZP>, +<0.42823,0.19907,ZP>, +<0.42821,0.21217,ZP>, +<0.42907,0.22571,0.66013>, +<0.43086,0.23949,ZP>, +<0.43189,0.25255,0.65085>, +<0.42610,0.26178,0.64249>, +<0.42065,0.27034,0.63456>, +<0.41520,0.27859,0.62625>, +<0.41036,0.28701,0.61771>, +<0.40488,0.29477,0.60862>, +<0.39864,0.30155,0.59944>, +<0.39234,0.30812,0.59014>, +<0.38627,0.31447,0.58071>, +<0.38058,0.32115,0.57114>, +<0.37564,0.32834,0.56142>, +<0.37161,0.33601,0.55166>, +<0.36784,0.34390,0.54193>, +<0.36357,0.35156,0.53209>, +<0.35833,0.35858,0.52214>, +<0.35198,0.36449,0.51225>, +<0.34467,0.36905,0.50232>, +<0.33662,0.37227,0.49240>, +<0.32834,0.37464,0.48267>, +<0.32010,0.37753,0.47302>, +<0.31234,0.38164,0.46355>, +<0.30538,0.38732,0.45409>, +<0.29968,0.39432,0.44498>, +<0.29525,0.40217,0.43592>, +<0.29181,0.41056,0.42704>, +<0.28921,0.41920,0.41805> +<0.29001,-0.41008,0.40815>, +<0.29419,-0.40183,0.41699>, +<0.29918,-0.39423,0.42586>, +<0.30544,-0.38756,0.43503>, +<0.31265,-0.38230,0.44426>, +<0.32057,-0.37845,0.45361>, +<0.32888,-0.37571,0.46314>, +<0.33716,-0.37315,0.47269>, +<0.34505,-0.36960,0.48235>, +<0.35224,-0.36481,0.49210>, +<0.35839,-0.35876,0.50193>, +<0.36341,-0.35168,0.51175>, +<0.36745,-0.34394,0.52162>, +<0.37098,-0.33593,0.53140>, +<0.37477,-0.32814,0.54120>, +<0.37938,-0.32088,0.55095>, +<0.38509,-0.31428,0.56053>, +<0.39154,-0.30819,0.57002>, +<0.39819,-0.30241,0.57929>, +<0.40480,-0.29628,0.58847>, +<0.41089,-0.28943,0.59756>, +<0.41625,-0.28175,0.60638>, +<0.42089,-0.27335,0.61507>, +<0.42458,-0.26414,0.62336>, +<0.42989,-0.25538,0.63140>, +<0.43524,-0.24625,0.63914>, +<0.43096,-0.24307,0.65001>, +<0.44457,-0.22687,0.65542>, +<0.44167,-0.21249,0.66041>, +<0.44120,-0.19898,0.66011>, +<0.44078,-0.18586,ZP>, +<0.44054,-0.17309,ZP>, +<0.44017,-0.16022,ZP>, +<0.43973,-0.14738,ZP>, +<0.43923,-0.13440,ZP>, +<0.43882,-0.12148,ZP>, +<0.43851,-0.10861,ZP>, +<0.43822,-0.09575,ZP>, +<0.43799,-0.08290,ZP>, +<0.43781,-0.07007,ZP>, +<0.43770,-0.05727,ZP>, +<0.43763,-0.04449,ZP>, +<0.43757,-0.03170,ZP>, +<0.43752,-0.01892,ZP>, +<0.43748,-0.00615,ZP>, +<0.43746,0.00661,ZP>, +<0.43745,0.01935,ZP>, +<0.43744,0.03206,ZP>, +<0.43744,0.04479,ZP>, +<0.43745,0.05752,ZP>, +<0.43754,0.07031,ZP>, +<0.43773,0.08317,ZP>, +<0.43802,0.09604,ZP>, +<0.43838,0.10889,ZP>, +<0.43881,0.12171,ZP>, +<0.43931,0.13459,ZP>, +<0.43987,0.14751,ZP>, +<0.44032,0.16033,ZP>, +<0.44070,0.17318,ZP>, +<0.44095,0.18609,ZP>, +<0.44137,0.19918,0.66011>, +<0.44181,0.21256,0.66037>, +<0.44447,0.22706,0.65533>, +<0.43143,0.24262,0.65008>, +<0.43514,0.24641,0.63905>, +<0.42984,0.25547,0.63133>, +<0.42482,0.26417,0.62324>, +<0.42119,0.27344,0.61505>, +<0.41640,0.28180,0.60643>, +<0.41073,0.28932,0.59768>, +<0.40443,0.29597,0.58869>, +<0.39780,0.30196,0.57942>, +<0.39123,0.30776,0.57006>, +<0.38491,0.31403,0.56068>, +<0.37940,0.32097,0.55112>, +<0.37510,0.32856,0.54148>, +<0.37173,0.33653,0.53183>, +<0.36840,0.34452,0.52200>, +<0.36428,0.35224,0.51219>, +<0.35902,0.35918,0.50241>, +<0.35249,0.36495,0.49257>, +<0.34487,0.36939,0.48274>, +<0.33679,0.37240,0.47309>, +<0.32839,0.37464,0.46348>, +<0.32009,0.37750,0.45405>, +<0.31213,0.38177,0.44468>, +<0.30515,0.38747,0.43559>, +<0.29940,0.39448,0.42653>, +<0.29474,0.40232,0.41772>, +<0.29107,0.41076,0.40889> +<0.29381,-0.40229,0.39898>, +<0.29921,-0.39476,0.40774>, +<0.30533,-0.38804,0.41660>, +<0.31263,-0.38261,0.42568>, +<0.32055,-0.37858,0.43487>, +<0.32886,-0.37583,0.44413>, +<0.33724,-0.37330,0.45359>, +<0.34525,-0.36984,0.46309>, +<0.35265,-0.36512,0.47268>, +<0.35899,-0.35907,0.48238>, +<0.36404,-0.35198,0.49207>, +<0.36793,-0.34422,0.50179>, +<0.37106,-0.33614,0.51160>, +<0.37430,-0.32809,0.52140>, +<0.37858,-0.32042,0.53116>, +<0.38399,-0.31364,0.54071>, +<0.39039,-0.30776,0.55006>, +<0.39745,-0.30244,0.55943>, +<0.40458,-0.29730,0.56860>, +<0.41135,-0.29140,0.57774>, +<0.41716,-0.28422,0.58682>, +<0.42176,-0.27601,0.59551>, +<0.42548,-0.26723,0.60387>, +<0.42907,-0.25808,0.61205>, +<0.43353,-0.24916,0.62032>, +<0.43853,-0.24031,0.62796>, +<0.44344,-0.23121,0.63476>, +<0.44833,-0.22166,0.64177>, +<0.44750,-0.21197,0.65000>, +<0.45641,-0.20026,0.65630>, +<0.45428,-0.18639,0.66031>, +<0.45353,-0.17307,0.66013>, +<0.45306,-0.15996,ZP>, +<0.45274,-0.14707,ZP>, +<0.45244,-0.13425,ZP>, +<0.45210,-0.12150,ZP>, +<0.45168,-0.10864,ZP>, +<0.45123,-0.09574,ZP>, +<0.45089,-0.08284,ZP>, +<0.45070,-0.07000,ZP>, +<0.45059,-0.05722,ZP>, +<0.45053,-0.04447,ZP>, +<0.45046,-0.03166,ZP>, +<0.45043,-0.01887,ZP>, +<0.45042,-0.00609,ZP>, +<0.45039,0.00663,ZP>, +<0.45039,0.01937,ZP>, +<0.45038,0.03208,ZP>, +<0.45040,0.04479,ZP>, +<0.45039,0.05746,ZP>, +<0.45048,0.07020,ZP>, +<0.45066,0.08304,ZP>, +<0.45106,0.09595,ZP>, +<0.45161,0.10883,ZP>, +<0.45215,0.12161,ZP>, +<0.45258,0.13432,ZP>, +<0.45292,0.14710,ZP>, +<0.45325,0.16001,ZP>, +<0.45370,0.17312,0.66012>, +<0.45440,0.18665,0.66029>, +<0.45634,0.20053,0.65623>, +<0.45453,0.20430,0.64321>, +<0.44826,0.22176,0.64171>, +<0.44333,0.23144,0.63428>, +<0.43846,0.24045,0.62776>, +<0.43348,0.24925,0.62017>, +<0.42924,0.25836,0.61198>, +<0.42582,0.26757,0.60376>, +<0.42195,0.27633,0.59548>, +<0.41705,0.28425,0.58689>, +<0.41097,0.29102,0.57797>, +<0.40410,0.29658,0.56871>, +<0.39691,0.30174,0.55941>, +<0.38992,0.30730,0.55014>, +<0.38362,0.31363,0.54075>, +<0.37855,0.32076,0.53120>, +<0.37480,0.32859,0.52157>, +<0.37198,0.33677,0.51187>, +<0.36890,0.34493,0.50223>, +<0.36486,0.35265,0.49258>, +<0.35944,0.35961,0.48281>, +<0.35264,0.36537,0.47312>, +<0.34502,0.36961,0.46356>, +<0.33684,0.37256,0.45397>, +<0.32836,0.37476,0.44455>, +<0.31990,0.37772,0.43526>, +<0.31206,0.38205,0.42611>, +<0.30506,0.38780,0.41710>, +<0.29913,0.39488,0.40833>, +<0.29418,0.40272,0.39963> +<0.29898,-0.39537,0.38967>, +<0.30547,-0.38885,0.39839>, +<0.31260,-0.38317,0.40723>, +<0.32052,-0.37888,0.41625>, +<0.32888,-0.37592,0.42543>, +<0.33726,-0.37338,0.43462>, +<0.34537,-0.36992,0.44401>, +<0.35283,-0.36528,0.45348>, +<0.35930,-0.35930,0.46302>, +<0.36447,-0.35216,0.47267>, +<0.36836,-0.34431,0.48235>, +<0.37123,-0.33617,0.49198>, +<0.37402,-0.32802,0.50168>, +<0.37782,-0.32028,0.51141>, +<0.38310,-0.31314,0.52107>, +<0.38960,-0.30711,0.53046>, +<0.39685,-0.30212,0.53968>, +<0.40440,-0.29774,0.54897>, +<0.41174,-0.29292,0.55813>, +<0.41821,-0.28656,0.56726>, +<0.42327,-0.27871,0.57614>, +<0.42670,-0.26983,0.58451>, +<0.42923,-0.26044,0.59260>, +<0.43216,-0.25150,0.60089>, +<0.43698,-0.24310,0.60863>, +<0.44175,-0.23432,0.61618>, +<0.44656,-0.22509,0.62289>, +<0.45120,-0.21564,0.62988>, +<0.45564,-0.20609,0.63637>, +<0.46004,-0.19601,0.64240>, +<0.46457,-0.18536,0.64815>, +<0.46812,-0.17371,0.65462>, +<0.46720,-0.16051,0.65957>, +<0.46580,-0.14714,0.66017>, +<0.46508,-0.13425,ZP>, +<0.46476,-0.12119,ZP>, +<0.46455,-0.10828,ZP>, +<0.46431,-0.09546,0.66008>, +<0.46414,-0.08271,0.66008>, +<0.46408,-0.07003,ZP>, +<0.46386,-0.05728,ZP>, +<0.46367,-0.04452,ZP>, +<0.46351,-0.03167,ZP>, +<0.46344,-0.01885,ZP>, +<0.46344,-0.00604,ZP>, +<0.46346,0.00670,ZP>, +<0.46352,0.01945,ZP>, +<0.46349,0.03210,ZP>, +<0.46363,0.04484,ZP>, +<0.46353,0.05733,ZP>, +<0.46363,0.07010,ZP>, +<0.46308,0.08289,ZP>, +<0.46380,0.09550,ZP>, +<0.46449,0.10834,ZP>, +<0.46507,0.12101,ZP>, +<0.46551,0.13384,0.66010>, +<0.46601,0.14708,0.66020>, +<0.46746,0.16053,0.65948>, +<0.46821,0.17371,0.65443>, +<0.46449,0.18556,0.64815>, +<0.45996,0.19621,0.64242>, +<0.45549,0.20637,0.63665>, +<0.45114,0.21572,0.63000>, +<0.44647,0.22523,0.62308>, +<0.44174,0.23436,0.61600>, +<0.43696,0.24312,0.60848>, +<0.43212,0.25155,0.60080>, +<0.42967,0.26095,0.59248>, +<0.42710,0.27016,0.58448>, +<0.42323,0.27899,0.57612>, +<0.41794,0.28638,0.56727>, +<0.41122,0.29232,0.55824>, +<0.40362,0.29693,0.54899>, +<0.39596,0.30150,0.53978>, +<0.38878,0.30685,0.53058>, +<0.38264,0.31319,0.52113>, +<0.37788,0.32062,0.51163>, +<0.37460,0.32866,0.50203>, +<0.37217,0.33702,0.49238>, +<0.36926,0.34522,0.48272>, +<0.36515,0.35300,0.47304>, +<0.35962,0.35992,0.46348>, +<0.35284,0.36550,0.45398>, +<0.34508,0.36973,0.44443>, +<0.33681,0.37270,0.43505>, +<0.32825,0.37493,0.42583>, +<0.31988,0.37801,0.41661>, +<0.31204,0.38251,0.40764>, +<0.30500,0.38852,0.39887>, +<0.29885,0.39550,0.39028> +<0.30527,-0.38952,0.38031>, +<0.31264,-0.38405,0.38904>, +<0.32037,-0.37938,0.39784>, +<0.32870,-0.37614,0.40684>, +<0.33716,-0.37337,0.41598>, +<0.34524,-0.36989,0.42513>, +<0.35284,-0.36524,0.43452>, +<0.35937,-0.35935,0.44398>, +<0.36460,-0.35232,0.45350>, +<0.36853,-0.34448,0.46310>, +<0.37134,-0.33617,0.47276>, +<0.37389,-0.32788,0.48233>, +<0.37744,-0.32000,0.49189>, +<0.38239,-0.31285,0.50146>, +<0.38882,-0.30670,0.51103>, +<0.39622,-0.30180,0.52038>, +<0.40418,-0.29784,0.52960>, +<0.41205,-0.29387,0.53885>, +<0.41896,-0.28842,0.54787>, +<0.42453,-0.28110,0.55681>, +<0.42818,-0.27228,0.56542>, +<0.43011,-0.26286,0.57356>, +<0.43110,-0.25328,0.58168>, +<0.43272,-0.24394,0.58961>, +<0.43715,-0.23510,0.59710>, +<0.44488,-0.22827,0.60427>, +<0.44979,-0.21899,0.61124>, +<0.45588,-0.21111,0.61815>, +<0.45938,-0.20133,0.62475>, +<0.46227,-0.19064,0.63039>, +<0.46636,-0.18037,0.63581>, +<0.47037,-0.16965,0.64098>, +<0.47429,-0.15853,0.64590>, +<0.47813,-0.14697,0.65070>, +<0.47988,-0.13468,0.65603>, +<0.47907,-0.12148,0.65946>, +<0.47771,-0.10835,0.66030>, +<0.47715,-0.09544,0.66018>, +<0.47688,-0.08256,0.66012>, +<0.47674,-0.06988,ZP>, +<0.47649,-0.05710,ZP>, +<0.47632,-0.04434,ZP>, +<0.47626,-0.03153,ZP>, +<0.47629,-0.01876,ZP>, +<0.47636,-0.00601,ZP>, +<0.47642,0.00673,ZP>, +<0.47650,0.01945,ZP>, +<0.47632,0.03199,0.66009>, +<0.47662,0.04468,ZP>, +<0.47655,0.05719,ZP>, +<0.47667,0.06999,0.66009>, +<0.47635,0.08211,0.66010>, +<0.47709,0.09508,0.66012>, +<0.47791,0.10785,0.66028>, +<0.47946,0.12099,0.65938>, +<0.48027,0.13408,0.65580>, +<0.47819,0.14680,0.65049>, +<0.47432,0.15845,0.64572>, +<0.47036,0.16967,0.64085>, +<0.46614,0.18091,0.63592>, +<0.46218,0.19114,0.63037>, +<0.45894,0.20123,0.62443>, +<0.45480,0.21095,0.61809>, +<0.44954,0.21891,0.61100>, +<0.44487,0.22831,0.60427>, +<0.43679,0.23484,0.59706>, +<0.43317,0.24403,0.58951>, +<0.43191,0.25381,0.58153>, +<0.43073,0.26349,0.57352>, +<0.42847,0.27273,0.56539>, +<0.42449,0.28115,0.55673>, +<0.41854,0.28813,0.54796>, +<0.41113,0.29325,0.53881>, +<0.40302,0.29696,0.52953>, +<0.39520,0.30105,0.52047>, +<0.38795,0.30630,0.51116>, +<0.38188,0.31288,0.50174>, +<0.37747,0.32047,0.49226>, +<0.37450,0.32873,0.48261>, +<0.37231,0.33722,0.47301>, +<0.36944,0.34547,0.46346>, +<0.36531,0.35319,0.45390>, +<0.35976,0.36000,0.44443>, +<0.35284,0.36557,0.43491>, +<0.34497,0.36978,0.42561>, +<0.33667,0.37277,0.41647>, +<0.32806,0.37519,0.40725>, +<0.31974,0.37850,0.39831>, +<0.31196,0.38343,0.38950>, +<0.30488,0.38933,0.38088> +<0.31239,-0.38462,0.37092>, +<0.32029,-0.38006,0.37967>, +<0.32847,-0.37633,0.38847>, +<0.33687,-0.37332,0.39739>, +<0.34508,-0.36966,0.40650>, +<0.35259,-0.36506,0.41567>, +<0.35928,-0.35919,0.42508>, +<0.36461,-0.35223,0.43453>, +<0.36861,-0.34446,0.44400>, +<0.37140,-0.33617,0.45353>, +<0.37382,-0.32776,0.46312>, +<0.37725,-0.31970,0.47269>, +<0.38209,-0.31241,0.48224>, +<0.38835,-0.30631,0.49176>, +<0.39574,-0.30148,0.50115>, +<0.40372,-0.29791,0.51041>, +<0.41201,-0.29463,0.51966>, +<0.41954,-0.28975,0.52888>, +<0.42556,-0.28305,0.53779>, +<0.42954,-0.27449,0.54646>, +<0.43133,-0.26495,0.55469>, +<0.43138,-0.25527,0.56257>, +<0.43095,-0.24556,0.57062>, +<0.43358,-0.23638,0.57851>, +<0.43969,-0.22814,0.58588>, +<0.44750,-0.22127,0.59273>, +<0.45518,-0.21500,0.59961>, +<0.46162,-0.20722,0.60625>, +<0.46516,-0.19699,0.61249>, +<0.46622,-0.18629,0.61824>, +<0.46827,-0.17531,0.62375>, +<0.47205,-0.16490,0.62885>, +<0.47564,-0.15421,0.63350>, +<0.47909,-0.14311,0.63776>, +<0.48201,-0.13309,0.64135>, +<0.48533,-0.12040,0.64558>, +<0.48585,-0.11398,0.64567>, +<0.49073,-0.09584,0.65246>, +<0.49159,-0.08312,0.65582>, +<0.49132,-0.07011,0.65819>, +<0.49064,-0.05723,0.65951>, +<0.48998,-0.04441,ZP>, +<0.48960,-0.03158,0.66020>, +<0.48949,-0.01879,0.66020>, +<0.48955,-0.00602,0.66020>, +<0.48967,0.00681,0.66023>, +<0.48989,0.01960,0.66029>, +<0.48893,0.03238,0.65290>, +<0.49092,0.04482,ZP>, +<0.48776,0.05810,0.65438>, +<0.49229,0.07033,0.65760>, +<0.48941,0.08129,0.65042>, +<0.49108,0.09506,0.65146>, +<0.48511,0.09889,0.65000>, +<0.48566,0.11932,0.64543>, +<0.48253,0.13120,0.64170>, +<0.47914,0.14298,0.63764>, +<0.47565,0.15419,0.63339>, +<0.47201,0.16499,0.62877>, +<0.46819,0.17553,0.62366>, +<0.46706,0.18632,0.61841>, +<0.46514,0.19752,0.61275>, +<0.46110,0.20730,0.60639>, +<0.45403,0.21395,0.59963>, +<0.44618,0.22054,0.59291>, +<0.43900,0.22818,0.58599>, +<0.43384,0.23677,0.57869>, +<0.43200,0.24636,0.57057>, +<0.43256,0.25603,0.56259>, +<0.43219,0.26541,0.55471>, +<0.43002,0.27474,0.54646>, +<0.42540,0.28315,0.53778>, +<0.41877,0.28952,0.52879>, +<0.41095,0.29370,0.51949>, +<0.40263,0.29663,0.51046>, +<0.39455,0.30060,0.50131>, +<0.38725,0.30594,0.49192>, +<0.38141,0.31268,0.48257>, +<0.37719,0.32051,0.47296>, +<0.37447,0.32883,0.46341>, +<0.37246,0.33727,0.45396>, +<0.36961,0.34546,0.44440>, +<0.36541,0.35314,0.43499>, +<0.35973,0.35990,0.42550>, +<0.35271,0.36542,0.41616>, +<0.34486,0.36959,0.40702>, +<0.33642,0.37278,0.39783>, +<0.32783,0.37542,0.38891>, +<0.31965,0.37936,0.38016>, +<0.31191,0.38422,0.37147> +<0.31990,-0.38040,0.36160>, +<0.32813,-0.37653,0.37034>, +<0.33646,-0.37313,0.37910>, +<0.34456,-0.36938,0.38796>, +<0.35228,-0.36467,0.39709>, +<0.35898,-0.35891,0.40631>, +<0.36450,-0.35196,0.41568>, +<0.36861,-0.34431,0.42512>, +<0.37146,-0.33614,0.43462>, +<0.37384,-0.32776,0.44415>, +<0.37714,-0.31968,0.45365>, +<0.38186,-0.31216,0.46318>, +<0.38812,-0.30586,0.47274>, +<0.39547,-0.30108,0.48216>, +<0.40346,-0.29769,0.49146>, +<0.41184,-0.29504,0.50064>, +<0.41975,-0.29084,0.50978>, +<0.42642,-0.28447,0.51878>, +<0.43085,-0.27627,0.52747>, +<0.43270,-0.26677,0.53593>, +<0.43242,-0.25717,0.54396>, +<0.43029,-0.24769,0.55172>, +<0.43081,-0.23776,0.55977>, +<0.43559,-0.22874,0.56734>, +<0.44336,-0.22178,0.57460>, +<0.45263,-0.21690,0.58148>, +<0.46120,-0.21169,0.58837>, +<0.46663,-0.20283,0.59496>, +<0.46853,-0.19193,0.60098>, +<0.46705,-0.18111,0.60607>, +<0.47004,-0.17057,0.61126>, +<0.47364,-0.16026,0.61621>, +<0.47708,-0.14989,0.62023>, +<0.48188,-0.13977,0.62470>, +<0.48391,-0.12796,0.62904>, +<0.48614,-0.11698,0.63231>, +<0.48882,-0.10522,0.63621>, +<0.49125,-0.09330,0.63894>, +<0.49336,-0.08135,0.64147>, +<0.49528,-0.06869,0.64367>, +<0.49689,-0.05626,0.64521>, +<0.49812,-0.04402,0.64728>, +<0.49911,-0.03146,0.64835>, +<0.49977,-0.01883,0.64900>, +<0.50010,-0.00610,0.64924>, +<0.50009,0.00654,0.64896>, +<0.49975,0.01919,0.64815>, +<0.49912,0.03153,0.64644>, +<0.49812,0.04428,0.64553>, +<0.49687,0.05636,0.64399>, +<0.49532,0.06859,0.64206>, +<0.49357,0.08018,0.63940>, +<0.49133,0.09287,0.63771>, +<0.48893,0.10482,0.63560>, +<0.48633,0.11625,0.63272>, +<0.48367,0.12698,0.62973>, +<0.48102,0.13845,0.62483>, +<0.47707,0.14972,0.62089>, +<0.47356,0.16049,0.61618>, +<0.46990,0.17091,0.61121>, +<0.46882,0.18158,0.60563>, +<0.46909,0.19225,0.60038>, +<0.46642,0.20284,0.59446>, +<0.45982,0.21045,0.58796>, +<0.45079,0.21536,0.58134>, +<0.44203,0.22145,0.57461>, +<0.43516,0.22953,0.56763>, +<0.43171,0.23885,0.55982>, +<0.43212,0.24844,0.55180>, +<0.43389,0.25758,0.54393>, +<0.43375,0.26735,0.53607>, +<0.43120,0.27697,0.52776>, +<0.42594,0.28471,0.51902>, +<0.41888,0.29036,0.50980>, +<0.41068,0.29378,0.50062>, +<0.40205,0.29634,0.49156>, +<0.39397,0.30024,0.48228>, +<0.38681,0.30568,0.47310>, +<0.38111,0.31262,0.46367>, +<0.37716,0.32042,0.45407>, +<0.37463,0.32867,0.44459>, +<0.37263,0.33712,0.43498>, +<0.36968,0.34532,0.42559>, +<0.36531,0.35292,0.41617>, +<0.35949,0.35958,0.40677>, +<0.35240,0.36500,0.39762>, +<0.34440,0.36927,0.38848>, +<0.33603,0.37266,0.37957>, +<0.32757,0.37594,0.37085>, +<0.31946,0.37990,0.36212> +<0.32772,-0.37655,0.35223>, +<0.33591,-0.37284,0.36093>, +<0.34401,-0.36886,0.36975>, +<0.35160,-0.36416,0.37862>, +<0.35851,-0.35840,0.38781>, +<0.36414,-0.35169,0.39710>, +<0.36853,-0.34403,0.40644>, +<0.37158,-0.33591,0.41586>, +<0.37402,-0.32761,0.42536>, +<0.37733,-0.31956,0.43492>, +<0.38185,-0.31209,0.44438>, +<0.38797,-0.30563,0.45383>, +<0.39534,-0.30069,0.46331>, +<0.40338,-0.29730,0.47262>, +<0.41181,-0.29511,0.48187>, +<0.41983,-0.29155,0.49104>, +<0.42682,-0.28580,0.50005>, +<0.43195,-0.27786,0.50887>, +<0.43414,-0.26851,0.51723>, +<0.43381,-0.25877,0.52539>, +<0.43099,-0.24951,0.53328>, +<0.42958,-0.24011,0.54123>, +<0.43217,-0.23025,0.54923>, +<0.43913,-0.22217,0.55657>, +<0.44817,-0.21690,0.56335>, +<0.45860,-0.21411,0.56993>, +<0.46680,-0.20760,0.57665>, +<0.47091,-0.19747,0.58283>, +<0.47085,-0.18609,0.58850>, +<0.46690,-0.17534,0.59361>, +<0.46730,-0.16442,0.59906>, +<0.47516,-0.15574,0.60376>, +<0.47961,-0.14574,0.60749>, +<0.48608,-0.13666,0.61174>, +<0.48818,-0.12540,0.61639>, +<0.48698,-0.11399,0.61980>, +<0.48950,-0.10200,0.62342>, +<0.49180,-0.09029,0.62635>, +<0.49477,-0.07797,0.62853>, +<0.49752,-0.06734,0.63128>, +<0.49693,-0.05538,0.63286>, +<0.49818,-0.04291,0.63426>, +<0.49909,-0.03069,0.63529>, +<0.49968,-0.01843,0.63582>, +<0.49997,-0.00607,0.63598>, +<0.50045,0.00542,0.63564>, +<0.49969,0.01808,0.63454>, +<0.49914,0.02981,0.63315>, +<0.49818,0.04304,0.63210>, +<0.49812,0.05476,0.63045>, +<0.49577,0.06692,0.62930>, +<0.49446,0.07591,0.62522>, +<0.49182,0.09017,0.62450>, +<0.48947,0.10247,0.62194>, +<0.48955,0.11375,0.62028>, +<0.48940,0.12509,0.61721>, +<0.48472,0.13529,0.61254>, +<0.47843,0.14530,0.60825>, +<0.47506,0.15605,0.60364>, +<0.46842,0.16570,0.59910>, +<0.46977,0.17690,0.59391>, +<0.47276,0.18680,0.58880>, +<0.47170,0.19848,0.58298>, +<0.46564,0.20726,0.57644>, +<0.45653,0.21227,0.56969>, +<0.44633,0.21591,0.56312>, +<0.43785,0.22238,0.55640>, +<0.43247,0.23108,0.54902>, +<0.43092,0.24063,0.54113>, +<0.43327,0.24983,0.53328>, +<0.43545,0.25953,0.52563>, +<0.43518,0.26961,0.51767>, +<0.43216,0.27864,0.50915>, +<0.42633,0.28585,0.50015>, +<0.41884,0.29087,0.49103>, +<0.41029,0.29362,0.48197>, +<0.40164,0.29595,0.47278>, +<0.39361,0.29992,0.46357>, +<0.38657,0.30549,0.45427>, +<0.38120,0.31239,0.44476>, +<0.37737,0.32015,0.43532>, +<0.37480,0.32847,0.42576>, +<0.37270,0.33693,0.41637>, +<0.36955,0.34502,0.40700>, +<0.36496,0.35249,0.39757>, +<0.35894,0.35904,0.38840>, +<0.35170,0.36443,0.37926>, +<0.34381,0.36883,0.37027>, +<0.33554,0.37251,0.36154>, +<0.32733,0.37605,0.35274> +<0.33545,-0.37253,0.34290>, +<0.34337,-0.36826,0.35163>, +<0.35102,-0.36340,0.36046>, +<0.35784,-0.35770,0.36940>, +<0.36371,-0.35105,0.37863>, +<0.36828,-0.34373,0.38801>, +<0.37162,-0.33571,0.39743>, +<0.37431,-0.32748,0.40688>, +<0.37766,-0.31950,0.41630>, +<0.38218,-0.31201,0.42580>, +<0.38802,-0.30553,0.43518>, +<0.39524,-0.30042,0.44461>, +<0.40327,-0.29685,0.45401>, +<0.41181,-0.29486,0.46319>, +<0.42009,-0.29186,0.47243>, +<0.42734,-0.28667,0.48150>, +<0.43280,-0.27936,0.49037>, +<0.43558,-0.27018,0.49895>, +<0.43547,-0.26041,0.50706>, +<0.43270,-0.25100,0.51497>, +<0.42946,-0.24178,0.52286>, +<0.43019,-0.23204,0.53079>, +<0.43511,-0.22296,0.53851>, +<0.44377,-0.21671,0.54561>, +<0.45414,-0.21419,0.55222>, +<0.46445,-0.21103,0.55887>, +<0.47163,-0.20301,0.56548>, +<0.47353,-0.19190,0.57148>, +<0.47117,-0.18094,0.57674>, +<0.46626,-0.17041,0.58189>, +<0.46753,-0.15918,0.58723>, +<0.47422,-0.14968,0.59198>, +<0.48307,-0.14289,0.59568>, +<0.49091,-0.13435,0.60018>, +<0.49166,-0.12219,0.60378>, +<0.48773,-0.11054,0.60702>, +<0.49014,-0.09898,0.61052>, +<0.49231,-0.08742,0.61323>, +<0.49815,-0.07703,0.61601>, +<0.50231,-0.06599,0.61862>, +<0.50197,-0.05378,0.62003>, +<0.49873,-0.04189,0.62098>, +<0.49913,-0.02982,0.62203>, +<0.49983,-0.01791,0.62246>, +<0.50445,-0.00630,0.62274>, +<0.50624,0.00588,0.62287>, +<0.50238,0.01725,0.62168>, +<0.49916,0.02921,0.62042>, +<0.49833,0.04138,0.61906>, +<0.50124,0.05364,0.61794>, +<0.49984,0.06582,0.61612>, +<0.49425,0.07579,0.61373>, +<0.49225,0.08786,0.61191>, +<0.49035,0.09967,0.60922>, +<0.49245,0.11078,0.60696>, +<0.49254,0.12358,0.60438>, +<0.48750,0.13277,0.60049>, +<0.47933,0.14104,0.59599>, +<0.47203,0.15027,0.59187>, +<0.46786,0.16064,0.58720>, +<0.46940,0.17164,0.58173>, +<0.47439,0.18160,0.57686>, +<0.47560,0.19304,0.57143>, +<0.47116,0.20335,0.56509>, +<0.46249,0.20984,0.55882>, +<0.45176,0.21178,0.55201>, +<0.44210,0.21613,0.54535>, +<0.43452,0.22341,0.53844>, +<0.43087,0.23268,0.53073>, +<0.43092,0.24252,0.52291>, +<0.43514,0.25195,0.51523>, +<0.43723,0.26158,0.50752>, +<0.43662,0.27116,0.49924>, +<0.43286,0.27985,0.49052>, +<0.42649,0.28656,0.48158>, +<0.41855,0.29091,0.47251>, +<0.40992,0.29315,0.46332>, +<0.40143,0.29543,0.45414>, +<0.39357,0.29951,0.44490>, +<0.38680,0.30511,0.43550>, +<0.38154,0.31208,0.42608>, +<0.37771,0.31999,0.41662>, +<0.37508,0.32830,0.40725>, +<0.37272,0.33665,0.39796>, +<0.36919,0.34458,0.38855>, +<0.36431,0.35188,0.37929>, +<0.35814,0.35833,0.37012>, +<0.35102,0.36373,0.36104>, +<0.34322,0.36826,0.35226>, +<0.33516,0.37221,0.34345> +<0.34283,-0.36781,0.33355>, +<0.35022,-0.36270,0.34240>, +<0.35718,-0.35694,0.35135>, +<0.36312,-0.35040,0.36042>, +<0.36800,-0.34312,0.36968>, +<0.37165,-0.33537,0.37903>, +<0.37468,-0.32726,0.38847>, +<0.37822,-0.31937,0.39793>, +<0.38270,-0.31193,0.40736>, +<0.38846,-0.30533,0.41686>, +<0.39542,-0.30015,0.42617>, +<0.40327,-0.29642,0.43553>, +<0.41176,-0.29437,0.44478>, +<0.42012,-0.29180,0.45395>, +<0.42775,-0.28711,0.46320>, +<0.43371,-0.28023,0.47217>, +<0.43705,-0.27151,0.48080>, +<0.43731,-0.26178,0.48902>, +<0.43497,-0.25241,0.49690>, +<0.43015,-0.24359,0.50462>, +<0.42921,-0.23379,0.51273>, +<0.43218,-0.22417,0.52053>, +<0.43954,-0.21677,0.52774>, +<0.44932,-0.21247,0.53443>, +<0.46050,-0.21212,0.54079>, +<0.46987,-0.20687,0.54761>, +<0.47553,-0.19740,0.55399>, +<0.47514,-0.18608,0.55952>, +<0.46947,-0.17596,0.56432>, +<0.46591,-0.16496,0.56963>, +<0.46820,-0.15375,0.57462>, +<0.47610,-0.14533,0.57920>, +<0.48690,-0.14024,0.58341>, +<0.49392,-0.13051,0.58810>, +<0.49371,-0.11805,0.59147>, +<0.48723,-0.10722,0.59416>, +<0.48634,-0.09528,0.59783>, +<0.49284,-0.08444,0.60055>, +<0.50039,-0.07585,0.60325>, +<0.50535,-0.06464,0.60606>, +<0.50409,-0.05209,0.60722>, +<0.49834,-0.04122,0.60782>, +<0.49920,-0.02912,0.60899>, +<0.49973,-0.01690,0.60907>, +<0.50676,-0.00684,0.60991>, +<0.50897,0.00500,0.61004>, +<0.50500,0.01656,0.60897>, +<0.49924,0.02780,0.60726>, +<0.49839,0.04015,0.60583>, +<0.50245,0.05173,0.60534>, +<0.50119,0.06359,0.60298>, +<0.49453,0.07392,0.60084>, +<0.48894,0.08464,0.59995>, +<0.49084,0.09709,0.59565>, +<0.49523,0.10844,0.59442>, +<0.49683,0.11996,0.59197>, +<0.49168,0.13070,0.58854>, +<0.48128,0.13730,0.58392>, +<0.47290,0.14490,0.57996>, +<0.46721,0.15525,0.57498>, +<0.46890,0.16661,0.56964>, +<0.47496,0.17654,0.56487>, +<0.47833,0.18758,0.55964>, +<0.47599,0.19862,0.55409>, +<0.46824,0.20659,0.54777>, +<0.45810,0.20983,0.54092>, +<0.44735,0.21104,0.53463>, +<0.43810,0.21638,0.52790>, +<0.43190,0.22484,0.52062>, +<0.43004,0.23493,0.51290>, +<0.43263,0.24462,0.50493>, +<0.43727,0.25351,0.49739>, +<0.43893,0.26308,0.48942>, +<0.43771,0.27263,0.48105>, +<0.43327,0.28087,0.47233>, +<0.42651,0.28702,0.46323>, +<0.41852,0.29100,0.45403>, +<0.40980,0.29246,0.44492>, +<0.40139,0.29494,0.43572>, +<0.39371,0.29914,0.42647>, +<0.38717,0.30492,0.41710>, +<0.38207,0.31210,0.40770>, +<0.37827,0.31994,0.39833>, +<0.37532,0.32809,0.38908>, +<0.37259,0.33628,0.37972>, +<0.36870,0.34406,0.37037>, +<0.36358,0.35124,0.36116>, +<0.35739,0.35754,0.35208>, +<0.35027,0.36298,0.34317>, +<0.34274,0.36773,0.33429> +<0.34974,-0.36220,0.32452>, +<0.35640,-0.35625,0.33336>, +<0.36250,-0.34971,0.34241>, +<0.36758,-0.34255,0.35168>, +<0.37171,-0.33489,0.36097>, +<0.37525,-0.32710,0.37039>, +<0.37905,-0.31935,0.37978>, +<0.38354,-0.31197,0.38920>, +<0.38908,-0.30532,0.39865>, +<0.39580,-0.29987,0.40808>, +<0.40345,-0.29588,0.41737>, +<0.41168,-0.29330,0.42661>, +<0.42004,-0.29117,0.43576>, +<0.42779,-0.28710,0.44494>, +<0.43426,-0.28082,0.45405>, +<0.43828,-0.27255,0.46284>, +<0.43926,-0.26315,0.47123>, +<0.43734,-0.25356,0.47922>, +<0.43261,-0.24476,0.48679>, +<0.42928,-0.23561,0.49466>, +<0.43013,-0.22558,0.50268>, +<0.43578,-0.21683,0.51031>, +<0.44484,-0.21150,0.51726>, +<0.45525,-0.20957,0.52360>, +<0.46608,-0.20879,0.52988>, +<0.47481,-0.20225,0.53668>, +<0.47844,-0.19135,0.54298>, +<0.47566,-0.18024,0.54813>, +<0.46817,-0.17094,0.55270>, +<0.46561,-0.15978,0.55797>, +<0.46957,-0.14869,0.56286>, +<0.47873,-0.14137,0.56701>, +<0.49011,-0.13694,0.57108>, +<0.49656,-0.12664,0.57597>, +<0.49524,-0.11430,0.57944>, +<0.48689,-0.10424,0.58192>, +<0.48608,-0.09201,0.58521>, +<0.49211,-0.08134,0.58791>, +<0.50287,-0.07414,0.59047>, +<0.50815,-0.06279,0.59336>, +<0.50594,-0.05048,0.59445>, +<0.49810,-0.04063,0.59492>, +<0.49524,-0.02837,0.59603>, +<0.49903,-0.01634,0.59637>, +<0.50888,-0.00754,0.59716>, +<0.51179,0.00508,0.59751>, +<0.50753,0.01647,0.59590>, +<0.49887,0.02630,0.59455>, +<0.49748,0.03892,0.59302>, +<0.50406,0.04992,0.59193>, +<0.50228,0.06239,0.59024>, +<0.49352,0.07155,0.58848>, +<0.48864,0.08262,0.58639>, +<0.48957,0.09452,0.58365>, +<0.49609,0.10481,0.58122>, +<0.49953,0.11690,0.57931>, +<0.49465,0.12823,0.57562>, +<0.48403,0.13443,0.57137>, +<0.47354,0.14023,0.56765>, +<0.46722,0.15017,0.56336>, +<0.46744,0.16213,0.55778>, +<0.47466,0.17149,0.55323>, +<0.47982,0.18220,0.54844>, +<0.47982,0.19364,0.54296>, +<0.47399,0.20291,0.53666>, +<0.46416,0.20758,0.53002>, +<0.45301,0.20735,0.52394>, +<0.44267,0.21041,0.51748>, +<0.43439,0.21725,0.51056>, +<0.43054,0.22698,0.50287>, +<0.43125,0.23697,0.49495>, +<0.43597,0.24572,0.48726>, +<0.43962,0.25478,0.47956>, +<0.44073,0.26452,0.47148>, +<0.43870,0.27381,0.46306>, +<0.43382,0.28167,0.45420>, +<0.42659,0.28698,0.44501>, +<0.41841,0.28999,0.43590>, +<0.40973,0.29151,0.42673>, +<0.40159,0.29447,0.41756>, +<0.39420,0.29902,0.40833>, +<0.38796,0.30508,0.39901>, +<0.38299,0.31217,0.38970>, +<0.37906,0.31988,0.38035>, +<0.37576,0.32779,0.37102>, +<0.37240,0.33577,0.36161>, +<0.36818,0.34337,0.35230>, +<0.36289,0.35035,0.34318>, +<0.35665,0.35666,0.33424>, +<0.34976,0.36241,0.32528> +<0.35600,-0.35592,0.31548> +<0.36196,-0.34921,0.32445> +<0.36720,-0.34203,0.33358> +<0.37161,-0.33444,0.34291> +<0.37561,-0.32668,0.35227> +<0.37977,-0.31907,0.36167> +<0.38440,-0.31185,0.37111> +<0.38985,-0.30520,0.38058> +<0.39633,-0.29959,0.38995> +<0.40390,-0.29530,0.39932> +<0.41210,-0.29251,0.40857> +<0.42051,-0.29051,0.41784> +<0.42829,-0.28692,0.42706> +<0.43504,-0.28142,0.43622> +<0.43968,-0.27369,0.44515> +<0.44133,-0.26436,0.45361> +<0.43981,-0.25459,0.46157> +<0.43567,-0.24553,0.46913> +<0.43058,-0.23706,0.47671> +<0.42919,-0.22750,0.48467> +<0.43214,-0.21799,0.49252> +<0.43985,-0.21076,0.49982> +<0.45049,-0.20735,0.50647> +<0.46170,-0.20758,0.51261> +<0.47208,-0.20484,0.51939> +<0.47950,-0.19675,0.52631> +<0.48005,-0.18543,0.53209> +<0.47525,-0.17501,0.53708> +<0.46751,-0.16607,0.54179> +<0.46545,-0.15460,0.54699> +<0.47121,-0.14359,0.55192> +<0.48207,-0.13845,0.55527> +<0.49349,-0.13420,0.55992> +<0.49934,-0.12277,0.56454> +<0.49591,-0.11057,0.56718> +<0.48719,-0.10113,0.56962> +<0.48653,-0.08858,0.57308> +<0.49327,-0.07829,0.57586> +<0.50467,-0.07260,0.57816> +<0.51004,-0.06109,0.58067> +<0.50704,-0.04874,0.58164> +<0.49775,-0.03970,0.58227> +<0.49436,-0.02723,0.58354> +<0.49935,-0.01533,0.58353> +<0.51008,-0.00758,0.58417> +<0.51336,0.00439,0.58441> +<0.50926,0.01608,0.58331> +<0.49943,0.02420,0.58167> +<0.49722,0.03692,0.58053> +<0.50502,0.04760,0.57915> +<0.50315,0.06047,0.57734> +<0.49393,0.06924,0.57525> +<0.48751,0.07974,0.57358> +<0.48889,0.09263,0.57070> +<0.49826,0.10169,0.56902> +<0.50012,0.11317,0.56692> +<0.49642,0.12489,0.56350> +<0.48700,0.13174,0.55948> +<0.47616,0.13616,0.55582> +<0.46813,0.14492,0.55187> +<0.46721,0.15648,0.54686> +<0.47350,0.16620,0.54151> +<0.48060,0.17519,0.53713> +<0.48377,0.18726,0.53232> +<0.47924,0.19827,0.52594> +<0.47010,0.20462,0.51919> +<0.45929,0.20508,0.51281> +<0.44835,0.20597,0.50683> +<0.43868,0.21079,0.50018> +<0.43207,0.21896,0.49302> +<0.43071,0.22900,0.48522> +<0.43335,0.23836,0.47743> +<0.43884,0.24689,0.46986> +<0.44240,0.25637,0.46205> +<0.44284,0.26625,0.45385> +<0.43985,0.27518,0.44520> +<0.43409,0.28211,0.43619> +<0.42669,0.28669,0.42699> +<0.41847,0.28906,0.41775> +<0.40996,0.29069,0.40860> +<0.40192,0.29387,0.39944> +<0.39473,0.29870,0.39022> +<0.38868,0.30490,0.38097> +<0.38374,0.31205,0.37162> +<0.37960,0.31959,0.36228> +<0.37592,0.32741,0.35286> +<0.37219,0.33519,0.34357> +<0.36771,0.34277,0.33436> +<0.36242,0.34978,0.32532> +<0.35628,0.35636,0.31633> +} +normal_vectors { +nx*ny, +<-0.727,-0.685,0.031>, +<-0.784,-0.621,-0.005>, +<-0.847,-0.531,-0.014>, +<-0.889,-0.457,-0.019>, +<-0.897,-0.442,-0.024>, +<-0.867,-0.498,-0.014>, +<-0.810,-0.586,-0.009>, +<-0.719,-0.695,-0.018>, +<-0.590,-0.807,-0.035>, +<-0.442,-0.896,-0.047>, +<-0.319,-0.947,-0.038>, +<-0.328,-0.944,0.018>, +<-0.512,-0.858,0.046>, +<-0.706,-0.702,0.090>, +<-0.882,-0.450,0.138>, +<-0.975,-0.137,0.172>, +<-0.969,0.175,0.176>, +<-0.919,0.378,0.107>, +<-0.970,0.239,0.033>, +<-0.989,-0.131,-0.074>, +<-0.833,-0.525,-0.173>, +<-0.516,-0.831,-0.209>, +<-0.213,-0.957,-0.198>, +<-0.260,-0.961,-0.094>, +<-0.656,-0.755,0.029>, +<-0.939,-0.301,0.168>, +<-0.951,0.227,0.211>, +<-0.864,0.486,0.131>, +<-0.968,0.235,0.081>, +<-0.939,-0.333,-0.083>, +<-0.579,-0.792,-0.193>, +<-0.422,-0.902,-0.087>, +<-0.770,-0.638,0.005>, +<-0.985,-0.080,0.153>, +<-0.864,0.464,0.196>, +<-0.921,0.382,0.083>, +<-0.968,-0.246,-0.047>, +<-0.654,-0.740,-0.156>, +<-0.685,-0.729,0.009>, +<-0.977,-0.141,0.162>, +<-0.862,0.492,0.121>, +<-0.863,0.503,0.045>, +<-0.998,-0.057,0.017>, +<-0.850,-0.526,-0.011>, +<-0.921,-0.387,0.038>, +<-0.940,0.327,0.101>, +<-0.837,0.546,0.040>, +<-0.989,0.140,-0.050>, +<-0.880,-0.474,0.016>, +<-0.844,-0.514,0.154>, +<-0.981,0.103,0.162>, +<-0.711,0.702,0.032>, +<-0.658,0.743,-0.123>, +<-0.964,0.254,-0.084>, +<-0.925,-0.374,0.069>, +<-0.882,-0.431,0.192>, +<-0.981,0.144,0.133>, +<-0.728,0.685,-0.019>, +<-0.453,0.888,-0.081>, +<-0.680,0.714,-0.166>, +<-0.976,0.202,-0.079>, +<-0.926,-0.359,0.116>, +<-0.845,-0.500,0.190>, +<-0.961,-0.146,0.236>, +<-0.899,0.402,0.174>, +<-0.577,0.817,0.010>, +<-0.182,0.979,-0.092>, +<-0.212,0.955,-0.207>, +<-0.550,0.812,-0.194>, +<-0.861,0.486,-0.150>, +<-0.995,0.089,-0.045>, +<-0.960,-0.275,0.049>, +<-0.926,-0.351,0.137>, +<-0.975,-0.128,0.181>, +<-0.967,0.183,0.176>, +<-0.857,0.495,0.142>, +<-0.673,0.735,0.086>, +<-0.482,0.875,0.033>, +<-0.314,0.949,0.006>, +<-0.353,0.934,-0.052>, +<-0.493,0.869,-0.044>, +<-0.637,0.770,-0.026>, +<-0.757,0.653,-0.012>, +<-0.838,0.546,-0.006>, +<-0.886,0.464,-0.012>, +<-0.906,0.422,-0.022>, +<-0.889,0.458,-0.018>, +<-0.837,0.547,-0.014>, +<-0.767,0.642,-0.006>, +<-0.707,0.706,0.032> +<-0.667,-0.745,-0.005>, +<-0.728,-0.684,-0.042>, +<-0.806,-0.591,-0.047>, +<-0.869,-0.493,-0.035>, +<-0.904,-0.427,-0.015>, +<-0.900,-0.435,0.009>, +<-0.859,-0.511,0.027>, +<-0.787,-0.617,0.027>, +<-0.677,-0.736,0.017>, +<-0.537,-0.843,0.002>, +<-0.391,-0.920,-0.018>, +<-0.302,-0.953,-0.021>, +<-0.403,-0.915,-0.026>, +<-0.595,-0.804,0.007>, +<-0.794,-0.606,0.051>, +<-0.942,-0.323,0.087>, +<-0.995,-0.013,0.104>, +<-0.953,0.279,0.119>, +<-0.940,0.335,0.065>, +<-1,0.022,0.014>, +<-0.931,-0.357,-0.081>, +<-0.685,-0.716,-0.135>, +<-0.342,-0.923,-0.174>, +<-0.211,-0.973,-0.088>, +<-0.546,-0.837,-0.037>, +<-0.878,-0.467,0.103>, +<-0.987,0.034,0.157>, +<-0.896,0.418,0.151>, +<-0.944,0.314,0.102>, +<-0.973,-0.225,-0.057>, +<-0.698,-0.697,-0.166>, +<-0.469,-0.880,-0.077>, +<-0.723,-0.691,0>, +<-0.975,-0.166,0.144>, +<-0.907,0.376,0.187>, +<-0.934,0.350,0.075>, +<-0.974,-0.219,-0.062>, +<-0.719,-0.679,-0.146>, +<-0.746,-0.663,0.061>, +<-0.971,-0.174,0.165>, +<-0.892,0.404,0.203>, +<-0.884,0.466,0.033>, +<-0.991,-0.044,-0.129>, +<-0.862,-0.506,-0.017>, +<-0.931,-0.345,0.118>, +<-0.932,0.338,0.130>, +<-0.881,0.473,0.015>, +<-0.984,0.092,-0.152>, +<-0.918,-0.397,-0.011>, +<-0.891,-0.411,0.191>, +<-0.974,0.143,0.175>, +<-0.750,0.658,0.061>, +<-0.750,0.644,-0.149>, +<-0.979,0.191,-0.071>, +<-0.935,-0.350,0.054>, +<-0.925,-0.335,0.181>, +<-0.966,0.227,0.122>, +<-0.684,0.729,-0.031>, +<-0.517,0.849,-0.106>, +<-0.792,0.596,-0.129>, +<-0.993,0.109,-0.040>, +<-0.914,-0.388,0.115>, +<-0.894,-0.407,0.185>, +<-0.985,0.046,0.167>, +<-0.830,0.548,0.100>, +<-0.464,0.884,-0.053>, +<-0.172,0.981,-0.095>, +<-0.367,0.915,-0.171>, +<-0.715,0.687,-0.127>, +<-0.947,0.316,-0.059>, +<-0.997,-0.063,0.037>, +<-0.937,-0.342,0.074>, +<-0.963,-0.239,0.125>, +<-0.993,0.057,0.106>, +<-0.927,0.366,0.086>, +<-0.768,0.638,0.047>, +<-0.569,0.822,0.005>, +<-0.380,0.925,-0.029>, +<-0.320,0.947,-0.029>, +<-0.439,0.898,-0.019>, +<-0.586,0.810,0.002>, +<-0.721,0.693,0.021>, +<-0.820,0.571,0.032>, +<-0.882,0.471,0.026>, +<-0.914,0.405,0.004>, +<-0.907,0.420,-0.018>, +<-0.862,0.506,-0.040>, +<-0.790,0.612,-0.050>, +<-0.707,0.706,-0.043>, +<-0.642,0.767,-0.004> +<-0.573,-0.819,-0.013>, +<-0.639,-0.767,-0.050>, +<-0.730,-0.681,-0.057>, +<-0.818,-0.573,-0.047>, +<-0.887,-0.461,-0.026>, +<-0.924,-0.382,0>, +<-0.917,-0.398,0.018>, +<-0.869,-0.494,0.026>, +<-0.786,-0.618,0.024>, +<-0.663,-0.748,0.011>, +<-0.516,-0.857,-0.006>, +<-0.357,-0.934,-0.032>, +<-0.299,-0.954,-0.030>, +<-0.442,-0.897,-0.011>, +<-0.645,-0.764,0.025>, +<-0.840,-0.539,0.061>, +<-0.966,-0.241,0.091>, +<-0.992,0.055,0.110>, +<-0.948,0.310,0.078>, +<-0.976,0.214,0.040>, +<-0.987,-0.157,-0.041>, +<-0.839,-0.534,-0.105>, +<-0.554,-0.822,-0.134>, +<-0.257,-0.961,-0.099>, +<-0.390,-0.918,-0.066>, +<-0.774,-0.631,0.060>, +<-0.975,-0.177,0.132>, +<-0.943,0.280,0.179>, +<-0.935,0.348,0.069>, +<-0.992,-0.109,-0.057>, +<-0.815,-0.561,-0.146>, +<-0.564,-0.822,-0.084>, +<-0.683,-0.730,0.009>, +<-0.952,-0.266,0.154>, +<-0.947,0.256,0.193>, +<-0.954,0.292,0.065>, +<-0.969,-0.163,-0.185>, +<-0.814,-0.569,-0.113>, +<-0.815,-0.575,0.070>, +<-0.968,-0.163,0.189>, +<-0.928,0.293,0.229>, +<-0.979,0.204,0.015>, +<-0.990,-0.048,-0.134>, +<-0.961,-0.274,-0.018>, +<-0.947,-0.250,0.204>, +<-0.956,0.241,0.169>, +<-0.966,0.260,-0.006>, +<-0.991,0.055,-0.125>, +<-0.983,-0.180,-0.024>, +<-0.940,-0.266,0.212>, +<-0.964,0.159,0.213>, +<-0.831,0.546,0.105>, +<-0.831,0.539,-0.135>, +<-0.970,0.153,-0.191>, +<-0.959,-0.280,0.038>, +<-0.961,-0.202,0.189>, +<-0.942,0.307,0.133>, +<-0.679,0.734,0.004>, +<-0.609,0.782,-0.132>, +<-0.863,0.490,-0.128>, +<-1,0.015,-0.021>, +<-0.917,-0.394,0.066>, +<-0.945,-0.261,0.195>, +<-0.963,0.230,0.141>, +<-0.727,0.683,0.063>, +<-0.336,0.940,-0.059>, +<-0.256,0.959,-0.121>, +<-0.581,0.802,-0.139>, +<-0.860,0.499,-0.108>, +<-0.992,0.122,-0.028>, +<-0.968,-0.246,0.047>, +<-0.951,-0.295,0.091>, +<-0.995,-0.017,0.100>, +<-0.956,0.282,0.082>, +<-0.819,0.572,0.054>, +<-0.621,0.783,0.015>, +<-0.416,0.909,-0.019>, +<-0.310,0.950,-0.031>, +<-0.407,0.913,-0.033>, +<-0.563,0.826,-0.008>, +<-0.709,0.705,0.009>, +<-0.822,0.570,0.023>, +<-0.894,0.448,0.025>, +<-0.932,0.363,0.015>, +<-0.927,0.375,-0.006>, +<-0.879,0.476,-0.035>, +<-0.803,0.594,-0.053>, +<-0.707,0.704,-0.061>, +<-0.612,0.789,-0.051>, +<-0.546,0.838,-0.012> +<-0.478,-0.878,-0.017>, +<-0.535,-0.844,-0.043>, +<-0.628,-0.777,-0.052>, +<-0.734,-0.677,-0.050>, +<-0.830,-0.556,-0.040>, +<-0.903,-0.430,-0.022>, +<-0.940,-0.341,-0.002>, +<-0.932,-0.363,0.012>, +<-0.880,-0.475,0.016>, +<-0.789,-0.615,0.011>, +<-0.654,-0.756,0.001>, +<-0.497,-0.868,-0.013>, +<-0.330,-0.944,-0.020>, +<-0.307,-0.952,-0.010>, +<-0.477,-0.879,0.012>, +<-0.686,-0.726,0.045>, +<-0.873,-0.480,0.080>, +<-0.979,-0.182,0.094>, +<-0.989,0.107,0.099>, +<-0.961,0.274,0.030>, +<-0.998,0.057,-0.003>, +<-0.946,-0.316,-0.076>, +<-0.737,-0.666,-0.114>, +<-0.425,-0.894,-0.139>, +<-0.318,-0.947,-0.032>, +<-0.638,-0.769,0.037>, +<-0.917,-0.379,0.125>, +<-0.982,0.069,0.174>, +<-0.953,0.299,0.046>, +<-1,0.004,-0.042>, +<-0.895,-0.428,-0.123>, +<-0.694,-0.698,-0.174>, +<-0.692,-0.721,0.043>, +<-0.925,-0.343,0.161>, +<-0.971,0.113,0.211>, +<-0.995,0.094,0.022>, +<-0.978,-0.153,-0.142>, +<-0.923,-0.381,-0.049>, +<-0.865,-0.484,0.131>, +<-0.946,-0.165,0.279>, +<-0.943,0.170,0.287>, +<-0.993,0.120,0.019>, +<-0.998,-0.061,0>, +<-0.987,-0.162,-0.008>, +<-0.964,-0.153,0.218>, +<-0.968,0.133,0.213>, +<-0.985,0.172,0>, +<-0.998,0.059,0>, +<-0.997,-0.081,0.012>, +<-0.960,-0.122,0.253>, +<-0.940,0.187,0.285>, +<-0.886,0.438,0.148>, +<-0.948,0.316,-0.033>, +<-0.980,0.136,-0.144>, +<-0.998,-0.070,-0.002>, +<-0.977,-0.062,0.203>, +<-0.908,0.387,0.162>, +<-0.704,0.709,0.034>, +<-0.733,0.647,-0.209>, +<-0.921,0.370,-0.122>, +<-0.995,-0.097,-0.002>, +<-0.943,-0.327,0.059>, +<-0.985,-0.031,0.172>, +<-0.894,0.432,0.122>, +<-0.594,0.804,0.018>, +<-0.298,0.954,-0.028>, +<-0.455,0.879,-0.145>, +<-0.761,0.639,-0.115>, +<-0.955,0.287,-0.074>, +<-0.996,-0.093,0.003>, +<-0.959,-0.282,0.036>, +<-0.992,-0.081,0.100>, +<-0.973,0.215,0.084>, +<-0.853,0.517,0.063>, +<-0.660,0.751,0.032>, +<-0.449,0.894,0.003>, +<-0.311,0.950,-0.017>, +<-0.379,0.925,-0.024>, +<-0.546,0.837,-0.013>, +<-0.700,0.714,0>, +<-0.825,0.566,0.009>, +<-0.904,0.428,0.015>, +<-0.945,0.327,0.011>, +<-0.942,0.337,-0.003>, +<-0.893,0.449,-0.025>, +<-0.814,0.580,-0.045>, +<-0.709,0.703,-0.055>, +<-0.598,0.799,-0.056>, +<-0.505,0.862,-0.044>, +<-0.451,0.892,-0.016> +<-0.419,-0.908,-0.021>, +<-0.439,-0.898,-0.025>, +<-0.513,-0.858,-0.040>, +<-0.620,-0.783,-0.045>, +<-0.738,-0.673,-0.041>, +<-0.841,-0.540,-0.028>, +<-0.914,-0.405,-0.012>, +<-0.949,-0.315,0.002>, +<-0.939,-0.343,0.009>, +<-0.885,-0.466,0.010>, +<-0.787,-0.617,0.003>, +<-0.644,-0.765,-0.006>, +<-0.482,-0.876,-0.017>, +<-0.328,-0.944,-0.015>, +<-0.339,-0.941,0>, +<-0.524,-0.851,0.032>, +<-0.728,-0.682,0.065>, +<-0.901,-0.425,0.086>, +<-0.985,-0.147,0.090>, +<-0.990,0.127,0.064>, +<-0.984,0.179,0.004>, +<-0.993,-0.109,-0.049>, +<-0.880,-0.464,-0.104>, +<-0.650,-0.750,-0.122>, +<-0.406,-0.912,-0.053>, +<-0.508,-0.861,0.014>, +<-0.825,-0.550,0.129>, +<-0.973,-0.157,0.170>, +<-0.985,0.140,0.104>, +<-0.998,0.058,-0.032>, +<-0.913,-0.338,-0.230>, +<-0.813,-0.558,-0.166>, +<-0.786,-0.612,0.088>, +<-0.889,-0.417,0.192>, +<-0.964,-0.055,0.258>, +<-0.998,-0.010,0.061>, +<-0.985,-0.172,0.010>, +<-0.971,-0.238,-0.013>, +<-0.937,-0.306,0.167>, +<-0.950,-0.119,0.290>, +<-0.972,-0.028,0.235>, +<-0.996,-0.090,-0.001>, +<-0.991,-0.072,0.111>, +<-1,-0.039,-0.006>, +<-0.994,-0.014,0.109>, +<-0.992,0.013,0.125>, +<-1,0.035,0.005>, +<-0.998,0.060,-0.003>, +<-0.996,0.086,0.006>, +<-0.986,0.060,0.157>, +<-0.959,0.143,0.244>, +<-0.962,0.247,0.114>, +<-0.979,0.206,-0.006>, +<-0.989,0.147,0.015>, +<-0.997,0.038,0.061>, +<-0.961,0.133,0.244>, +<-0.874,0.436,0.214>, +<-0.833,0.547,0.078>, +<-0.835,0.519,-0.183>, +<-0.920,0.307,-0.245>, +<-0.993,-0.115,0.009>, +<-0.981,-0.152,0.125>, +<-0.965,0.204,0.164>, +<-0.796,0.595,0.115>, +<-0.469,0.883,-0.005>, +<-0.406,0.911,-0.071>, +<-0.675,0.727,-0.127>, +<-0.889,0.445,-0.105>, +<-0.996,0.079,-0.044>, +<-0.980,-0.199,0.007>, +<-0.991,-0.114,0.075>, +<-0.982,0.167,0.089>, +<-0.886,0.456,0.080>, +<-0.702,0.710,0.052>, +<-0.493,0.870,0.016>, +<-0.335,0.942,-0.007>, +<-0.372,0.928,-0.019>, +<-0.534,0.845,-0.019>, +<-0.691,0.723,-0.008>, +<-0.823,0.568,0.002>, +<-0.908,0.420,0.009>, +<-0.951,0.310,0.009>, +<-0.949,0.314,0.003>, +<-0.904,0.428,-0.011>, +<-0.823,0.567,-0.027>, +<-0.711,0.702,-0.042>, +<-0.587,0.808,-0.047>, +<-0.478,0.878,-0.039>, +<-0.411,0.911,-0.025>, +<-0.397,0.917,-0.021> +<-0.434,-0.900,-0.019>, +<-0.396,-0.918,-0.005>, +<-0.403,-0.915,-0.016>, +<-0.492,-0.870,-0.030>, +<-0.613,-0.790,-0.032>, +<-0.742,-0.670,-0.025>, +<-0.848,-0.529,-0.015>, +<-0.921,-0.390,-0.003>, +<-0.954,-0.300,0.004>, +<-0.942,-0.335,0.007>, +<-0.886,-0.464,0.003>, +<-0.782,-0.623,-0.006>, +<-0.637,-0.771,-0.017>, +<-0.478,-0.878,-0.022>, +<-0.348,-0.937,-0.009>, +<-0.388,-0.921,0.015>, +<-0.573,-0.818,0.047>, +<-0.767,-0.637,0.080>, +<-0.918,-0.385,0.091>, +<-0.988,-0.133,0.084>, +<-0.995,0.094,0.034>, +<-0.999,0.046,-0.022>, +<-0.959,-0.266,-0.093>, +<-0.811,-0.572,-0.124>, +<-0.600,-0.792,-0.114>, +<-0.515,-0.857,0.003>, +<-0.723,-0.680,0.126>, +<-0.921,-0.340,0.189>, +<-0.985,-0.083,0.153>, +<-0.991,-0.126,-0.048>, +<-0.952,-0.271,-0.145>, +<-0.934,-0.357,-0.016>, +<-0.882,-0.466,0.069>, +<-0.890,-0.393,0.231>, +<-0.955,-0.182,0.234>, +<-0.985,-0.167,0.051>, +<-0.978,-0.210,-0.004>, +<-0.981,-0.195,0.003>, +<-0.976,-0.186,0.111>, +<-0.959,-0.137,0.250>, +<-0.959,-0.148,0.243>, +<-0.942,-0.058,0.330>, +<-0.922,-0.091,0.376>, +<-0.909,-0.132,0.394>, +<-0.913,-0.014,0.408>, +<-0.916,0.019,0.402>, +<-0.922,0.052,0.383>, +<-0.935,0.084,0.345>, +<-0.951,0.115,0.287>, +<-0.968,0.139,0.211>, +<-0.970,0.158,0.186>, +<-0.982,0.175,0.072>, +<-0.981,0.193,-0.001>, +<-0.978,0.207,-0.004>, +<-0.976,0.211,0.059>, +<-0.953,0.240,0.184>, +<-0.909,0.368,0.194>, +<-0.922,0.385,0.050>, +<-0.946,0.324,-0.002>, +<-0.950,0.267,-0.160>, +<-0.997,0.072,-0.035>, +<-0.983,0.061,0.173>, +<-0.904,0.391,0.170>, +<-0.693,0.714,0.106>, +<-0.496,0.868,-0.005>, +<-0.619,0.775,-0.128>, +<-0.823,0.554,-0.129>, +<-0.965,0.243,-0.095>, +<-0.997,-0.073,-0.023>, +<-0.995,-0.092,0.038>, +<-0.986,0.146,0.086>, +<-0.911,0.404,0.088>, +<-0.746,0.662,0.072>, +<-0.542,0.839,0.038>, +<-0.375,0.927,0.006>, +<-0.379,0.925,-0.016>, +<-0.526,0.850,-0.022>, +<-0.683,0.730,-0.016>, +<-0.818,0.575,-0.006>, +<-0.908,0.420,0.002>, +<-0.952,0.306,0.007>, +<-0.953,0.303,0.005>, +<-0.910,0.415,-0.001>, +<-0.829,0.559,-0.012>, +<-0.713,0.700,-0.022>, +<-0.578,0.816,-0.028>, +<-0.454,0.890,-0.028>, +<-0.367,0.930,-0.009>, +<-0.375,0.927,-0.002>, +<-0.421,0.907,-0.018> +<-0.507,-0.862,-0.011>, +<-0.437,-0.899,0.015>, +<-0.354,-0.935,0.009>, +<-0.369,-0.929,-0.009>, +<-0.475,-0.880,-0.018>, +<-0.608,-0.794,-0.017>, +<-0.744,-0.668,-0.012>, +<-0.852,-0.523,-0.004>, +<-0.924,-0.382,0.003>, +<-0.955,-0.297,0.006>, +<-0.941,-0.338,0.002>, +<-0.882,-0.471,-0.008>, +<-0.776,-0.630,-0.020>, +<-0.635,-0.772,-0.028>, +<-0.488,-0.872,-0.024>, +<-0.388,-0.922,-0.002>, +<-0.452,-0.892,0.026>, +<-0.625,-0.778,0.065>, +<-0.799,-0.594,0.090>, +<-0.926,-0.365,0.095>, +<-0.986,-0.146,0.077>, +<-1,0,0.004>, +<-0.991,-0.118,-0.063>, +<-0.909,-0.399,-0.118>, +<-0.771,-0.625,-0.119>, +<-0.674,-0.735,-0.075>, +<-0.697,-0.711,0.098>, +<-0.846,-0.499,0.191>, +<-0.941,-0.283,0.188>, +<-0.971,-0.230,0.063>, +<-0.948,-0.319,0.015>, +<-0.944,-0.329,0>, +<-0.944,-0.327,0.032>, +<-0.939,-0.324,0.113>, +<-0.948,-0.294,0.118>, +<-0.935,-0.298,0.192>, +<-0.882,-0.299,0.364>, +<-0.819,-0.247,0.518>, +<-0.737,-0.157,0.657>, +<-0.643,-0.071,0.762>, +<-0.577,-0.014,0.817>, +<-0.484,-0.002,0.875>, +<-0.451,-0.005,0.893>, +<-0.412,-0.006,0.911>, +<-0.404,-0.004,0.915>, +<-0.409,-0.004,0.912>, +<-0.428,-0.006,0.904>, +<-0.461,-0.006,0.887>, +<-0.512,0.005,0.859>, +<-0.581,0.033,0.813>, +<-0.666,0.087,0.740>, +<-0.752,0.166,0.638>, +<-0.830,0.248,0.500>, +<-0.889,0.295,0.351>, +<-0.939,0.292,0.182>, +<-0.956,0.286,0.071>, +<-0.923,0.340,0.182>, +<-0.952,0.307,0.003>, +<-0.945,0.328,0>, +<-0.957,0.289,0.026>, +<-0.979,0.193,0.074>, +<-0.936,0.289,0.203>, +<-0.835,0.522,0.172>, +<-0.667,0.739,0.091>, +<-0.677,0.730,-0.090>, +<-0.784,0.608,-0.124>, +<-0.916,0.383,-0.116>, +<-0.993,0.095,-0.066>, +<-1,-0.003,0.004>, +<-0.985,0.156,0.078>, +<-0.922,0.374,0.098>, +<-0.785,0.613,0.090>, +<-0.597,0.800,0.058>, +<-0.432,0.902,0.022>, +<-0.407,0.913,-0.007>, +<-0.528,0.849,-0.024>, +<-0.677,0.736,-0.023>, +<-0.811,0.585,-0.014>, +<-0.903,0.429,-0.004>, +<-0.950,0.312,0.004>, +<-0.953,0.302,0.007>, +<-0.913,0.408,0.005>, +<-0.833,0.554,0>, +<-0.715,0.699,-0.008>, +<-0.573,0.820,-0.014>, +<-0.437,0.900,-0.013>, +<-0.330,0.944,-0.007>, +<-0.329,0.944,0.014>, +<-0.427,0.904,0.024>, +<-0.503,0.864,-0.009> +<-0.605,-0.796,-0.015>, +<-0.528,-0.849,0.027>, +<-0.409,-0.912,0.024>, +<-0.316,-0.949,0.007>, +<-0.345,-0.939,-0.003>, +<-0.463,-0.886,-0.007>, +<-0.605,-0.796,-0.007>, +<-0.745,-0.667,-0.002>, +<-0.854,-0.520,0.004>, +<-0.925,-0.381,0.008>, +<-0.952,-0.305,0.004>, +<-0.936,-0.352,-0.005>, +<-0.875,-0.484,-0.020>, +<-0.770,-0.638,-0.032>, +<-0.638,-0.770,-0.035>, +<-0.511,-0.860,-0.024>, +<-0.446,-0.895,0.005>, +<-0.523,-0.851,0.041>, +<-0.675,-0.733,0.079>, +<-0.824,-0.557,0.104>, +<-0.927,-0.363,0.100>, +<-0.978,-0.200,0.057>, +<-0.989,-0.148,-0.016>, +<-0.959,-0.264,-0.107>, +<-0.852,-0.486,-0.195>, +<-0.801,-0.589,-0.106>, +<-0.815,-0.573,0.086>, +<-0.840,-0.514,0.176>, +<-0.904,-0.394,0.166>, +<-0.934,-0.355,0.047>, +<-0.934,-0.357,-0.005>, +<-0.937,-0.349,0.018>, +<-0.901,-0.391,0.187>, +<-0.824,-0.379,0.420>, +<-0.726,-0.255,0.639>, +<-0.578,-0.087,0.811>, +<-0.420,0.006,0.908>, +<-0.270,0.018,0.963>, +<-0.143,0.008,0.990>, +<-0.057,0.001,0.998>, +<-0.011,0,1>, +<0.004,0.002,1>, +<0.006,-0.002,1>, +<0.006,-0.001,1>, +<0.006,0,1>, +<0.006,0,1>, +<0.006,0,1>, +<0.006,0,1>, +<-0.001,0,1>, +<-0.024,0,1>, +<-0.076,-0.003,0.997>, +<-0.164,-0.007,0.986>, +<-0.289,-0.016,0.957>, +<-0.434,-0.002,0.901>, +<-0.587,0.093,0.804>, +<-0.712,0.364,0.600>, +<-0.833,0.379,0.404>, +<-0.940,0.248,0.233>, +<-0.938,0.347,0.019>, +<-0.935,0.354,-0.005>, +<-0.939,0.331,0.090>, +<-0.904,0.372,0.211>, +<-0.813,0.555,0.177>, +<-0.798,0.599,0.071>, +<-0.812,0.574,-0.105>, +<-0.856,0.479,-0.197>, +<-0.963,0.251,-0.097>, +<-0.990,0.140,-0.011>, +<-0.976,0.210,0.062>, +<-0.923,0.371,0.100>, +<-0.815,0.570,0.104>, +<-0.653,0.753,0.078>, +<-0.502,0.864,0.036>, +<-0.456,0.890,0>, +<-0.543,0.839,-0.026>, +<-0.674,0.738,-0.033>, +<-0.802,0.597,-0.026>, +<-0.895,0.445,-0.012>, +<-0.945,0.328,0.002>, +<-0.951,0.310,0.008>, +<-0.914,0.406,0.010>, +<-0.835,0.550,0.007>, +<-0.716,0.698,0.002>, +<-0.570,0.821,-0.002>, +<-0.426,0.905,-0.004>, +<-0.309,0.951,0>, +<-0.291,0.957,0.009>, +<-0.399,0.917,0.024>, +<-0.529,0.848,0.033>, +<-0.615,0.788,-0.012> +<-0.724,-0.690,-0.028>, +<-0.644,-0.765,0.023>, +<-0.522,-0.853,0.026>, +<-0.382,-0.924,0.016>, +<-0.293,-0.956,0.007>, +<-0.330,-0.944,0.002>, +<-0.455,-0.890,0>, +<-0.603,-0.798,0.004>, +<-0.745,-0.667,0.010>, +<-0.853,-0.522,0.014>, +<-0.921,-0.390,0.013>, +<-0.945,-0.328,0.003>, +<-0.926,-0.378,-0.013>, +<-0.863,-0.505,-0.030>, +<-0.763,-0.645,-0.042>, +<-0.648,-0.760,-0.042>, +<-0.549,-0.835,-0.023>, +<-0.520,-0.854,0.014>, +<-0.597,-0.800,0.058>, +<-0.723,-0.684,0.098>, +<-0.840,-0.530,0.114>, +<-0.918,-0.384,0.100>, +<-0.946,-0.323,0.023>, +<-0.926,-0.369,-0.076>, +<-0.905,-0.412,-0.104>, +<-0.884,-0.467,0>, +<-0.884,-0.467,0.035>, +<-0.884,-0.463,0.066>, +<-0.878,-0.468,0.102>, +<-0.908,-0.417,0.038>, +<-0.837,-0.468,0.284>, +<-0.739,-0.355,0.572>, +<-0.564,-0.131,0.815>, +<-0.352,0.008,0.936>, +<-0.152,0.012,0.988>, +<-0.026,0.002,1>, +<0.007,0,1>, +<0.002,0,1>, +z,z,<0.002,0,1>, +z,z,z,<0.001,0,1>, +ZS(7) +<0.003,0,1>, +<0.008,0,1>, +<-0.027,-0.004,1>, +<-0.158,-0.014,0.987>, +<-0.414,-0.017,0.910>, +<-0.564,0.126,0.816>, +<-0.739,0.351,0.575>, +<-0.836,0.465,0.290>, +<-0.907,0.418,0.045>, +<-0.845,0.502,0.187>, +<-0.873,0.477,0.097>, +<-0.887,0.462,0.027>, +<-0.885,0.465,0>, +<-0.907,0.409,-0.105>, +<-0.929,0.363,-0.074>, +<-0.945,0.324,0.032>, +<-0.914,0.391,0.104>, +<-0.834,0.539,0.117>, +<-0.708,0.700,0.097>, +<-0.582,0.812,0.054>, +<-0.525,0.851,0.009>, +<-0.574,0.818,-0.027>, +<-0.678,0.734,-0.041>, +<-0.791,0.611,-0.038>, +<-0.882,0.470,-0.022>, +<-0.935,0.356,-0.003>, +<-0.944,0.329,0.011>, +<-0.911,0.412,0.017>, +<-0.836,0.549,0.017>, +<-0.719,0.695,0.011>, +<-0.572,0.820,0.006>, +<-0.423,0.906,0.003>, +<-0.298,0.954,0.003>, +<-0.273,0.962,0.007>, +<-0.374,0.927,0.013>, +<-0.523,0.852,0.022>, +<-0.657,0.754,0.023>, +<-0.741,0.671,-0.028> +<-0.835,-0.548,-0.045>, +<-0.769,-0.639,0.007>, +<-0.655,-0.756,0.017>, +<-0.511,-0.859,0.015>, +<-0.368,-0.930,0.010>, +<-0.283,-0.959,0.006>, +<-0.325,-0.946,0.004>, +<-0.454,-0.891,0.008>, +<-0.603,-0.798,0.016>, +<-0.743,-0.669,0.022>, +<-0.848,-0.530,0.024>, +<-0.911,-0.412,0.017>, +<-0.931,-0.364,0.002>, +<-0.909,-0.416,-0.018>, +<-0.847,-0.531,-0.040>, +<-0.757,-0.651,-0.049>, +<-0.668,-0.743,-0.044>, +<-0.604,-0.797,-0.016>, +<-0.604,-0.797,0.029>, +<-0.672,-0.736,0.077>, +<-0.768,-0.631,0.111>, +<-0.851,-0.513,0.110>, +<-0.901,-0.427,0.072>, +<-0.891,-0.452,0.047>, +<-0.874,-0.486,0.009>, +<-0.877,-0.480,-0.002>, +<-0.840,-0.529,0.124>, +<-0.918,-0.392,0.052>, +<-0.808,-0.515,0.285>, +<-0.655,-0.473,0.589>, +<-0.459,-0.084,0.884>, +<-0.204,0.022,0.979>, +<-0.021,0.004,1>, +<0.006,0,1>, +<0.001,0,1>, +ZS(19) +<0.001,-0.001,1>, +<0.004,-0.001,1>, +<0.009,0,1>, +<-0.017,-0.003,1>, +<-0.200,-0.019,0.980>, +<-0.452,0.080,0.889>, +<-0.663,0.417,0.622>, +<-0.781,0.536,0.322>, +<-0.952,0.280,0.126>, +<-0.802,0.559,0.212>, +<-0.879,0.477,-0.003>, +<-0.877,0.481,0.010>, +<-0.892,0.451,0.046>, +<-0.899,0.432,0.069>, +<-0.847,0.521,0.108>, +<-0.759,0.642,0.110>, +<-0.665,0.743,0.073>, +<-0.607,0.794,0.021>, +<-0.622,0.783,-0.024>, +<-0.691,0.721,-0.047>, +<-0.781,0.623,-0.047>, +<-0.864,0.502,-0.034>, +<-0.918,0.397,-0.011>, +<-0.932,0.362,0.010>, +<-0.904,0.427,0.023>, +<-0.833,0.552,0.026>, +<-0.720,0.693,0.022>, +<-0.575,0.818,0.014>, +<-0.425,0.905,0.008>, +<-0.297,0.955,0.004>, +<-0.268,0.963,0.004>, +<-0.366,0.931,0.007>, +<-0.515,0.857,0.008>, +<-0.666,0.746,0.007>, +<-0.786,0.618,0.002>, +<-0.854,0.517,-0.053> +<-0.917,-0.394,-0.063>, +<-0.872,-0.489,-0.013>, +<-0.788,-0.616,0>, +<-0.661,-0.750,0.005>, +<-0.511,-0.860,0.004>, +<-0.366,-0.931,0.003>, +<-0.285,-0.958,0.003>, +<-0.329,-0.944,0.008>, +<-0.459,-0.888,0.019>, +<-0.606,-0.795,0.029>, +<-0.739,-0.672,0.036>, +<-0.837,-0.546,0.035>, +<-0.894,-0.448,0.023>, +<-0.910,-0.416,0.002>, +<-0.885,-0.466,-0.024>, +<-0.826,-0.562,-0.047>, +<-0.755,-0.653,-0.055>, +<-0.697,-0.716,-0.040>, +<-0.668,-0.744,-0.002>, +<-0.684,-0.728,0.045>, +<-0.739,-0.670,0.079>, +<-0.796,-0.596,0.103>, +<-0.850,-0.513,0.119>, +<-0.872,-0.486,0.050>, +<-0.860,-0.510,-0.005>, +<-0.955,-0.271,0.122>, +<-0.807,-0.559,0.192>, +<-0.684,-0.437,0.583>, +<-0.565,-0.086,0.820>, +<-0.144,0.022,0.989>, +<0.010,0.005,1>, +<0.003,0.001,1>, +ZS(23) +<0.001,0,1>, +<0.002,0,1>, +<0.002,0,1>, +<0.004,0,1>, +<0.010,-0.003,1>, +<-0.135,-0.014,0.991>, +<-0.549,0.073,0.832>, +<-0.654,0.527,0.543>, +<-0.802,0.555,0.219>, +<-0.934,0.351,0.072>, +<-0.860,0.511,-0.006>, +<-0.873,0.486,0.054>, +<-0.849,0.515,0.117>, +<-0.790,0.605,0.096>, +<-0.736,0.673,0.070>, +<-0.689,0.724,0.038>, +<-0.680,0.733,-0.010>, +<-0.713,0.700,-0.046>, +<-0.773,0.632,-0.057>, +<-0.841,0.539,-0.042>, +<-0.894,0.449,-0.016>, +<-0.913,0.409,0.009>, +<-0.891,0.453,0.028>, +<-0.827,0.561,0.037>, +<-0.721,0.692,0.033>, +<-0.581,0.814,0.025>, +<-0.432,0.902,0.014>, +<-0.305,0.952,0.005>, +<-0.272,0.962,0.001>, +<-0.365,0.931,0>, +<-0.515,0.857,0>, +<-0.671,0.741,0>, +<-0.802,0.597,-0.010>, +<-0.889,0.458,-0.019>, +<-0.935,0.346,-0.074> +<-0.955,-0.297,-0.022>, +<-0.940,-0.339,-0.032>, +<-0.890,-0.456,-0.025>, +<-0.801,-0.598,-0.010>, +<-0.672,-0.741,-0.007>, +<-0.518,-0.855,-0.007>, +<-0.374,-0.927,-0.004>, +<-0.301,-0.954,0.002>, +<-0.349,-0.937,0.013>, +<-0.474,-0.880,0.028>, +<-0.613,-0.789,0.040>, +<-0.735,-0.676,0.047>, +<-0.822,-0.568,0.044>, +<-0.870,-0.493,0.027>, +<-0.878,-0.479,0.001>, +<-0.851,-0.524,-0.028>, +<-0.803,-0.594,-0.046>, +<-0.757,-0.652,-0.043>, +<-0.744,-0.667,-0.042>, +<-0.729,-0.684,0.005>, +<-0.752,-0.657,0.058>, +<-0.798,-0.595,0.097>, +<-0.820,-0.568,0.069>, +<-0.842,-0.539,-0.009>, +<-0.832,-0.554,0.023>, +<-0.736,-0.521,0.433>, +<-0.487,-0.259,0.834>, +<-0.182,0.017,0.983>, +<0.017,0.005,1>, +<0.006,0.001,1>, +<0.002,0.001,1>, +ZS(28) +<0.001,0,1>, +<0.004,-0.036,1>, +<0.009,-0.002,1>, +<-0.157,0.026,0.987>, +<-0.504,0.217,0.836>, +<-0.738,0.503,0.450>, +<-0.829,0.558,0.034>, +<-0.843,0.538,-0.010>, +<-0.818,0.572,0.066>, +<-0.797,0.597,0.089>, +<-0.758,0.651,0.049>, +<-0.737,0.676,-0.005>, +<-0.753,0.656,-0.047>, +<-0.769,0.638,-0.045>, +<-0.815,0.578,-0.044>, +<-0.860,0.510,-0.022>, +<-0.883,0.469,0.009>, +<-0.870,0.492,0.034>, +<-0.816,0.577,0.047>, +<-0.720,0.692,0.047>, +<-0.590,0.806,0.036>, +<-0.446,0.895,0.022>, +<-0.323,0.946,0.007>, +<-0.288,0.958,-0.002>, +<-0.374,0.927,-0.007>, +<-0.521,0.854,-0.008>, +<-0.679,0.734,-0.011>, +<-0.812,0.584,-0.014>, +<-0.901,0.432,-0.029>, +<-0.955,0.294,-0.036>, +<-0.972,0.232,-0.030> +<-0.913,-0.407,0.017>, +<-0.945,-0.324,-0.031>, +<-0.950,-0.308,-0.038>, +<-0.903,-0.428,-0.025>, +<-0.812,-0.584,-0.019>, +<-0.682,-0.731,-0.016>, +<-0.529,-0.848,-0.016>, +<-0.393,-0.920,-0.010>, +<-0.331,-0.944,0>, +<-0.381,-0.924,0.016>, +<-0.497,-0.867,0.035>, +<-0.624,-0.780,0.050>, +<-0.731,-0.680,0.057>, +<-0.803,-0.594,0.050>, +<-0.839,-0.544,0.029>, +<-0.840,-0.543,0>, +<-0.816,-0.578,-0.021>, +<-0.776,-0.628,-0.063>, +<-0.766,-0.642,-0.045>, +<-0.783,-0.622,0.007>, +<-0.781,-0.624,0.028>, +<-0.797,-0.603,0.021>, +<-0.824,-0.567,-0.015>, +<-0.774,-0.614,0.153>, +<-0.641,-0.428,0.637>, +<-0.332,-0.094,0.938>, +<-0.001,0.013,1>, +<0.007,0.004,1>, +<0.002,0.001,1>, +<0.001,0,1>, +ZS(31) +<0.035,0.001,1>, +<0.002,-0.004,1>, +<0.002,-0.013,1>, +<-0.310,0.081,0.947>, +<-0.631,0.420,0.653>, +<-0.774,0.610,0.169>, +<-0.825,0.565,-0.015>, +<-0.801,0.598,0.016>, +<-0.785,0.618,0.023>, +<-0.788,0.616,0.002>, +<-0.771,0.635,-0.048>, +<-0.781,0.621,-0.060>, +<-0.821,0.571,-0.018>, +<-0.844,0.536,0.008>, +<-0.841,0.540,0.037>, +<-0.799,0.598,0.055>, +<-0.718,0.693,0.059>, +<-0.603,0.796,0.049>, +<-0.471,0.881,0.031>, +<-0.354,0.935,0.010>, +<-0.317,0.948,-0.006>, +<-0.392,0.920,-0.016>, +<-0.533,0.846,-0.020>, +<-0.688,0.726,-0.018>, +<-0.819,0.573,-0.021>, +<-0.912,0.409,-0.028>, +<-0.962,0.270,-0.042>, +<-0.965,0.262,-0.029>, +<-0.941,0.336,0.025> +<-0.790,-0.609,0.065>, +<-0.866,-0.500,-0.013>, +<-0.937,-0.348,-0.027>, +<-0.954,-0.298,-0.019>, +<-0.910,-0.414,-0.025>, +<-0.817,-0.576,-0.024>, +<-0.689,-0.724,-0.025>, +<-0.543,-0.839,-0.025>, +<-0.421,-0.907,-0.019>, +<-0.377,-0.926,-0.004>, +<-0.426,-0.904,0.017>, +<-0.530,-0.847,0.040>, +<-0.639,-0.767,0.057>, +<-0.725,-0.686,0.060>, +<-0.780,-0.624,0.049>, +<-0.804,-0.595,0.028>, +<-0.793,-0.609,-0.007>, +<-0.776,-0.631,-0.026>, +<-0.765,-0.643,0>, +<-0.778,-0.629,-0.003>, +<-0.790,-0.613,-0.006>, +<-0.803,-0.596,-0.021>, +<-0.722,-0.612,0.323>, +<-0.517,-0.345,0.784>, +<-0.146,-0.004,0.989>, +<0.014,0.006,1>, +<0.004,0.001,1>, +<0.002,0.001,1>, +ZS(34) +<0,-0.001,1>, +<0.003,-0.001,1>, +<0.013,-0.006,1>, +<-0.128,0,0.992>, +<-0.506,0.336,0.794>, +<-0.720,0.606,0.338>, +<-0.803,0.595,-0.022>, +<-0.791,0.612,-0.006>, +<-0.779,0.627,-0.003>, +<-0.767,0.642,0>, +<-0.779,0.627,-0.021>, +<-0.797,0.604,0>, +<-0.807,0.590,0.036>, +<-0.779,0.624,0.059>, +<-0.716,0.695,0.065>, +<-0.620,0.783,0.059>, +<-0.506,0.862,0.039>, +<-0.401,0.916,0.013>, +<-0.360,0.933,-0.009>, +<-0.421,0.907,-0.024>, +<-0.550,0.835,-0.031>, +<-0.697,0.716,-0.031>, +<-0.825,0.564,-0.027>, +<-0.918,0.396,-0.026>, +<-0.965,0.260,-0.020>, +<-0.956,0.292,-0.027>, +<-0.897,0.441,-0.013>, +<-0.830,0.553,0.073> +<-0.576,-0.808,0.127>, +<-0.707,-0.706,0.037>, +<-0.833,-0.554,0.011>, +<-0.924,-0.382,-0.003>, +<-0.948,-0.319,-0.010>, +<-0.909,-0.416,-0.020>, +<-0.817,-0.577,-0.029>, +<-0.693,-0.720,-0.035>, +<-0.560,-0.828,-0.036>, +<-0.460,-0.888,-0.028>, +<-0.432,-0.902,-0.008>, +<-0.481,-0.876,0.018>, +<-0.568,-0.822,0.044>, +<-0.653,-0.755,0.059>, +<-0.718,-0.694,0.059>, +<-0.757,-0.652,0.043>, +<-0.770,-0.637,0.024>, +<-0.754,-0.656,0.014>, +<-0.754,-0.657,-0.003>, +<-0.703,-0.706,0.086>, +<-0.771,-0.637,-0.013>, +<-0.680,-0.569,0.462>, +<-0.403,-0.264,0.876>, +<-0.021,0.020,1>, +<0.007,0.004,1>, +<0.002,0.001,1>, +<0.001,0,1>, +ZS(36) +<0.001,0,1>, +<0.002,-0.001,1>, +<0.007,-0.004,1>, +<-0.015,-0.020,1>, +<-0.394,0.256,0.883>, +<-0.676,0.565,0.473>, +<-0.770,0.637,-0.010>, +<-0.700,0.709,0.091>, +<-0.755,0.655,-0.003>, +<-0.758,0.652,0.017>, +<-0.773,0.634,0.032>, +<-0.757,0.651,0.050>, +<-0.713,0.698,0.064>, +<-0.640,0.766,0.060>, +<-0.549,0.835,0.043>, +<-0.462,0.887,0.016>, +<-0.418,0.908,-0.012>, +<-0.459,0.888,-0.033>, +<-0.570,0.821,-0.041>, +<-0.704,0.709,-0.039>, +<-0.826,0.562,-0.034>, +<-0.918,0.397,-0.025>, +<-0.960,0.281,-0.012>, +<-0.945,0.328,-0.005>, +<-0.865,0.501,0.008>, +<-0.755,0.655,0.037>, +<-0.632,0.763,0.136> +<-0.270,-0.947,0.174>, +<-0.451,-0.889,0.082>, +<-0.646,-0.762,0.051>, +<-0.801,-0.598,0.030>, +<-0.901,-0.433,0.011>, +<-0.935,-0.354,-0.001>, +<-0.901,-0.434,-0.018>, +<-0.810,-0.586,-0.034>, +<-0.694,-0.719,-0.044>, +<-0.580,-0.813,-0.046>, +<-0.507,-0.861,-0.035>, +<-0.497,-0.867,-0.012>, +<-0.542,-0.840,0.019>, +<-0.606,-0.794,0.042>, +<-0.667,-0.744,0.049>, +<-0.712,-0.701,0.047>, +<-0.732,-0.680,0.047>, +<-0.743,-0.669,0.013>, +<-0.806,-0.586,0.077>, +<-0.740,-0.673,0.019>, +<-0.594,-0.627,0.504>, +<-0.307,-0.183,0.934>, +<0.019,0.014,1>, +<0.005,0.004,1>, +<0.002,0.002,1>, +ZS(40) +<0.002,-0.002,1>, +<0.005,-0.004,1>, +<0.019,-0.014,1>, +<-0.299,0.171,0.939>, +<-0.586,0.630,0.509>, +<-0.737,0.675,0.030>, +<-0.813,0.576,0.084>, +<-0.745,0.667,0.013>, +<-0.733,0.678,0.051>, +<-0.711,0.701,0.054>, +<-0.662,0.748,0.054>, +<-0.595,0.802,0.041>, +<-0.529,0.849,0.014>, +<-0.489,0.872,-0.018>, +<-0.507,0.861,-0.042>, +<-0.590,0.806,-0.051>, +<-0.707,0.706,-0.048>, +<-0.820,0.571,-0.037>, +<-0.909,0.416,-0.021>, +<-0.947,0.321,-0.002>, +<-0.923,0.385,0.013>, +<-0.834,0.550,0.031>, +<-0.695,0.718,0.049>, +<-0.511,0.856,0.080>, +<-0.330,0.927,0.179> +<0.054,-0.980,0.192>, +<-0.135,-0.984,0.112>, +<-0.365,-0.927,0.088>, +<-0.590,-0.804,0.065>, +<-0.762,-0.646,0.043>, +<-0.873,-0.487,0.025>, +<-0.913,-0.407,0.008>, +<-0.881,-0.472,-0.014>, +<-0.794,-0.607,-0.036>, +<-0.688,-0.723,-0.051>, +<-0.601,-0.798,-0.054>, +<-0.557,-0.830,-0.037>, +<-0.561,-0.828,-0.008>, +<-0.602,-0.798,0.010>, +<-0.637,-0.770,0.036>, +<-0.683,-0.729,0.053>, +<-0.708,-0.705,0.031>, +<-0.719,-0.695,-0.010>, +<-0.721,-0.691,0.050>, +<-0.662,-0.494,0.564>, +<-0.211,-0.127,0.969>, +<0.016,0.011,1>, +<0.004,0.003,1>, +<0.002,0.002,1>, +ZS(42) +<0.002,-0.002,1>, +<0.004,-0.003,1>, +<0.016,-0.011,1>, +<-0.199,0.109,0.974>, +<-0.665,0.477,0.574>, +<-0.719,0.692,0.070>, +<-0.720,0.694,-0.010>, +<-0.709,0.704,0.031>, +<-0.683,0.729,0.054>, +<-0.635,0.772,0.037>, +<-0.598,0.802,0.006>, +<-0.557,0.830,-0.014>, +<-0.558,0.829,-0.044>, +<-0.607,0.792,-0.061>, +<-0.700,0.712,-0.055>, +<-0.805,0.592,-0.038>, +<-0.890,0.456,-0.014>, +<-0.924,0.383,0.011>, +<-0.891,0.453,0.029>, +<-0.794,0.606,0.050>, +<-0.640,0.765,0.070>, +<-0.426,0.901,0.088>, +<-0.194,0.975,0.109>, +<0,0.981,0.194> +<0.326,-0.929,0.176>, +<0.169,-0.977,0.128>, +<-0.056,-0.993,0.103>, +<-0.293,-0.952,0.086>, +<-0.534,-0.843,0.072>, +<-0.720,-0.691,0.061>, +<-0.836,-0.547,0.042>, +<-0.879,-0.477,0.022>, +<-0.847,-0.531,-0.004>, +<-0.764,-0.644,-0.035>, +<-0.677,-0.734,-0.051>, +<-0.618,-0.784,-0.045>, +<-0.614,-0.788,-0.053>, +<-0.624,-0.781,-0.012>, +<-0.649,-0.760,0.020>, +<-0.665,-0.747,0.015>, +<-0.694,-0.720,-0.010>, +<-0.706,-0.706,0.061>, +<-0.548,-0.527,0.650>, +<-0.143,-0.108,0.984>, +<0.012,0.010,1>, +<0.003,0.002,1>, +<0.002,0,1>, +ZS(44) +<0.002,0,1>, +<0.003,-0.002,1>, +<0.012,-0.010,1>, +<-0.125,0.087,0.988>, +<-0.534,0.511,0.674>, +<-0.704,0.705,0.087>, +<-0.695,0.719,-0.010>, +<-0.667,0.745,0.015>, +<-0.651,0.759,0.020>, +<-0.624,0.781,-0.019>, +<-0.615,0.786,-0.065>, +<-0.620,0.783,-0.050>, +<-0.683,0.728,-0.055>, +<-0.774,0.632,-0.036>, +<-0.855,0.518,-0.003>, +<-0.887,0.461,0.024>, +<-0.849,0.526,0.049>, +<-0.746,0.663,0.071>, +<-0.578,0.811,0.088>, +<-0.352,0.931,0.097>, +<-0.109,0.988,0.109>, +<0.115,0.986,0.119>, +<0.290,0.940,0.181> +<0.367,-0.929,0.044>, +<0.363,-0.928,0.086>, +<0.246,-0.962,0.118>, +<0.004,-0.995,0.099>, +<-0.239,-0.967,0.087>, +<-0.480,-0.873,0.086>, +<-0.671,-0.737,0.083>, +<-0.788,-0.612,0.067>, +<-0.828,-0.560,0.040>, +<-0.794,-0.608,0.007>, +<-0.722,-0.692,-0.021>, +<-0.641,-0.765,-0.053>, +<-0.629,-0.776,-0.050>, +<-0.642,-0.767,0>, +<-0.655,-0.755,-0.003>, +<-0.574,-0.814,0.086>, +<-0.690,-0.722,0.049>, +<-0.527,-0.549,0.649>, +<-0.113,-0.115,0.987>, +<0.010,0.010,1>, +<0.002,0.003,1>, +<0,0.001,1>, +ZS(46) +<0,-0.001,1>, +<0.002,-0.002,1>, +<0.009,-0.009,1>, +<-0.092,0.089,0.992>, +<-0.509,0.529,0.678>, +<-0.690,0.720,0.077>, +<-0.581,0.810,0.081>, +<-0.657,0.754,-0.003>, +<-0.644,0.765,0>, +<-0.630,0.774,-0.060>, +<-0.640,0.766,-0.060>, +<-0.729,0.685,-0.023>, +<-0.802,0.597,0.008>, +<-0.835,0.549,0.042>, +<-0.798,0.598,0.070>, +<-0.692,0.717,0.089>, +<-0.517,0.850,0.096>, +<-0.289,0.952,0.101>, +<-0.051,0.993,0.104>, +<0.190,0.974,0.124>, +<0.358,0.928,0.102>, +<0.406,0.912,0.064> +<0.021,-1,-0.019>, +<0.170,-0.983,0.064>, +<0.308,-0.950,0.052>, +<0.272,-0.961,0.055>, +<0.050,-0.995,0.089>, +<-0.206,-0.974,0.091>, +<-0.437,-0.894,0.100>, +<-0.620,-0.778,0.103>, +<-0.730,-0.677,0.089>, +<-0.759,-0.648,0.060>, +<-0.726,-0.687,0.027>, +<-0.668,-0.744,-0.014>, +<-0.611,-0.791,-0.004>, +<-0.627,-0.779,-0.003>, +<-0.713,-0.694,0.099>, +<-0.671,-0.741,0.017>, +<-0.486,-0.677,0.552>, +<-0.108,-0.145,0.984>, +<0.010,0.010,1>, +<0.003,0.003,1>, +<0.001,0.001,1>, +ZS(48) +<0.001,-0.001,1>, +<0.002,-0.002,1>, +<0.009,-0.009,1>, +<-0.084,0.113,0.990>, +<-0.472,0.660,0.585>, +<-0.678,0.734,0.039>, +<-0.711,0.698,0.092>, +<-0.629,0.777,-0.002>, +<-0.609,0.793,-0.009>, +<-0.670,0.742,-0.021>, +<-0.735,0.677,0.026>, +<-0.767,0.638,0.060>, +<-0.741,0.666,0.089>, +<-0.640,0.761,0.106>, +<-0.470,0.876,0.107>, +<-0.252,0.963,0.099>, +<-0.019,0.995,0.095>, +<0.230,0.970,0.075>, +<0.337,0.940,0.054>, +<0.275,0.959,0.072>, +<0.144,0.989,0.020> +<-0.373,-0.916,-0.148>, +<-0.216,-0.975,-0.047>, +<-0.028,-1,-0.002>, +<0.181,-0.983,0.017>, +<0.219,-0.976,0.020>, +<0.059,-0.996,0.064>, +<-0.198,-0.976,0.091>, +<-0.414,-0.904,0.110>, +<-0.576,-0.809,0.118>, +<-0.665,-0.740,0.105>, +<-0.683,-0.727,0.067>, +<-0.651,-0.758,0.041>, +<-0.615,-0.789,0.018>, +<-0.612,-0.791,-0.006>, +<-0.635,-0.773,-0.013>, +<-0.643,-0.588,0.491>, +<-0.127,-0.214,0.969>, +<0.010,0.012,1>, +<0.003,0.002,1>, +<0.001,0.001,1>, +ZS(50) +<0.001,-0.001,1>, +<0.002,-0.002,1>, +<0.009,-0.012,1>, +<-0.099,0.187,0.977>, +<-0.627,0.588,0.511>, +<-0.642,0.767,-0.005>, +<-0.613,0.790,-0.007>, +<-0.615,0.788,0.017>, +<-0.658,0.752,0.036>, +<-0.693,0.718,0.064>, +<-0.676,0.729,0.104>, +<-0.595,0.795,0.120>, +<-0.444,0.889,0.115>, +<-0.245,0.964,0.099>, +<-0.015,0.997,0.079>, +<0.195,0.980,0.034>, +<0.242,0.970,0.012>, +<0.097,0.995,0.008>, +<-0.075,0.997,-0.019>, +<-0.227,0.969,-0.098> +<-0.743,-0.635,-0.210>, +<-0.606,-0.786,-0.121>, +<-0.418,-0.905,-0.083>, +<-0.206,-0.977,-0.057>, +<0.011,-1,-0.019>, +<0.112,-0.994,-0.003>, +<-0.003,-1,0.029>, +<-0.231,-0.970,0.081>, +<-0.417,-0.902,0.112>, +<-0.544,-0.832,0.114>, +<-0.616,-0.782,0.099>, +<-0.601,-0.795,0.083>, +<-0.597,-0.802,0.014>, +<-0.595,-0.804,-0.021>, +<-0.570,-0.681,0.459>, +<-0.184,-0.309,0.933>, +<0.011,0.016,1>, +<0.002,0.003,1>, +<0.001,0,1>, +ZS(52) +<0.001,0,1>, +<0.002,-0.003,1>, +<0.010,-0.016,1>, +<-0.160,0.291,0.943>, +<-0.574,0.666,0.475>, +<-0.597,0.802,-0.021>, +<-0.598,0.801,0.014>, +<-0.606,0.791,0.086>, +<-0.624,0.774,0.103>, +<-0.557,0.823,0.116>, +<-0.440,0.890,0.118>, +<-0.270,0.959,0.092>, +<-0.057,0.997,0.054>, +<0.107,0.994,0.009>, +<0.096,0.995,-0.011>, +<-0.073,0.997,-0.037>, +<-0.264,0.962,-0.075>, +<-0.458,0.883,-0.103>, +<-0.619,0.765,-0.175> +<-0.933,-0.282,-0.224>, +<-0.871,-0.465,-0.157>, +<-0.747,-0.652,-0.127>, +<-0.579,-0.808,-0.107>, +<-0.375,-0.923,-0.090>, +<-0.169,-0.982,-0.080>, +<-0.053,-0.997,-0.049>, +<-0.136,-0.991,0.004>, +<-0.320,-0.946,0.054>, +<-0.446,-0.891,0.084>, +<-0.523,-0.843,0.124>, +<-0.574,-0.816,0.065>, +<-0.565,-0.825,-0.015>, +<-0.611,-0.724,0.320>, +<-0.267,-0.405,0.875>, +<0.014,0.018,1>, +<0.002,0.004,1>, +<0,0.002,1>, +ZS(54) +<0,-0.002,1>, +<0.003,-0.004,1>, +<0.014,-0.019,1>, +<-0.249,0.392,0.885>, +<-0.605,0.718,0.344>, +<-0.567,0.824,-0.016>, +<-0.578,0.813,0.069>, +<-0.531,0.837,0.132>, +<-0.456,0.885,0.095>, +<-0.324,0.943,0.081>, +<-0.159,0.987,0.025>, +<-0.037,0.999,-0.028>, +<-0.073,0.996,-0.052>, +<-0.237,0.968,-0.080>, +<-0.428,0.898,-0.101>, +<-0.622,0.774,-0.120>, +<-0.777,0.614,-0.139>, +<-0.873,0.446,-0.199> +<-0.982,-0.171,-0.077>, +<-0.973,-0.204,-0.109>, +<-0.936,-0.316,-0.152>, +<-0.840,-0.522,-0.145>, +<-0.685,-0.717,-0.126>, +<-0.508,-0.852,-0.127>, +<-0.333,-0.936,-0.114>, +<-0.232,-0.969,-0.080>, +<-0.350,-0.935,-0.058>, +<-0.441,-0.896,0.053>, +<-0.490,-0.870,0.061>, +<-0.538,-0.843,-0.008>, +<-0.611,-0.777,0.153>, +<-0.346,-0.518,0.783>, +<0.020,-0.022,1>, +<0.004,0.005,1>, +<0.002,0.002,1>, +ZS(56) +<0.002,-0.002,1>, +<0.004,-0.005,1>, +<0.020,0.013,1>, +<-0.335,0.504,0.796>, +<-0.616,0.769,0.169>, +<-0.545,0.839,-0.005>, +<-0.492,0.867,0.072>, +<-0.430,0.901,0.056>, +<-0.345,0.938,-0.032>, +<-0.217,0.975,-0.047>, +<-0.250,0.963,-0.100>, +<-0.385,0.915,-0.121>, +<-0.558,0.821,-0.117>, +<-0.728,0.675,-0.120>, +<-0.862,0.484,-0.148>, +<-0.944,0.291,-0.155>, +<-0.970,0.188,-0.152> +<-0.838,-0.544,-0.030>, +<-0.904,-0.419,-0.089>, +<-0.949,-0.309,-0.067>, +<-0.952,-0.304,-0.042>, +<-0.885,-0.456,-0.096>, +<-0.740,-0.660,-0.131>, +<-0.585,-0.801,-0.130>, +<-0.461,-0.865,-0.199>, +<-0.411,-0.905,-0.106>, +<-0.475,-0.880,0.016>, +<-0.509,-0.861,-0.003>, +<-0.552,-0.834,0.026>, +<-0.424,-0.643,0.638>, +<-0.005,-0.146,0.989>, +<0.004,0.007,1>, +<0.002,0.002,1>, +ZS(58) +<0.002,-0.002,1>, +<0.004,-0.007,1>, +<0,0.132,0.991>, +<-0.415,0.636,0.651>, +<-0.560,0.828,0.030>, +<-0.505,0.863,-0.002>, +<-0.468,0.884,0.021>, +<-0.413,0.905,-0.103>, +<-0.429,0.881,-0.201>, +<-0.493,0.860,-0.134>, +<-0.633,0.762,-0.136>, +<-0.786,0.606,-0.124>, +<-0.910,0.403,-0.100>, +<-0.960,0.274,-0.060>, +<-0.963,0.260,-0.074>, +<-0.943,0.325,-0.075> +<-0.454,-0.883,0.122>, +<-0.597,-0.799,0.066>, +<-0.724,-0.689,0.033>, +<-0.836,-0.548,0.001>, +<-0.888,-0.459,0>, +<-0.851,-0.524,-0.022>, +<-0.691,-0.714,-0.116>, +<-0.556,-0.823,-0.113>, +<-0.467,-0.884,-0.002>, +<-0.481,-0.876,-0.003>, +<-0.309,-0.945,0.104>, +<-0.513,-0.737,0.439>, +<-0.089,-0.329,0.940>, +<0.006,0.009,1>, +<0.001,0.002,1>, +ZS(60) +<0.001,-0.002,1>, +<0.005,-0.016,1>, +<-0.081,0.320,0.944>, +<-0.516,0.728,0.452>, +<-0.392,0.919,0.049>, +<-0.489,0.872,-0.008>, +<-0.471,0.882,-0.002>, +<-0.512,0.846,-0.148>, +<-0.593,0.787,-0.172>, +<-0.785,0.613,-0.087>, +<-0.893,0.450,-0.023>, +<-0.916,0.402,-0.008>, +<-0.872,0.490,-0.018>, +<-0.788,0.616,0.023>, +<-0.708,0.702,0.077> +<0.091,-0.979,0.181>, +<-0.099,-0.984,0.148>, +<-0.310,-0.941,0.135>, +<-0.489,-0.865,0.116>, +<-0.630,-0.770,0.104>, +<-0.733,-0.673,0.096>, +<-0.724,-0.686,0.074>, +<-0.562,-0.826,0.050>, +<-0.458,-0.889,0.014>, +<-0.534,-0.836,0.130>, +<-0.562,-0.803,0.201>, +<-0.248,-0.505,0.827>, +<0.011,-0.003,1>, +<0.002,0,1>, +<0,0.001,1>, +ZS(60) +<0,-0.001,1>, +<0.001,-0.007,1>, +<0.014,-0.004,1>, +<-0.199,0.638,0.744>, +<-0.560,0.802,0.209>, +<-0.538,0.833,0.128>, +<-0.455,0.891,-0.015>, +<-0.483,0.876,0.007>, +<-0.704,0.710,-0.008>, +<-0.804,0.593,0.038>, +<-0.801,0.597,0.049>, +<-0.700,0.710,0.077>, +<-0.566,0.819,0.093>, +<-0.413,0.901,0.133>, +<-0.256,0.943,0.213> +<0.474,-0.861,0.183>, +<0.387,-0.902,0.190>, +<0.200,-0.962,0.187>, +<-0.047,-0.985,0.163>, +<-0.259,-0.952,0.166>, +<-0.421,-0.891,0.171>, +<-0.540,-0.825,0.167>, +<-0.536,-0.829,0.160>, +<-0.467,-0.882,0.068>, +<-0.315,-0.945,0.092>, +<-0.455,-0.677,0.579>, +<0.013,-0.176,0.984>, +<0,0.005,1>, +<0.001,0,1>, +ZS(62) +<0.001,-0.003,1>, +<0.007,-0.006,1>, +<0.020,0.174,0.984>, +<-0.594,0.629,0.501>, +<-0.388,0.919,0.073>, +<-0.441,0.897,0.019>, +<-0.537,0.835,0.121>, +<-0.649,0.747,0.144>, +<-0.609,0.779,0.146>, +<-0.491,0.859,0.145>, +<-0.323,0.936,0.138>, +<-0.128,0.982,0.140>, +<0.054,0.985,0.162>, +<0.244,0.942,0.231> +<0.369,-0.921,0.125>, +<0.411,-0.905,0.111>, +<0.402,-0.914,0.052>, +<0.301,-0.951,0.076>, +<0.103,-0.983,0.154>, +<-0.104,-0.977,0.187>, +<-0.307,-0.929,0.205>, +<-0.391,-0.904,0.176>, +<-0.510,-0.832,0.219>, +<-0.513,-0.805,0.299>, +<-0.108,-0.443,0.890>, +<0.005,0.016,1>, +<0,0.002,1>, +ZS(64) +<0.002,0,1>, +<0.003,-0.014,1>, +<-0.070,0.602,0.795>, +<-0.511,0.804,0.303>, +<-0.462,0.881,0.105>, +<-0.473,0.864,0.172>, +<-0.442,0.869,0.223>, +<-0.290,0.937,0.195>, +<-0.111,0.977,0.184>, +<0.099,0.978,0.181>, +<0.285,0.944,0.165>, +<0.409,0.903,0.131>, +<0.494,0.860,0.127> +<-0.176,-0.983,-0.055>, +<-0.082,-0.996,-0.034>, +<0.028,-1,-0.023>, +<0.130,-0.992,0.002>, +<0.116,-0.993,0.016>, +<-0.091,-0.996,-0.014>, +<-0.212,-0.975,0.072>, +<-0.349,-0.934,0.076>, +<-0.414,-0.909,0.047>, +<-0.479,-0.661,0.578>, +<0.025,-0.146,0.989>, +<0.002,0.002,1>, +ZS(65) +<0,-0.002,1>, +<-0.001,-0.006,1>, +<0.017,0.134,0.991>, +<-0.448,0.653,0.610>, +<-0.424,0.904,0.062>, +<-0.385,0.914,0.128>, +<-0.247,0.950,0.191>, +<-0.078,0.989,0.126>, +<0.123,0.988,0.098>, +<0.257,0.965,0.060>, +<0.315,0.947,0.064>, +<0.316,0.945,0.077>, +<0.268,0.961,0.061> +<-0.688,-0.706,-0.169>, +<-0.574,-0.808,-0.135>, +<-0.455,-0.882,-0.126>, +<-0.346,-0.930,-0.124>, +<-0.284,-0.930,-0.233>, +<-0.252,-0.957,-0.144>, +<-0.293,-0.956,0.024>, +<-0.349,-0.937,-0.001>, +<-0.468,-0.840,0.275>, +<-0.090,-0.454,0.887>, +<0.002,0.009,1>, +ZS(66) +<0,-0.002,1>, +<0.002,-0.004,1>, +<0.006,-0.011,1>, +<-0.076,0.451,0.889>, +<-0.467,0.834,0.294>, +<-0.348,0.937,0.011>, +<-0.233,0.971,0.050>, +<-0.154,0.987,-0.033>, +<-0.133,0.986,-0.097>, +<-0.014,1,-0.033>, +<-0.076,0.995,-0.066>, +<-0.159,0.984,-0.074>, +<-0.264,0.960,-0.090> +<-0.900,-0.422,-0.110>, +<-0.859,-0.495,-0.128>, +<-0.785,-0.600,-0.155>, +<-0.639,-0.734,-0.231>, +<-0.498,-0.848,-0.181>, +<-0.329,-0.944,-0.004>, +<-0.327,-0.945,0>, +<-0.346,-0.938,0.017>, +<-0.359,-0.742,0.566>, +<0.019,-0.208,0.978>, +<0,0.004,1>, +ZS(67) +<0.002,0,1>, +<0.003,-0.004,1>, +<0.022,0.198,0.980>, +<-0.350,0.736,0.579>, +<-0.349,0.937,0.021>, +<-0.319,0.948,0.004>, +<-0.321,0.947,0>, +<-0.318,0.923,-0.214>, +<-0.301,0.921,-0.248>, +<-0.464,0.877,-0.126>, +<-0.590,0.797,-0.129>, +<-0.701,0.698,-0.148> +<-0.731,-0.681,-0.036>, +<-0.767,-0.640,-0.043>, +<-0.768,-0.640,-0.007>, +<-0.730,-0.682,0.039>, +<-0.565,-0.822,0.072>, +<-0.417,-0.908,0.030>, +<-0.309,-0.951,0.009>, +<-0.385,-0.905,0.182>, +<-0.135,-0.570,0.810>, +<0.005,-0.024,1>, +<0,0.001,1>, +ZS(69) +<0.004,0.019,1>, +<-0.126,0.559,0.820>, +<-0.392,0.900,0.193>, +<-0.307,0.952,-0.002>, +<-0.299,0.954,0>, +<-0.321,0.944,-0.082>, +<-0.589,0.790,-0.172>, +<-0.753,0.646,-0.122>, +<-0.842,0.529,-0.102>, +<-0.886,0.454,-0.095> +<-0.163,-0.978,0.129>, +<-0.244,-0.962,0.126>, +<-0.324,-0.935,0.145>, +<-0.398,-0.904,0.158>, +<-0.454,-0.873,0.181>, +<-0.397,-0.897,0.197>, +<-0.312,-0.946,0.086>, +<-0.376,-0.834,0.405>, +<0.004,-0.363,0.932>, +<0,0.006,1>, +ZS(70) +<0,-0.005,1>, +<0.008,0.346,0.938>, +<-0.375,0.826,0.422>, +<-0.283,0.959,-0.007>, +<-0.356,0.934,0.031>, +<-0.546,0.836,0.063>, +<-0.716,0.694,0.072>, +<-0.775,0.630,0.047>, +<-0.780,0.626,-0.006>, +<-0.766,0.643,-0.014> +<0.434,-0.879,0.196>, +<0.345,-0.918,0.194>, +<0.215,-0.955,0.205>, +<0.073,-0.974,0.213>, +<-0.097,-0.965,0.245>, +<-0.207,-0.955,0.211>, +<-0.292,-0.951,0.100>, +<-0.262,-0.735,0.625>, +<0.012,-0.164,0.986>, +<0,0.002,1>, +ZS(70) +<0,-0.001,1>, +<0.011,0.146,0.989>, +<-0.249,0.721,0.646>, +<-0.297,0.949,0.109>, +<-0.375,0.904,0.205>, +<-0.493,0.841,0.222>, +<-0.466,0.869,0.168>, +<-0.389,0.908,0.154>, +<-0.317,0.938,0.138>, +<-0.242,0.959,0.149> +<0.391,-0.915,0.099>, +<0.360,-0.929,0.080>, +<0.291,-0.955,0.062>, +<0.079,-0.997,0.021>, +<-0.026,-0.998,0.062>, +<-0.177,-0.983,0.051>, +<-0.289,-0.941,0.178>, +<-0.100,-0.594,0.798>, +<0.002,-0.033,1>, +ZS(72) +<0.002,0.024,1>, +<-0.087,0.574,0.814>, +<-0.306,0.920,0.246>, +<-0.225,0.946,0.231>, +<-0.151,0.946,0.287>, +<0.016,0.973,0.232>, +<0.163,0.963,0.216>, +<0.298,0.934,0.197>, +<0.397,0.897,0.197> +<-0.218,-0.974,-0.054>, +<-0.177,-0.982,-0.059>, +<-0.154,-0.972,-0.180>, +<-0.146,-0.980,-0.136>, +<-0.164,-0.986,0.010>, +<-0.207,-0.978,-0.004>, +<-0.292,-0.893,0.343>, +<-0.002,-0.441,0.898>, +<0,0.007,1>, +ZS(72) +<0,-0.007,1>, +<0.002,0.420,0.907>, +<-0.294,0.884,0.364>, +<-0.175,0.979,0.108>, +<0.009,0.989,0.146>, +<0.149,0.987,0.058>, +<0.245,0.968,0.057>, +<0.406,0.910,0.086>, +<0.455,0.884,0.104> +<-0.721,-0.683,-0.114>, +<-0.636,-0.758,-0.148>, +<-0.524,-0.841,-0.132>, +<-0.310,-0.950,-0.031>, +<-0.205,-0.979,-0.006>, +<-0.192,-0.981,-0.003>, +<-0.250,-0.835,0.491>, +<0.016,-0.297,0.955>, +<0,0.003,1>, +ZS(72) +<0,-0.003,1>, +<0.015,0.277,0.961>, +<-0.245,0.824,0.510>, +<-0.185,0.983,0.004>, +<-0.075,0.997,0.023>, +<-0.072,0.997,0.022>, +<-0.052,0.995,-0.089>, +<-0.040,0.994,-0.105>, +<-0.088,0.996,-0.016> +<-0.697,-0.717,0.022>, +<-0.651,-0.757,0.057>, +<-0.535,-0.838,0.111>, +<-0.431,-0.890,0.146>, +<-0.254,-0.961,0.107>, +<-0.177,-0.982,0.066>, +<-0.171,-0.758,0.630>, +<0.008,-0.173,0.985>, +ZS(74) +<0.007,0.155,0.988>, +<-0.160,0.748,0.643>, +<-0.173,0.983,0.054>, +<-0.158,0.987,0>, +<-0.275,0.961,-0.024>, +<-0.368,0.927,-0.071>, +<-0.563,0.820,-0.099>, +<-0.642,0.763,-0.078> +<-0.112,-0.982,0.149>, +<-0.147,-0.975,0.169>, +<-0.171,-0.964,0.204>, +<-0.200,-0.943,0.264>, +<-0.140,-0.961,0.236>, +<-0.158,-0.970,0.186>, +<-0.092,-0.674,0.733>, +<0.003,-0.082,0.997>, +ZS(74) +<0.002,0.068,0.998>, +<-0.083,0.658,0.749>, +<-0.161,0.978,0.135>, +<-0.181,0.977,0.111>, +<-0.389,0.905,0.170>, +<-0.508,0.850,0.138>, +<-0.614,0.784,0.088>, +<-0.663,0.747,0.044> +<0.471,-0.870,0.147>, +<0.388,-0.905,0.173>, +<0.260,-0.945,0.196>, +<0.123,-0.957,0.261>, +<-0.051,-0.984,0.169>, +<-0.136,-0.970,0.203>, +<-0.036,-0.590,0.806>, +<0,-0.028,1>, +ZS(74) +<0,0.020,1>, +<-0.031,0.571,0.820>, +<-0.146,0.958,0.247>, +<-0.136,0.967,0.216>, +<-0.175,0.937,0.301>, +<-0.147,0.964,0.221>, +<-0.120,0.976,0.181>, +<-0.089,0.982,0.165> +<0.473,-0.880,0.041>, +<0.411,-0.911,0.019>, +<0.190,-0.982,0.001>, +<0.095,-0.995,0.013>, +<-0.085,-0.996,-0.001>, +<-0.115,-0.953,0.279>, +<-0.005,-0.519,0.855>, +<0,-0.003,1>, +ZS(75) +<-0.005,0.503,0.864>, +<-0.116,0.948,0.296>, +<-0.070,0.987,0.146>, +<0.132,0.961,0.243>, +<0.276,0.941,0.195>, +<0.424,0.889,0.170>, +<0.517,0.844,0.142> +<-0.061,-0.998,-0.030>, +<-0.044,-0.987,-0.153>, +<-0.046,-0.989,-0.137>, +<-0.057,-0.998,0>, +<-0.060,-0.998,-0.003>, +<-0.085,-0.937,0.339>, +<0.007,-0.467,0.884>, +<0,0.005,1>, +ZS(74) +<0,-0.006,1>, +<0.003,0.455,0.890>, +<-0.084,0.933,0.351>, +<-0.062,0.998,-0.003>, +<0.098,0.995,0.007>, +<0.193,0.981,-0.028>, +<0.357,0.934,-0.026>, +<0.391,0.920,0.010> +<-0.570,-0.821,-0.016>, +<-0.497,-0.867,-0.039>, +<-0.274,-0.961,-0.032>, +<-0.172,-0.985,-0.009>, +<-0.034,-1,-0.004>, +<-0.053,-0.924,0.379>, +<0.007,-0.432,0.902>, +<0,0.006,1>, +ZS(74) +<0,-0.006,1>, +<0.002,0.426,0.905>, +<-0.050,0.922,0.385>, +<-0.037,1,-0.004>, +<-0.161,0.987,-0.005>, +<-0.248,0.966,-0.076>, +<-0.346,0.936,-0.061>, +<-0.385,0.922,0.023> +<-0.556,-0.826,0.098>, +<-0.487,-0.864,0.131>, +<-0.367,-0.915,0.170>, +<-0.237,-0.948,0.213>, +<-0.012,-0.992,0.123>, +<-0.019,-0.917,0.398>, +<0.004,-0.412,0.911>, +<0,0.005,1>, +ZS(74) +<0,-0.006,1>, +<0,0.413,0.911>, +<-0.017,0.917,0.399>, +<-0.014,0.994,0.112>, +<-0.130,0.971,0.202>, +<-0.225,0.963,0.146>, +<-0.352,0.932,0.084>, +<-0.385,0.922,0.047> +<0.021,-0.987,0.158>, +<0.017,-0.983,0.183>, +<0.012,-0.974,0.225>, +<0.013,-0.946,0.323>, +<0.015,-0.979,0.201>, +<0.017,-0.916,0.401>, +<0.001,-0.409,0.913>, +<0,0.005,1>, +ZS(73) +<0,-0.001,1>, +<0,-0.006,1>, +<0,0.411,0.912>, +<0.015,0.916,0.402>, +<0.013,0.994,0.104>, +<0.138,0.971,0.194>, +<0.238,0.962,0.133>, +<0.292,0.952,0.090>, +<0.320,0.943,0.089> +<0.612,-0.788,0.073>, +<0.536,-0.838,0.102>, +<0.394,-0.906,0.154>, +<0.266,-0.941,0.211>, +<0.042,-0.991,0.126>, +<0.053,-0.921,0.386>, +<-0.002,-0.424,0.906>, +<0,0.006,1>, +ZS(74) +<0.001,-0.007,1>, +<0.002,0.423,0.906>, +<0.129,0.914,0.384>, +<0.037,1,-0.005>, +<0.155,0.988,-0.009>, +<0.254,0.967,-0.012>, +<0.419,0.908,-0.013>, +<0.499,0.866,-0.016> +<0.503,-0.863,-0.049>, +<0.444,-0.892,-0.085>, +<0.298,-0.952,-0.068>, +<0.201,-0.979,-0.013>, +<0.062,-0.998,-0.004>, +<0.087,-0.932,0.352>, +<-0.004,-0.456,0.890>, +<0,0.006,1>, +ZS(74) +<0.001,-0.006,1>, +<0.002,0.456,0.890>, +<0.091,0.928,0.361>, +<0.070,0.991,0.110>, +<0.061,0.998,0>, +<0.051,0.992,-0.116>, +<0.073,0.985,-0.154>, +<0.089,0.993,-0.073> +<-0.287,-0.956,0.051>, +<-0.248,-0.968,-0.031>, +<-0.141,-0.989,-0.050>, +<-0.061,-0.998,0.013>, +<0.087,-0.996,-0.003>, +<0.165,-0.942,0.291>, +<0.004,-0.506,0.862>, +ZS(75) +<0,-0.002,1>, +<0.002,0.501,0.865>, +<0.009,0.949,0.316>, +<0.084,0.996,-0.002>, +<-0.114,0.993,0.012>, +<-0.211,0.978,-0.006>, +<-0.418,0.908,-0.003>, +<-0.496,0.868,0.014> +<-0.265,-0.956,0.129>, +<-0.234,-0.962,0.142>, +<-0.092,-0.985,0.146>, +<0.002,-0.978,0.206>, +<0.133,-0.976,0.175>, +<0.144,-0.965,0.221>, +<0.027,-0.607,0.794>, +<0,-0.019,1>, +ZS(73) +<0,0.001,1>, +<-0.001,0.018,1>, +<0.022,0.570,0.821>, +<0.143,0.963,0.227>, +<0.023,0.981,0.193>, +<-0.152,0.946,0.288>, +<-0.308,0.930,0.202>, +<-0.438,0.882,0.173>, +<-0.542,0.827,0.146> +<0.509,-0.861,-0.004>, +<0.475,-0.879,0.034>, +<0.355,-0.929,0.104>, +<0.299,-0.939,0.169>, +<0.153,-0.981,0.117>, +<0.115,-0.984,0.140>, +<0.084,-0.660,0.747>, +<-0.003,-0.068,0.998>, +ZS(74) +<-0.004,0.067,0.998>, +<0.079,0.660,0.747>, +<0.167,0.959,0.228>, +<0.122,0.955,0.270>, +<0.179,0.942,0.283>, +<0.151,0.963,0.223>, +<0.128,0.975,0.184>, +<0.083,0.981,0.178> +<0.520,-0.851,-0.073>, +<0.460,-0.878,-0.135>, +<0.340,-0.934,-0.111>, +<0.279,-0.960,-0.022>, +<0.150,-0.989,0.002>, +<0.174,-0.983,0.053>, +<0.162,-0.748,0.644>, +<-0.007,-0.156,0.988>, +ZS(74) +<-0.008,0.155,0.988>, +<0.163,0.743,0.649>, +<0.180,0.979,0.098>, +<0.292,0.945,0.145>, +<0.467,0.869,0.164>, +<0.577,0.810,0.102>, +<0.673,0.738,0.056>, +<0.717,0.696,0.031> +<-0.156,-0.988,0.019>, +<-0.183,-0.983,-0.029>, +<-0.119,-0.993,-0.021>, +<-0.071,-0.997,0.033>, +<0.015,-1,0.031>, +<0.163,-0.986,0.017>, +<0.245,-0.824,0.511>, +<-0.015,-0.276,0.961>, +<0,0.003,1>, +ZS(72) +<0,-0.003,1>, +<-0.017,0.279,0.960>, +<0.247,0.825,0.509>, +<0.192,0.981,0.001>, +<0.229,0.973,-0.011>, +<0.355,0.934,-0.044>, +<0.577,0.808,-0.120>, +<0.685,0.717,-0.131>, +<0.755,0.645,-0.118> +<-0.541,-0.834,0.102>, +<-0.473,-0.877,0.088>, +<-0.322,-0.940,0.107>, +<-0.193,-0.965,0.175>, +<-0.019,-0.968,0.252>, +<0.164,-0.972,0.168>, +<0.298,-0.874,0.385>, +<-0.002,-0.418,0.909>, +<0,0.007,1>, +ZS(72) +<0,-0.007,1>, +<-0.004,0.427,0.904>, +<0.296,0.886,0.358>, +<0.208,0.978,-0.004>, +<0.172,0.985,0.009>, +<0.157,0.977,-0.145>, +<0.171,0.967,-0.186>, +<0.220,0.974,-0.057>, +<0.268,0.962,-0.047> +<-0.271,-0.942,0.200>, +<-0.137,-0.971,0.195>, +<0.015,-0.977,0.212>, +<0.143,-0.961,0.235>, +<0.251,-0.920,0.300>, +<0.283,-0.925,0.255>, +<0.312,-0.912,0.265>, +<0.087,-0.572,0.815>, +<-0.002,-0.024,1>, +ZS(72) +<-0.002,0.028,1>, +<0.090,0.583,0.807>, +<0.293,0.937,0.189>, +<0.187,0.981,0.043>, +<0.035,0.998,0.048>, +<-0.068,0.998,0.008>, +<-0.278,0.959,0.060>, +<-0.330,0.941,0.077>, +<-0.357,0.930,0.089> +<0.401,-0.907,0.132>, +<0.472,-0.872,0.126>, +<0.562,-0.815,0.138>, +<0.616,-0.773,0.153>, +<0.581,-0.789,0.201>, +<0.390,-0.905,0.170>, +<0.292,-0.952,0.089>, +<0.250,-0.721,0.646>, +<-0.011,-0.147,0.989>, +<0,0.001,1>, +ZS(70) +<0,-0.002,1>, +<-0.011,0.154,0.988>, +<0.254,0.728,0.637>, +<0.291,0.952,0.097>, +<0.199,0.958,0.204>, +<0.082,0.966,0.247>, +<-0.093,0.973,0.210>, +<-0.232,0.953,0.194>, +<-0.352,0.918,0.182>, +<-0.441,0.877,0.190> +<0.849,-0.527,-0.027>, +<0.857,-0.515,0.013>, +<0.826,-0.560,0.068>, +<0.735,-0.678,0.026>, +<0.492,-0.870,-0.012>, +<0.316,-0.949,-0.012>, +<0.283,-0.959,-0.007>, +<0.376,-0.826,0.421>, +<-0.009,-0.347,0.938>, +<0,0.005,1>, +ZS(70) +<0,-0.006,1>, +<-0.007,0.352,0.936>, +<0.375,0.829,0.416>, +<0.314,0.945,0.091>, +<0.372,0.903,0.216>, +<0.410,0.891,0.196>, +<0.344,0.925,0.159>, +<0.272,0.951,0.147>, +<0.191,0.972,0.140>, +<0.097,0.983,0.155> +<0.890,-0.441,-0.116>, +<0.831,-0.543,-0.120>, +<0.709,-0.694,-0.125>, +<0.509,-0.839,-0.193>, +<0.252,-0.963,-0.096>, +<0.299,-0.954,0>, +<0.307,-0.952,-0.002>, +<0.392,-0.900,0.192>, +<0.125,-0.559,0.819>, +<-0.004,-0.019,1>, +ZS(70) +<-0.004,0.021,1>, +<0.129,0.563,0.817>, +<0.388,0.902,0.189>, +<0.318,0.948,0.024>, +<0.436,0.898,0.062>, +<0.582,0.809,0.083>, +<0.699,0.713,0.046>, +<0.722,0.692,0.010>, +<0.694,0.720,-0.006>, +<0.653,0.758,0.004> +<0.646,-0.749,-0.145>, +<0.525,-0.844,-0.112>, +<0.407,-0.905,-0.123>, +<0.234,-0.937,-0.257>, +<0.297,-0.929,-0.221>, +<0.321,-0.947,0>, +<0.295,-0.955,0.014>, +<0.349,-0.937,0.021>, +<0.352,-0.735,0.580>, +<-0.022,-0.197,0.980>, +<-0.002,0.004,1>, +<-0.001,0,1>, +ZS(67) +<0,-0.003,1>, +<-0.018,0.200,0.980>, +<0.349,0.739,0.577>, +<0.348,0.937,0.021>, +<0.328,0.945,0>, +<0.347,0.938,-0.011>, +<0.544,0.823,-0.161>, +<0.672,0.718,-0.181>, +<0.800,0.591,-0.106>, +<0.863,0.498,-0.086>, +<0.892,0.441,-0.097> +<0.187,-0.979,-0.082>, +<0.086,-0.995,-0.050>, +<-0.005,-1,-0.044>, +<-0.052,-0.998,-0.023>, +<0.087,-0.994,-0.060>, +<0.093,-0.996,-0.018>, +<0.171,-0.982,0.074>, +<0.312,-0.949,0.053>, +<0.469,-0.833,0.292>, +<0.075,-0.449,0.890>, +<-0.005,0.012,1>, +<-0.001,0.002,1>, +<0,0.001,1>, +ZS(66) +<-0.002,-0.009,1>, +<0.082,0.453,0.888>, +<0.462,0.837,0.293>, +<0.358,0.934,-0.006>, +<0.319,0.948,0.015>, +<0.271,0.951,-0.147>, +<0.326,0.917,-0.231>, +<0.408,0.905,-0.121>, +<0.523,0.841,-0.135>, +<0.657,0.737,-0.158>, +<0.759,0.621,-0.194> +<-0.319,-0.945,0.075>, +<-0.370,-0.925,0.088>, +<-0.367,-0.928,0.069>, +<-0.302,-0.952,0.056>, +<-0.176,-0.979,0.099>, +<0.016,-0.990,0.142>, +<0.222,-0.953,0.207>, +<0.371,-0.908,0.196>, +<0.442,-0.892,0.096>, +<0.457,-0.650,0.607>, +<-0.025,-0.133,0.991>, +<-0.003,0.006,1>, +<-0.002,0.001,1>, +ZS(65) +<0,-0.003,1>, +<-0.016,0.135,0.991>, +<0.416,0.660,0.626>, +<0.419,0.907,0.047>, +<0.362,0.931,0.044>, +<0.231,0.971,0.065>, +<0.129,0.991,-0.035>, +<-0.066,0.998,-0.013>, +<-0.030,1,-0.030>, +<0.071,0.996,-0.053>, +<0.174,0.983,-0.062>, +<0.279,0.956,-0.088> +<-0.522,-0.843,0.132>, +<-0.436,-0.889,0.140>, +<-0.300,-0.939,0.169>, +<-0.118,-0.977,0.175>, +<0.106,-0.977,0.184>, +<0.297,-0.934,0.197>, +<0.471,-0.854,0.220>, +<0.514,-0.834,0.201>, +<0.527,-0.817,0.233>, +<0.525,-0.791,0.316>, +<0.089,-0.431,0.898>, +<-0.006,0.018,1>, +<-0.001,0.004,1>, +<0,0.002,1>, +ZS(63) +<-0.001,0,1>, +<-0.005,-0.013,1>, +<0.095,0.466,0.880>, +<0.520,0.792,0.321>, +<0.494,0.855,0.157>, +<0.380,0.910,0.163>, +<0.281,0.938,0.202>, +<0.096,0.982,0.162>, +<-0.119,0.986,0.116>, +<-0.297,0.954,0.046>, +<-0.360,0.931,0.065>, +<-0.347,0.931,0.110>, +<-0.303,0.947,0.104> +<-0.242,-0.943,0.229>, +<-0.052,-0.985,0.162>, +<0.140,-0.980,0.144>, +<0.333,-0.932,0.144>, +<0.501,-0.853,0.146>, +<0.629,-0.763,0.147>, +<0.697,-0.701,0.148>, +<0.585,-0.801,0.126>, +<0.449,-0.893,0.037>, +<0.299,-0.948,0.107>, +<0.484,-0.659,0.576>, +<-0.018,-0.154,0.988>, +<0,0.008,1>, +<-0.001,0.002,1>, +ZS(62) +<-0.001,-0.002,1>, +<-0.004,-0.005,1>, +<-0.021,0.162,0.987>, +<0.535,0.639,0.552>, +<0.301,0.946,0.118>, +<0.471,0.879,0.071>, +<0.525,0.834,0.172>, +<0.498,0.848,0.180>, +<0.361,0.916,0.172>, +<0.192,0.967,0.164>, +<-0.042,0.984,0.175>, +<-0.256,0.949,0.185>, +<-0.396,0.901,0.179>, +<-0.485,0.855,0.183> +<0.265,-0.946,0.186>, +<0.435,-0.892,0.121>, +<0.596,-0.798,0.092>, +<0.719,-0.692,0.071>, +<0.820,-0.570,0.047>, +<0.840,-0.541,0.043>, +<0.750,-0.662,-0.006>, +<0.494,-0.869,0.009>, +<0.448,-0.894,0>, +<0.503,-0.861,0.074>, +<0.560,-0.801,0.213>, +<0.178,-0.642,0.745>, +<-0.009,0.003,1>, +<-0.001,0.002,1>, +<0,0.001,1>, +ZS(60) +<0,-0.001,1>, +<-0.001,-0.005,1>, +<-0.012,-0.006,1>, +<0.192,0.614,0.766>, +<0.559,0.802,0.213>, +<0.515,0.852,0.096>, +<0.461,0.887,0.023>, +<0.577,0.813,0.075>, +<0.724,0.684,0.093>, +<0.700,0.706,0.104>, +<0.574,0.812,0.110>, +<0.410,0.904,0.118>, +<0.219,0.967,0.132>, +<0.034,0.986,0.165>, +<-0.155,0.959,0.237> +<0.725,-0.686,0.062>, +<0.815,-0.580,0.006>, +<0.893,-0.449,-0.022>, +<0.935,-0.354,-0.014>, +<0.918,-0.396,-0.028>, +<0.820,-0.566,-0.088>, +<0.609,-0.771,-0.185>, +<0.517,-0.840,-0.164>, +<0.466,-0.885,0>, +<0.478,-0.879,0>, +<0.402,-0.915,0.043>, +<0.503,-0.744,0.441>, +<0.090,-0.314,0.945>, +<-0.006,0.010,1>, +<-0.001,0.002,1>, +ZS(60) +<-0.001,-0.002,1>, +<-0.005,-0.013,1>, +<0.080,0.313,0.946>, +<0.508,0.731,0.457>, +<0.410,0.911,0.038>, +<0.480,0.877,-0.003>, +<0.467,0.884,0>, +<0.570,0.815,-0.107>, +<0.722,0.685,-0.098>, +<0.859,0.513,-0.008>, +<0.872,0.490,-0.007>, +<0.787,0.616,0.018>, +<0.666,0.744,0.058>, +<0.530,0.843,0.096>, +<0.382,0.908,0.171> +<0.954,-0.290,-0.081>, +<0.974,-0.212,-0.081>, +<0.973,-0.222,-0.064>, +<0.929,-0.355,-0.105>, +<0.809,-0.573,-0.129>, +<0.648,-0.749,-0.139>, +<0.492,-0.860,-0.136>, +<0.425,-0.879,-0.215>, +<0.401,-0.909,-0.114>, +<0.463,-0.886,0.024>, +<0.501,-0.866,0.004>, +<0.554,-0.832,0.031>, +<0.425,-0.639,0.642>, +<0.005,-0.141,0.990>, +<-0.005,0.007,1>, +<-0.002,0.002,1>, +ZS(58) +<-0.002,-0.002,1>, +<-0.004,-0.007,1>, +<-0.001,0.131,0.991>, +<0.416,0.632,0.654>, +<0.559,0.829,0.032>, +<0.510,0.860,-0.005>, +<0.479,0.878,0.013>, +<0.409,0.906,-0.107>, +<0.478,0.856,-0.200>, +<0.609,0.784,-0.124>, +<0.770,0.626,-0.126>, +<0.904,0.421,-0.075>, +<0.946,0.324,-0.030>, +<0.931,0.359,-0.066>, +<0.875,0.481,-0.062>, +<0.799,0.601,0.006> +<0.978,-0.145,-0.153>, +<0.957,-0.247,-0.153>, +<0.882,-0.448,-0.148>, +<0.747,-0.652,-0.127>, +<0.570,-0.812,-0.123>, +<0.385,-0.915,-0.122>, +<0.236,-0.967,-0.098>, +<0.194,-0.980,-0.050>, +<0.333,-0.942,-0.040>, +<0.423,-0.904,0.053>, +<0.494,-0.866,0.075>, +<0.543,-0.840,0>, +<0.607,-0.779,0.154>, +<0.346,-0.517,0.782>, +<-0.021,-0.023,1>, +<-0.004,0.005,1>, +<-0.002,0.002,1>, +ZS(56) +<-0.002,-0.002,1>, +<-0.004,-0.005,1>, +<-0.020,0.014,1>, +<0.334,0.505,0.796>, +<0.614,0.771,0.170>, +<0.539,0.842,-0.010>, +<0.487,0.872,0.058>, +<0.445,0.894,0.052>, +<0.354,0.932,-0.072>, +<0.243,0.965,-0.093>, +<0.375,0.920,-0.111>, +<0.547,0.828,-0.122>, +<0.720,0.683,-0.124>, +<0.869,0.475,-0.143>, +<0.949,0.286,-0.129>, +<0.976,0.196,-0.093>, +<0.978,0.195,-0.079> +<0.890,-0.408,-0.203>, +<0.798,-0.587,-0.140>, +<0.641,-0.758,-0.122>, +<0.439,-0.893,-0.102>, +<0.237,-0.968,-0.083>, +<0.058,-0.997,-0.057>, +<0.018,-1,-0.032>, +<0.147,-0.989,0.021>, +<0.326,-0.942,0.077>, +<0.466,-0.880,0.093>, +<0.540,-0.832,0.126>, +<0.577,-0.814,0.065>, +<0.565,-0.825,-0.015>, +<0.611,-0.726,0.317>, +<0.272,-0.406,0.872>, +<-0.020,0.018,1>, +<-0.008,0.004,1>, +<-0.005,0.002,1>, +ZS(54) +<0,-0.002,1>, +<-0.002,-0.004,1>, +<-0.013,-0.019,1>, +<0.246,0.391,0.887>, +<0.606,0.717,0.344>, +<0.566,0.824,-0.016>, +<0.573,0.817,0.068>, +<0.517,0.847,0.125>, +<0.434,0.897,0.080>, +<0.315,0.948,0.037>, +<0.132,0.991,-0.004>, +<0.086,0.995,-0.053>, +<0.229,0.970,-0.085>, +<0.426,0.899,-0.099>, +<0.622,0.775,-0.110>, +<0.784,0.605,-0.141>, +<0.899,0.403,-0.173>, +<0.947,0.235,-0.221> +<0.647,-0.740,-0.186>, +<0.482,-0.870,-0.102>, +<0.278,-0.957,-0.076>, +<0.071,-0.997,-0.041>, +<-0.113,-0.994,-0.013>, +<-0.121,-0.993,0.003>, +<0.055,-0.997,0.049>, +<0.276,-0.957,0.085>, +<0.450,-0.886,0.110>, +<0.566,-0.817,0.111>, +<0.624,-0.775,0.098>, +<0.602,-0.794,0.080>, +<0.595,-0.803,0.012>, +<0.594,-0.804,-0.021>, +<0.570,-0.686,0.452>, +<0.193,-0.320,0.928>, +<-0.018,0.017,1>, +<-0.007,0.008,1>, +<-0.001,0.005,1>, +ZS(52) +<-0.001,0,1>, +<-0.002,-0.003,1>, +<-0.010,-0.015,1>, +<0.156,0.287,0.945>, +<0.560,0.671,0.485>, +<0.597,0.802,-0.021>, +<0.600,0.800,0.017>, +<0.599,0.795,0.092>, +<0.608,0.787,0.104>, +<0.526,0.843,0.113>, +<0.394,0.913,0.106>, +<0.206,0.976,0.070>, +<-0.006,1,0.016>, +<-0.076,0.997,-0.012>, +<0.056,0.998,-0.035>, +<0.260,0.963,-0.069>, +<0.472,0.875,-0.105>, +<0.659,0.741,-0.129>, +<0.790,0.578,-0.205> +<0.248,-0.961,-0.118>, +<0.088,-0.996,-0.028>, +<-0.098,-0.995,0.011>, +<-0.254,-0.967,0.010>, +<-0.205,-0.978,0.032>, +<0.020,-0.997,0.076>, +<0.254,-0.963,0.091>, +<0.454,-0.885,0.107>, +<0.602,-0.790,0.113>, +<0.676,-0.731,0.098>, +<0.683,-0.728,0.061>, +<0.648,-0.761,0.035>, +<0.613,-0.790,0.015>, +<0.612,-0.791,-0.006>, +<0.632,-0.775,-0.017>, +<0.653,-0.590,0.475>, +<0.139,-0.228,0.964>, +<-0.011,0.019,1>, +<-0.002,0.008,1>, +<-0.001,0.001,1>, +ZS(50) +<-0.001,-0.001,1>, +<-0.002,-0.002,1>, +<-0.009,-0.011,1>, +<0.099,0.183,0.978>, +<0.642,0.569,0.514>, +<0.642,0.767,-0.004>, +<0.612,0.790,-0.006>, +<0.619,0.785,0.023>, +<0.656,0.753,0.049>, +<0.679,0.730,0.075>, +<0.649,0.753,0.109>, +<0.547,0.829,0.116>, +<0.379,0.920,0.103>, +<0.164,0.983,0.084>, +<-0.081,0.996,0.048>, +<-0.200,0.980,0.012>, +<-0.123,0.992,0.008>, +<0.088,0.996,-0.026>, +<0.274,0.960,-0.060>, +<0.442,0.883,-0.155> +<-0.141,-0.990,0.003>, +<-0.278,-0.959,0.061>, +<-0.340,-0.939,0.048>, +<-0.231,-0.970,0.072>, +<0.028,-0.996,0.087>, +<0.264,-0.960,0.092>, +<0.482,-0.871,0.100>, +<0.645,-0.758,0.099>, +<0.738,-0.670,0.083>, +<0.755,-0.654,0.056>, +<0.719,-0.695,0.023>, +<0.662,-0.749,-0.017>, +<0.609,-0.793,-0.007>, +<0.627,-0.779,-0.002>, +<0.626,-0.779,-0.025>, +<0.670,-0.743,0.009>, +<0.478,-0.709,0.519>, +<0.114,-0.153,0.982>, +<-0.010,0.015,1>, +<-0.003,0.003,1>, +<-0.001,0.001,1>, +ZS(48) +<-0.001,-0.001,1>, +<-0.002,-0.002,1>, +<-0.009,-0.009,1>, +<0.086,0.114,0.990>, +<0.464,0.676,0.573>, +<0.676,0.736,0.040>, +<0.717,0.689,0.102>, +<0.628,0.778,-0.003>, +<0.615,0.788,0>, +<0.680,0.733,-0.007>, +<0.733,0.679,0.037>, +<0.753,0.654,0.068>, +<0.707,0.701,0.095>, +<0.582,0.806,0.105>, +<0.392,0.915,0.100>, +<0.162,0.983,0.088>, +<-0.094,0.992,0.084>, +<-0.281,0.959,0.041>, +<-0.271,0.961,0.048>, +<-0.105,0.993,0.048>, +<0.044,0.998,-0.039> +<-0.420,-0.906,0.053>, +<-0.362,-0.927,0.094>, +<-0.186,-0.975,0.118>, +<0.058,-0.994,0.092>, +<0.298,-0.950,0.091>, +<0.526,-0.846,0.088>, +<0.694,-0.715,0.082>, +<0.793,-0.606,0.064>, +<0.820,-0.571,0.038>, +<0.781,-0.624,0.007>, +<0.713,-0.701,-0.021>, +<0.636,-0.770,-0.052>, +<0.627,-0.777,-0.050>, +<0.642,-0.767,0>, +<0.655,-0.756,-0.002>, +<0.685,-0.728,-0.028>, +<0.693,-0.720,0.042>, +<0.530,-0.548,0.646>, +<0.108,-0.116,0.987>, +<-0.010,0.010,1>, +<-0.002,0.002,1>, +<0,0.001,1>, +ZS(46) +<0,-0.001,1>, +<-0.002,-0.002,1>, +<-0.009,-0.009,1>, +<0.090,0.091,0.992>, +<0.509,0.531,0.677>, +<0.688,0.721,0.076>, +<0.569,0.818,0.091>, +<0.656,0.755,-0.003>, +<0.643,0.766,0>, +<0.634,0.771,-0.053>, +<0.656,0.753,-0.053>, +<0.740,0.672,-0.015>, +<0.804,0.594,0.016>, +<0.820,0.570,0.049>, +<0.763,0.642,0.073>, +<0.631,0.771,0.089>, +<0.428,0.899,0.089>, +<0.188,0.978,0.092>, +<-0.058,0.993,0.101>, +<-0.286,0.953,0.101>, +<-0.357,0.931,0.074>, +<-0.315,0.948,0.046> +<-0.296,-0.937,0.184>, +<-0.115,-0.986,0.117>, +<0.109,-0.989,0.101>, +<0.351,-0.933,0.085>, +<0.576,-0.814,0.075>, +<0.742,-0.668,0.061>, +<0.840,-0.541,0.044>, +<0.869,-0.494,0.023>, +<0.832,-0.555,-0.003>, +<0.753,-0.658,-0.032>, +<0.670,-0.741,-0.047>, +<0.616,-0.787,-0.042>, +<0.614,-0.788,-0.051>, +<0.625,-0.780,-0.011>, +<0.650,-0.759,0.019>, +<0.666,-0.746,0.013>, +<0.694,-0.720,-0.009>, +<0.709,-0.702,0.062>, +<0.545,-0.523,0.655>, +<0.132,-0.103,0.986>, +<-0.012,0.010,1>, +<-0.003,0.002,1>, +<-0.002,0,1>, +ZS(44) +<-0.002,0,1>, +<-0.003,-0.002,1>, +<-0.012,-0.010,1>, +<0.118,0.086,0.989>, +<0.531,0.510,0.677>, +<0.704,0.705,0.087>, +<0.694,0.720,-0.010>, +<0.666,0.746,0.015>, +<0.650,0.759,0.019>, +<0.624,0.781,-0.020>, +<0.618,0.784,-0.064>, +<0.633,0.772,-0.049>, +<0.701,0.711,-0.050>, +<0.789,0.614,-0.029>, +<0.860,0.511,0.003>, +<0.873,0.487,0.030>, +<0.812,0.581,0.055>, +<0.682,0.728,0.071>, +<0.481,0.873,0.081>, +<0.238,0.967,0.090>, +<0.003,0.994,0.106>, +<-0.221,0.967,0.127>, +<-0.350,0.924,0.157> +<-0.005,-0.982,0.188>, +<0.187,-0.976,0.109>, +<0.418,-0.904,0.085>, +<0.627,-0.776,0.063>, +<0.782,-0.622,0.043>, +<0.877,-0.480,0.024>, +<0.905,-0.426,0.009>, +<0.866,-0.500,-0.012>, +<0.781,-0.623,-0.034>, +<0.683,-0.729,-0.049>, +<0.600,-0.798,-0.052>, +<0.561,-0.827,-0.036>, +<0.566,-0.824,-0.008>, +<0.606,-0.795,0.010>, +<0.639,-0.769,0.037>, +<0.684,-0.728,0.050>, +<0.708,-0.705,0.028>, +<0.719,-0.695,-0.010>, +<0.723,-0.689,0.057>, +<0.666,-0.484,0.569>, +<0.199,-0.116,0.973>, +<-0.016,0.011,1>, +<-0.004,0.003,1>, +<-0.002,0.002,1>, +ZS(42) +<-0.002,-0.002,1>, +<-0.004,-0.003,1>, +<-0.016,-0.011,1>, +<0.192,0.103,0.976>, +<0.661,0.474,0.581>, +<0.719,0.691,0.074>, +<0.719,0.695,-0.010>, +<0.706,0.707,0.034>, +<0.680,0.732,0.055>, +<0.631,0.775,0.035>, +<0.598,0.801,0.001>, +<0.562,0.827,-0.018>, +<0.568,0.822,-0.045>, +<0.625,0.778,-0.059>, +<0.721,0.691,-0.051>, +<0.823,0.567,-0.031>, +<0.897,0.442,-0.005>, +<0.911,0.412,0.015>, +<0.854,0.520,0.032>, +<0.730,0.682,0.050>, +<0.543,0.837,0.068>, +<0.309,0.947,0.085>, +<0.082,0.991,0.107>, +<-0.104,0.976,0.190> +<0.320,-0.932,0.168>, +<0.495,-0.865,0.079>, +<0.676,-0.735,0.050>, +<0.817,-0.575,0.030>, +<0.906,-0.423,0.012>, +<0.927,-0.374,-0.002>, +<0.885,-0.464,-0.019>, +<0.797,-0.603,-0.033>, +<0.689,-0.723,-0.042>, +<0.583,-0.812,-0.044>, +<0.514,-0.857,-0.034>, +<0.507,-0.862,-0.012>, +<0.549,-0.836,0.017>, +<0.611,-0.790,0.040>, +<0.668,-0.743,0.047>, +<0.711,-0.701,0.046>, +<0.731,-0.681,0.045>, +<0.742,-0.670,0.011>, +<0.809,-0.582,0.081>, +<0.738,-0.674,0.027>, +<0.586,-0.629,0.510>, +<0.296,-0.171,0.940>, +<-0.019,0.014,1>, +<-0.005,0.004,1>, +<-0.002,0.002,1>, +ZS(40) +<-0.002,-0.002,1>, +<-0.005,-0.004,1>, +<-0.019,-0.014,1>, +<0.295,0.165,0.941>, +<0.589,0.629,0.508>, +<0.735,0.677,0.036>, +<0.811,0.580,0.081>, +<0.746,0.666,0.015>, +<0.730,0.681,0.056>, +<0.705,0.707,0.055>, +<0.654,0.754,0.052>, +<0.589,0.808,0.038>, +<0.528,0.849,0.011>, +<0.496,0.868,-0.020>, +<0.525,0.850,-0.042>, +<0.614,0.788,-0.049>, +<0.731,0.680,-0.045>, +<0.841,0.541,-0.032>, +<0.918,0.396,-0.014>, +<0.936,0.352,0.002>, +<0.885,0.465,0.015>, +<0.772,0.635,0.032>, +<0.601,0.798,0.051>, +<0.396,0.914,0.085>, +<0.214,0.961,0.178> +<0.608,-0.785,0.117>, +<0.730,-0.683,0.035>, +<0.845,-0.535,0.016>, +<0.928,-0.373,-0.002>, +<0.941,-0.337,-0.010>, +<0.895,-0.446,-0.022>, +<0.803,-0.595,-0.030>, +<0.687,-0.726,-0.035>, +<0.563,-0.825,-0.036>, +<0.470,-0.882,-0.027>, +<0.443,-0.896,-0.008>, +<0.489,-0.872,0.018>, +<0.571,-0.820,0.043>, +<0.653,-0.755,0.058>, +<0.715,-0.697,0.059>, +<0.754,-0.656,0.043>, +<0.767,-0.641,0.025>, +<0.754,-0.657,0.014>, +<0.754,-0.656,-0.003>, +<0.699,-0.710,0.090>, +<0.769,-0.639,-0.009>, +<0.676,-0.564,0.475>, +<0.393,-0.253,0.884>, +<0.014,0.020,1>, +<-0.007,0.004,1>, +<-0.002,0.001,1>, +<-0.001,0,1>, +ZS(36) +<-0.001,0,1>, +<-0.002,-0.001,1>, +<-0.007,-0.004,1>, +<0.015,-0.020,1>, +<0.394,0.253,0.883>, +<0.670,0.574,0.472>, +<0.768,0.640,-0.007>, +<0.698,0.710,0.093>, +<0.754,0.657,-0.003>, +<0.759,0.651,0.020>, +<0.775,0.631,0.036>, +<0.753,0.656,0.054>, +<0.704,0.707,0.065>, +<0.629,0.775,0.061>, +<0.539,0.841,0.041>, +<0.459,0.889,0.012>, +<0.429,0.903,-0.016>, +<0.483,0.875,-0.035>, +<0.599,0.800,-0.040>, +<0.733,0.680,-0.035>, +<0.848,0.530,-0.029>, +<0.928,0.372,-0.018>, +<0.951,0.310,-0.009>, +<0.909,0.416,0>, +<0.805,0.593,0.016>, +<0.666,0.744,0.044>, +<0.524,0.840,0.137> +<0.801,-0.595,0.057>, +<0.873,-0.487,-0.016>, +<0.939,-0.343,-0.019>, +<0.949,-0.314,-0.013>, +<0.897,-0.441,-0.024>, +<0.804,-0.594,-0.024>, +<0.681,-0.732,-0.027>, +<0.544,-0.838,-0.027>, +<0.433,-0.901,-0.020>, +<0.390,-0.921,-0.005>, +<0.436,-0.900,0.016>, +<0.533,-0.845,0.039>, +<0.637,-0.769,0.057>, +<0.720,-0.691,0.062>, +<0.775,-0.630,0.052>, +<0.800,-0.599,0.030>, +<0.791,-0.612,-0.006>, +<0.776,-0.631,-0.025>, +<0.766,-0.643,0>, +<0.778,-0.629,-0.003>, +<0.790,-0.613,-0.006>, +<0.802,-0.597,-0.022>, +<0.719,-0.606,0.341>, +<0.504,-0.335,0.796>, +<0.131,0.002,0.991>, +<-0.008,0.006,1>, +<0,0.002,1>, +<0,0.001,1>, +ZS(34) +<0,-0.001,1>, +<0,-0.002,1>, +<-0.007,-0.006,1>, +<0.137,0,0.991>, +<0.506,0.337,0.794>, +<0.718,0.607,0.339>, +<0.802,0.597,-0.021>, +<0.791,0.612,-0.007>, +<0.778,0.629,-0.003>, +<0.766,0.643,0>, +<0.781,0.624,-0.021>, +<0.803,0.596,0.002>, +<0.808,0.588,0.039>, +<0.774,0.631,0.059>, +<0.705,0.706,0.066>, +<0.606,0.793,0.056>, +<0.494,0.869,0.035>, +<0.397,0.918,0.010>, +<0.373,0.928,-0.010>, +<0.448,0.894,-0.023>, +<0.583,0.812,-0.027>, +<0.729,0.684,-0.026>, +<0.847,0.530,-0.024>, +<0.930,0.366,-0.022>, +<0.958,0.285,-0.017>, +<0.925,0.380,-0.025>, +<0.841,0.540,-0.002>, +<0.760,0.645,0.081> +<0.915,-0.403,0.019>, +<0.944,-0.328,-0.027>, +<0.946,-0.322,-0.035>, +<0.893,-0.450,-0.019>, +<0.801,-0.599,-0.018>, +<0.673,-0.739,-0.017>, +<0.528,-0.849,-0.017>, +<0.404,-0.915,-0.013>, +<0.349,-0.937,-0.003>, +<0.394,-0.919,0.013>, +<0.502,-0.864,0.033>, +<0.622,-0.782,0.048>, +<0.726,-0.685,0.055>, +<0.798,-0.600,0.049>, +<0.835,-0.549,0.029>, +<0.837,-0.547,0.003>, +<0.816,-0.578,-0.020>, +<0.778,-0.626,-0.062>, +<0.768,-0.639,-0.047>, +<0.785,-0.620,0.005>, +<0.782,-0.622,0.026>, +<0.800,-0.600,0.017>, +<0.824,-0.567,-0.016>, +<0.771,-0.613,0.171>, +<0.634,-0.410,0.655>, +<0.313,-0.075,0.947>, +<-0.002,0.008,1>, +<-0.004,0,1>, +ZS(34) +<-0.003,0,1>, +<0.002,-0.008,1>, +<0.321,0.079,0.944>, +<0.637,0.415,0.649>, +<0.772,0.613,0.168>, +<0.824,0.567,-0.015>, +<0.800,0.600,0.017>, +<0.786,0.617,0.020>, +<0.791,0.612,-0.005>, +<0.772,0.633,-0.057>, +<0.783,0.619,-0.065>, +<0.828,0.561,-0.016>, +<0.850,0.526,0.010>, +<0.842,0.539,0.040>, +<0.793,0.607,0.057>, +<0.706,0.706,0.059>, +<0.588,0.807,0.049>, +<0.456,0.889,0.031>, +<0.348,0.937,0.010>, +<0.332,0.943,-0.005>, +<0.423,0.906,-0.013>, +<0.570,0.821,-0.017>, +<0.722,0.692,-0.017>, +<0.842,0.539,-0.020>, +<0.925,0.378,-0.027>, +<0.957,0.286,-0.037>, +<0.938,0.346,-0.031>, +<0.893,0.450,0.024> +<0.949,-0.314,-0.018>, +<0.934,-0.356,-0.024>, +<0.882,-0.471,-0.017>, +<0.793,-0.610,-0.005>, +<0.665,-0.747,-0.006>, +<0.516,-0.856,-0.008>, +<0.384,-0.923,-0.005>, +<0.319,-0.948,0>, +<0.363,-0.932,0.011>, +<0.480,-0.877,0.025>, +<0.612,-0.790,0.038>, +<0.731,-0.681,0.045>, +<0.818,-0.574,0.043>, +<0.866,-0.499,0.028>, +<0.876,-0.483,0.002>, +<0.852,-0.523,-0.028>, +<0.807,-0.589,-0.046>, +<0.762,-0.646,-0.044>, +<0.748,-0.662,-0.045>, +<0.732,-0.681,0>, +<0.755,-0.654,0.056>, +<0.797,-0.597,0.094>, +<0.817,-0.572,0.067>, +<0.842,-0.539,-0.008>, +<0.829,-0.558,0.036>, +<0.728,-0.507,0.461>, +<0.505,-0.227,0.833>, +<0.162,0.017,0.987>, +<-0.014,0.004,1>, +<-0.003,0,1>, +ZS(30) +<-0.003,0,1>, +<-0.013,-0.003,1>, +<0.166,-0.015,0.986>, +<0.498,0.236,0.834>, +<0.731,0.512,0.452>, +<0.831,0.555,0.033>, +<0.840,0.543,-0.001>, +<0.813,0.578,0.075>, +<0.791,0.605,0.093>, +<0.751,0.659,0.043>, +<0.739,0.674,-0.015>, +<0.761,0.646,-0.057>, +<0.776,0.629,-0.049>, +<0.822,0.568,-0.044>, +<0.868,0.497,-0.020>, +<0.887,0.461,0.013>, +<0.868,0.495,0.037>, +<0.807,0.589,0.049>, +<0.706,0.707,0.049>, +<0.572,0.819,0.038>, +<0.429,0.903,0.022>, +<0.315,0.949,0.008>, +<0.304,0.953,0>, +<0.406,0.914,-0.005>, +<0.559,0.829,-0.006>, +<0.714,0.700,-0.009>, +<0.834,0.551,-0.014>, +<0.913,0.407,-0.032>, +<0.952,0.304,-0.032>, +<0.958,0.287,-0.001> +<0.911,-0.408,-0.050>, +<0.866,-0.499,-0.002>, +<0.783,-0.623,0.004>, +<0.658,-0.753,0.007>, +<0.511,-0.860,0.005>, +<0.374,-0.928,0.002>, +<0.301,-0.954,0.003>, +<0.344,-0.939,0.009>, +<0.466,-0.885,0.019>, +<0.605,-0.796,0.028>, +<0.734,-0.678,0.036>, +<0.831,-0.555,0.036>, +<0.888,-0.458,0.025>, +<0.906,-0.424,0.004>, +<0.884,-0.466,-0.021>, +<0.831,-0.555,-0.046>, +<0.763,-0.644,-0.057>, +<0.704,-0.709,-0.043>, +<0.672,-0.740,-0.005>, +<0.684,-0.728,0.043>, +<0.735,-0.674,0.077>, +<0.789,-0.605,0.105>, +<0.845,-0.520,0.124>, +<0.870,-0.489,0.058>, +<0.860,-0.510,-0.003>, +<0.953,-0.275,0.127>, +<0.794,-0.567,0.220>, +<0.666,-0.438,0.604>, +<0.461,-0.093,0.882>, +<0.131,0.018,0.991>, +<-0.010,0.002,1>, +<-0.003,0,1>, +ZS(25) +<-0.001,0,1>, +<-0.003,0,1>, +<-0.009,-0.002,1>, +<0.135,-0.016,0.991>, +<0.554,0.080,0.829>, +<0.668,0.437,0.602>, +<0.799,0.563,0.211>, +<0.950,0.290,0.118>, +<0.864,0.504,0.002>, +<0.871,0.486,0.074>, +<0.837,0.529,0.136>, +<0.775,0.624,0.104>, +<0.719,0.692,0.068>, +<0.678,0.735,0.029>, +<0.682,0.731,-0.020>, +<0.722,0.690,-0.052>, +<0.784,0.618,-0.059>, +<0.853,0.521,-0.042>, +<0.903,0.429,-0.013>, +<0.916,0.400,0.012>, +<0.887,0.461,0.032>, +<0.817,0.575,0.040>, +<0.705,0.708,0.035>, +<0.561,0.827,0.025>, +<0.412,0.911,0.016>, +<0.296,0.955,0.007>, +<0.288,0.958,0.003>, +<0.398,0.917,0.003>, +<0.553,0.833,0.002>, +<0.705,0.709,0.002>, +<0.822,0.569,-0.006>, +<0.898,0.440,-0.018>, +<0.936,0.347,-0.058> +<0.832,-0.554,-0.037>, +<0.767,-0.642,0.018>, +<0.654,-0.756,0.023>, +<0.514,-0.858,0.016>, +<0.376,-0.927,0.010>, +<0.296,-0.955,0.005>, +<0.337,-0.941,0.006>, +<0.459,-0.888,0.010>, +<0.602,-0.799,0.018>, +<0.737,-0.675,0.025>, +<0.840,-0.542,0.028>, +<0.904,-0.428,0.022>, +<0.927,-0.374,0.007>, +<0.909,-0.416,-0.015>, +<0.852,-0.522,-0.037>, +<0.766,-0.641,-0.049>, +<0.677,-0.735,-0.047>, +<0.610,-0.792,-0.020>, +<0.601,-0.799,0.026>, +<0.663,-0.745,0.078>, +<0.756,-0.644,0.115>, +<0.842,-0.527,0.115>, +<0.895,-0.439,0.080>, +<0.894,-0.445,0.051>, +<0.877,-0.480,0.014>, +<0.876,-0.482,-0.002>, +<0.836,-0.533,0.127>, +<0.949,-0.293,0.117>, +<0.792,-0.518,0.323>, +<0.655,-0.425,0.625>, +<0.447,-0.078,0.891>, +<0.194,0.018,0.981>, +<0.018,0.004,1>, +<-0.005,0,1>, +z,z,<-0.001,0,1>, +<-0.002,0,1>, +<-0.002,0,1>, +ZS(15) +<-0.001,0,1>, +<-0.003,0,1>, +<-0.006,0,1>, +<0.021,-0.003,1>, +<0.201,-0.017,0.980>, +<0.451,0.083,0.889>, +<0.623,0.541,0.564>, +<0.791,0.520,0.321>, +<0.915,0.398,0.063>, +<0.838,0.532,0.124>, +<0.876,0.483,-0.002>, +<0.882,0.472,0.020>, +<0.903,0.426,0.054>, +<0.892,0.444,0.089>, +<0.828,0.549,0.113>, +<0.734,0.672,0.104>, +<0.641,0.765,0.062>, +<0.596,0.803,0.012>, +<0.628,0.778,-0.031>, +<0.705,0.707,-0.052>, +<0.797,0.602,-0.050>, +<0.879,0.475,-0.033>, +<0.929,0.370,-0.009>, +<0.936,0.352,0.012>, +<0.900,0.434,0.025>, +<0.824,0.566,0.027>, +<0.704,0.710,0.022>, +<0.555,0.832,0.016>, +<0.405,0.914,0.010>, +<0.289,0.957,0.006>, +<0.284,0.959,0.008>, +<0.399,0.917,0.009>, +<0.551,0.834,0.012>, +<0.696,0.718,0.011>, +<0.806,0.593,0.005>, +<0.867,0.497,-0.045> +<0.725,-0.688,-0.025>, +<0.647,-0.762,0.028>, +<0.527,-0.849,0.030>, +<0.390,-0.920,0.017>, +<0.306,-0.952,0.006>, +<0.341,-0.940,0>, +<0.460,-0.888,0.001>, +<0.601,-0.799,0.006>, +<0.739,-0.673,0.012>, +<0.846,-0.532,0.016>, +<0.915,-0.404,0.015>, +<0.942,-0.336,0.007>, +<0.927,-0.375,-0.008>, +<0.868,-0.495,-0.026>, +<0.772,-0.634,-0.039>, +<0.658,-0.751,-0.042>, +<0.558,-0.830,-0.026>, +<0.517,-0.856,0.010>, +<0.582,-0.811,0.056>, +<0.706,-0.701,0.100>, +<0.829,-0.546,0.122>, +<0.912,-0.396,0.110>, +<0.947,-0.318,0.040>, +<0.933,-0.352,-0.070>, +<0.906,-0.410,-0.107>, +<0.883,-0.469,-0.001>, +<0.891,-0.454,0.004>, +<0.879,-0.471,0.071>, +<0.846,-0.500,0.187>, +<0.907,-0.419,0.050>, +<0.834,-0.465,0.297>, +<0.734,-0.346,0.584>, +<0.556,-0.123,0.822>, +<0.346,0.011,0.938>, +<0.145,0.011,0.989>, +<0.022,0,1>, +<-0.010,-0.002,1>, +<-0.006,0,1>, +<-0.003,0.001,1>, +<0,0.002,1>, +ZS(5) +<-0.001,0,1>, +<-0.001,0,1>, +<-0.002,0,1>, +<-0.001,0,1>, +<-0.001,0,1>, +<-0.002,0,1>, +<-0.003,0,1>, +<-0.004,0,1>, +<-0.009,0,1>, +<0.024,-0.003,1>, +<0.152,-0.011,0.988>, +<0.354,-0.004,0.935>, +<0.564,0.130,0.815>, +<0.739,0.349,0.576>, +<0.836,0.464,0.294>, +<0.906,0.420,0.052>, +<0.871,0.474,0.127>, +<0.890,0.454,0.038>, +<0.894,0.449,-0.003>, +<0.883,0.469,-0.001>, +<0.908,0.401,-0.120>, +<0.940,0.338,-0.051>, +<0.947,0.313,0.066>, +<0.899,0.423,0.112>, +<0.806,0.580,0.117>, +<0.676,0.731,0.091>, +<0.554,0.832,0.046>, +<0.514,0.858,0.001>, +<0.585,0.810,-0.035>, +<0.696,0.717,-0.047>, +<0.810,0.584,-0.042>, +<0.899,0.437,-0.025>, +<0.946,0.324,-0.005>, +<0.949,0.316,0.009>, +<0.908,0.418,0.016>, +<0.826,0.563,0.016>, +<0.703,0.711,0.013>, +<0.553,0.833,0.007>, +<0.405,0.914,0.005>, +<0.291,0.957,0.004>, +<0.292,0.957,0.008>, +<0.409,0.912,0.015>, +<0.557,0.830,0.024>, +<0.685,0.728,0.024>, +<0.764,0.644,-0.024> +<0.610,-0.793,-0.019>, +<0.535,-0.844,0.027>, +<0.420,-0.907,0.024>, +<0.330,-0.944,0.008>, +<0.357,-0.934,-0.004>, +<0.469,-0.883,-0.009>, +<0.604,-0.797,-0.007>, +<0.741,-0.672,-0.002>, +<0.849,-0.528,0.004>, +<0.920,-0.391,0.006>, +<0.951,-0.310,0.003>, +<0.937,-0.348,-0.005>, +<0.880,-0.476,-0.017>, +<0.779,-0.627,-0.028>, +<0.650,-0.759,-0.032>, +<0.522,-0.853,-0.024>, +<0.446,-0.895,0.002>, +<0.504,-0.863,0.037>, +<0.654,-0.752,0.080>, +<0.810,-0.577,0.106>, +<0.920,-0.377,0.104>, +<0.975,-0.209,0.069>, +<0.992,-0.129,-0.010>, +<0.966,-0.237,-0.099>, +<0.857,-0.471,-0.208>, +<0.826,-0.554,-0.106>, +<0.819,-0.571,0.056>, +<0.812,-0.562,0.158>, +<0.893,-0.401,0.204>, +<0.929,-0.358,0.093>, +<0.934,-0.357,-0.006>, +<0.936,-0.350,0.023>, +<0.899,-0.392,0.196>, +<0.826,-0.373,0.423>, +<0.726,-0.248,0.642>, +<0.575,-0.085,0.814>, +<0.563,0.019,0.826>, +<0.277,0.016,0.961>, +<0.154,0.008,0.988>, +<0.068,0.004,0.998>, +<0.020,0,1>, +<-0.001,0,1>, +<-0.006,0,1>, +<-0.006,0,1>, +<-0.006,0,1>, +<-0.007,0,1>, +<-0.009,0,1>, +<0.270,-0.001,0.963>, +z,<0.227,-0.001,0.974>, +<0.085,0,0.996>, +<0.343,-0.007,0.939>, +<0.300,-0.025,0.954>, +<0.433,-0.014,0.901>, +<0.582,0.086,0.809>, +<0.728,0.255,0.636>, +<0.829,0.374,0.415>, +<0.902,0.389,0.189>, +<0.937,0.349,0.020>, +<0.935,0.354,-0.004>, +<0.915,0.387,0.111>, +<0.876,0.444,0.189>, +<0.821,0.550,0.150>, +<0.858,0.514,0.029>, +<0.833,0.530,-0.157>, +<0.870,0.444,-0.216>, +<0.977,0.203,-0.060>, +<0.991,0.136,0.015>, +<0.966,0.245,0.082>, +<0.900,0.422,0.109>, +<0.778,0.620,0.105>, +<0.614,0.786,0.073>, +<0.469,0.883,0.028>, +<0.450,0.893,-0.011>, +<0.558,0.829,-0.037>, +<0.694,0.719,-0.040>, +<0.823,0.567,-0.031>, +<0.913,0.407,-0.015>, +<0.956,0.292,-0.002>, +<0.955,0.296,0.006>, +<0.911,0.411,0.010>, +<0.827,0.562,0.008>, +<0.703,0.711,0.002>, +<0.555,0.832,-0.003>, +<0.411,0.911,-0.005>, +<0.305,0.952,0>, +<0.311,0.950,0.009>, +<0.434,0.901,0.025>, +<0.562,0.827,0.035>, +<0.646,0.763,-0.009> +<0.513,-0.858,-0.017>, +<0.448,-0.894,0.012>, +<0.370,-0.929,0.008>, +<0.382,-0.924,-0.010>, +<0.482,-0.876,-0.018>, +<0.609,-0.793,-0.018>, +<0.741,-0.672,-0.015>, +<0.848,-0.529,-0.006>, +<0.921,-0.390,0>, +<0.954,-0.300,0.002>, +<0.943,-0.333,-0.002>, +<0.886,-0.463,-0.011>, +<0.784,-0.620,-0.021>, +<0.647,-0.762,-0.026>, +<0.501,-0.865,-0.023>, +<0.392,-0.920,-0.004>, +<0.435,-0.900,0.024>, +<0.602,-0.796,0.058>, +<0.783,-0.616,0.090>, +<0.919,-0.383,0.096>, +<0.984,-0.162,0.080>, +<1,0.008,0.014>, +<0.996,-0.066,-0.060>, +<0.926,-0.356,-0.124>, +<0.789,-0.599,-0.137>, +<0.700,-0.705,-0.114>, +<0.658,-0.748,0.090>, +<0.805,-0.568,0.170>, +<0.918,-0.329,0.223>, +<0.974,-0.198,0.113>, +<0.960,-0.278,0.033>, +<0.944,-0.330,0>, +<0.952,-0.308,0>, +<0.951,-0.306,0.052>, +<0.955,-0.287,0.071>, +<0.949,-0.237,0.208>, +<0.881,-0.297,0.368>, +<0.805,-0.315,0.503>, +<0.745,-0.162,0.648>, +<0.663,-0.082,0.744>, +<0.588,-0.028,0.808>, +<0.505,-0.003,0.863>, +<0.456,0.004,0.890>, +<0.426,0,0.905>, +<0.414,-0.004,0.910>, +<0.425,-0.009,0.905>, +<0.443,0.259,0.858>, +<0.513,-0.012,0.858>, +<0.560,-0.023,0.828>, +<0.621,0.041,0.783>, +<0.696,0.073,0.714>, +<0.763,0.191,0.617>, +<0.834,0.216,0.508>, +<0.887,0.288,0.361>, +<0.965,0.135,0.225>, +<0.959,0.280,0.049>, +<0.957,0.290,0.011>, +<0.952,0.307,-0.002>, +<0.944,0.330,0>, +<0.968,0.248,0.047>, +<0.960,0.219,0.173>, +<0.892,0.387,0.232>, +<0.757,0.635,0.154>, +<0.656,0.755,0.015>, +<0.753,0.637,-0.165>, +<0.839,0.531,-0.121>, +<0.954,0.282,-0.100>, +<0.999,0.037,-0.035>, +<0.999,0.027,0.045>, +<0.972,0.214,0.095>, +<0.891,0.441,0.105>, +<0.737,0.670,0.091>, +<0.547,0.835,0.049>, +<0.394,0.919,0.010>, +<0.405,0.914,-0.019>, +<0.546,0.837,-0.033>, +<0.699,0.714,-0.030>, +<0.834,0.552,-0.019>, +<0.922,0.387,-0.007>, +<0.962,0.275,0.003>, +<0.958,0.288,0.007>, +<0.912,0.411,0.004>, +<0.827,0.562,-0.003>, +<0.704,0.710,-0.011>, +<0.560,0.828,-0.017>, +<0.427,0.904,-0.017>, +<0.332,0.943,-0.008>, +<0.352,0.936,0.015>, +<0.460,0.888,0.028>, +<0.537,0.843,-0.007> +<0.445,-0.895,-0.022>, +<0.410,-0.912,-0.009>, +<0.415,-0.910,-0.018>, +<0.499,-0.866,-0.031>, +<0.614,-0.788,-0.033>, +<0.739,-0.673,-0.025>, +<0.844,-0.536,-0.017>, +<0.918,-0.398,-0.005>, +<0.953,-0.304,0.002>, +<0.944,-0.331,0.005>, +<0.890,-0.457,0>, +<0.789,-0.614,-0.010>, +<0.647,-0.762,-0.019>, +<0.492,-0.870,-0.023>, +<0.357,-0.934,-0.011>, +<0.378,-0.926,0.010>, +<0.552,-0.833,0.042>, +<0.749,-0.659,0.073>, +<0.908,-0.409,0.090>, +<0.984,-0.154,0.085>, +<0.995,0.087,0.047>, +<0.995,0.095,-0.016>, +<0.976,-0.200,-0.088>, +<0.836,-0.533,-0.133>, +<0.639,-0.757,-0.137>, +<0.506,-0.862,-0.024>, +<0.660,-0.746,0.093>, +<0.884,-0.436,0.169>, +<0.977,-0.111,0.181>, +<0.998,-0.069,-0.003>, +<0.962,-0.235,-0.141>, +<0.947,-0.322,0>, +<0.925,-0.379,0.017>, +<0.922,-0.351,0.161>, +<0.958,-0.234,0.165>, +<0.977,-0.214,0.009>, +<0.974,-0.221,0.041>, +<0.982,-0.187,0>, +<0.981,-0.176,0.081>, +<0.965,-0.166,0.205>, +<0.965,-0.143,0.218>, +<0.948,-0.122,0.294>, +<0.932,-0.085,0.352>, +<0.922,-0.049,0.385>, +<0.918,-0.011,0.395>, +<0.916,0.030,0.400>, +<0.934,0.071,0.351>, +<0.889,0.104,0.446>, +<0.964,0.112,0.243>, +<0.914,0.158,0.373>, +<0.983,0.156,0.102>, +<0.970,0.187,0.154>, +<0.983,0.184,-0.006>, +<0.954,0.242,0.179>, +<0.963,0.253,0.093>, +<0.937,0.292,0.190>, +<0.942,0.317,0.112>, +<0.948,0.318,-0.008>, +<0.947,0.321,0>, +<0.980,0.187,-0.066>, +<0.994,0.078,0.080>, +<0.954,0.216,0.207>, +<0.826,0.538,0.172>, +<0.591,0.804,0.064>, +<0.552,0.832,-0.050>, +<0.726,0.675,-0.130>, +<0.895,0.431,-0.117>, +<0.992,0.111,-0.057>, +<0.994,-0.112,0.004>, +<0.997,-0.027,0.070>, +<0.972,0.215,0.096>, +<0.869,0.485,0.096>, +<0.687,0.723,0.068>, +<0.484,0.875,0.030>, +<0.335,0.942,0>, +<0.382,0.924,-0.023>, +<0.546,0.837,-0.027>, +<0.708,0.706,-0.019>, +<0.842,0.539,-0.010>, +<0.926,0.377,0.002>, +<0.963,0.269,0.007>, +<0.957,0.289,0.003>, +<0.910,0.416,-0.005>, +<0.824,0.566,-0.018>, +<0.705,0.709,-0.029>, +<0.570,0.821,-0.035>, +<0.451,0.892,-0.030>, +<0.375,0.927,-0.007>, +<0.398,0.917,0.002>, +<0.452,0.892,-0.016> +<0.431,-0.902,-0.021>, +<0.451,-0.892,-0.027>, +<0.519,-0.854,-0.041>, +<0.622,-0.782,-0.047>, +<0.736,-0.676,-0.043>, +<0.837,-0.547,-0.028>, +<0.910,-0.414,-0.013>, +<0.948,-0.319,0.002>, +<0.940,-0.341,0.009>, +<0.888,-0.459,0.009>, +<0.794,-0.608,0.002>, +<0.653,-0.758,-0.009>, +<0.493,-0.870,-0.019>, +<0.338,-0.941,-0.017>, +<0.330,-0.944,0>, +<0.502,-0.864,0.028>, +<0.708,-0.704,0.060>, +<0.886,-0.456,0.081>, +<0.981,-0.172,0.088>, +<0.992,0.101,0.076>, +<0.978,0.209,0.015>, +<0.999,-0.035,-0.031>, +<0.910,-0.402,-0.096>, +<0.699,-0.704,-0.127>, +<0.435,-0.895,-0.094>, +<0.446,-0.895,0>, +<0.760,-0.642,0.103>, +<0.951,-0.265,0.156>, +<0.983,0.103,0.154>, +<0.989,0.146,0.033>, +<0.934,-0.275,-0.228>, +<0.857,-0.479,-0.189>, +<0.855,-0.515,0.062>, +<0.862,-0.458,0.216>, +<0.956,-0.132,0.263>, +<0.997,-0.070,0.045>, +<0.980,-0.200,0.002>, +<0.977,-0.213,-0.008>, +<0.954,-0.267,0.134>, +<0.957,-0.140,0.253>, +<0.980,-0.050,0.193>, +<0.996,-0.089,0.016>, +<0.998,-0.061,-0.003>, +<1,-0.036,0>, +<0.986,-0.031,0.162>, +<0.973,0.025,0.229>, +<0.994,0.063,0.094>, +<0.998,0.060,-0.004>, +<1,0.041,0.003>, +<0.981,0.117,0.152>, +<0.968,0.204,0.147>, +<0.986,0.167,-0.003>, +<0.983,0.185,0>, +<0.994,0.102,0.033>, +<0.974,0.049,0.221>, +<0.911,0.304,0.278>, +<0.853,0.511,0.108>, +<0.914,0.401,-0.057>, +<0.912,0.355,-0.207>, +<0.972,0.174,-0.157>, +<0.983,-0.159,0.090>, +<0.977,0.019,0.211>, +<0.891,0.417,0.178>, +<0.634,0.770,0.076>, +<0.413,0.911,-0.008>, +<0.539,0.833,-0.124>, +<0.786,0.607,-0.120>, +<0.953,0.291,-0.085>, +<0.998,-0.057,-0.017>, +<0.976,-0.219,0.019>, +<0.996,-0.028,0.087>, +<0.963,0.250,0.097>, +<0.836,0.542,0.080>, +<0.641,0.766,0.046>, +<0.426,0.905,0.011>, +<0.297,0.955,-0.014>, +<0.379,0.925,-0.027>, +<0.554,0.832,-0.022>, +<0.717,0.697,-0.011>, +<0.847,0.532,0>, +<0.926,0.377,0.007>, +<0.961,0.276,0.008>, +<0.953,0.303,0>, +<0.903,0.430,-0.016>, +<0.819,0.573,-0.036>, +<0.705,0.708,-0.049>, +<0.583,0.811,-0.048>, +<0.478,0.877,-0.036>, +<0.420,0.907,-0.021>, +<0.417,0.909,-0.023> +<0.487,-0.873,-0.015>, +<0.540,-0.840,-0.042>, +<0.630,-0.775,-0.052>, +<0.732,-0.679,-0.050>, +<0.826,-0.562,-0.041>, +<0.899,-0.437,-0.021>, +<0.938,-0.346,-0.002>, +<0.932,-0.361,0.012>, +<0.883,-0.469,0.017>, +<0.795,-0.606,0.012>, +<0.662,-0.749,0.002>, +<0.505,-0.863,-0.012>, +<0.339,-0.941,-0.021>, +<0.298,-0.954,-0.014>, +<0.458,-0.889,0.010>, +<0.668,-0.743,0.045>, +<0.857,-0.510,0.077>, +<0.973,-0.215,0.088>, +<0.993,0.069,0.095>, +<0.959,0.280,0.035>, +<0.992,0.124,0.009>, +<0.969,-0.239,-0.062>, +<0.792,-0.601,-0.105>, +<0.498,-0.855,-0.145>, +<0.291,-0.956,-0.044>, +<0.539,-0.842,0>, +<0.866,-0.487,0.115>, +<0.987,-0.057,0.151>, +<0.955,0.290,0.067>, +<0.988,0.153,0.025>, +<0.944,-0.313,-0.102>, +<0.761,-0.608,-0.228>, +<0.667,-0.744,0.032>, +<0.882,-0.436,0.179>, +<0.970,0.062,0.234>, +<0.998,0.058,0.025>, +<0.976,-0.150,-0.160>, +<0.942,-0.334,-0.038>, +<0.879,-0.450,0.158>, +<0.941,-0.201,0.271>, +<0.953,0.114,0.281>, +<0.993,0.116,0.013>, +<0.999,-0.046,0.001>, +<0.975,-0.220,-0.011>, +<0.934,-0.256,0.251>, +<0.945,0.097,0.313>, +<0.937,0.303,0.177>, +<0.986,0.165,-0.009>, +<0.996,-0.083,0.017>, +<0.984,-0.040,0.175>, +<0.934,0.323,0.151>, +<0.947,0.321,-0.024>, +<0.980,0.133,-0.145>, +<0.999,0.002,0.052>, +<0.974,-0.044,0.223>, +<0.936,0.275,0.220>, +<0.769,0.631,0.102>, +<0.772,0.625,-0.116>, +<0.879,0.395,-0.266>, +<0.993,0.082,-0.085>, +<0.962,-0.262,0.077>, +<0.965,-0.196,0.173>, +<0.959,0.231,0.164>, +<0.750,0.655,0.094>, +<0.409,0.913,-0.018>, +<0.339,0.938,-0.076>, +<0.623,0.771,-0.130>, +<0.865,0.490,-0.110>, +<0.989,0.138,-0.059>, +<0.977,-0.215,0.002>, +<0.961,-0.268,0.062>, +<0.995,0.005,0.099>, +<0.948,0.306,0.084>, +<0.799,0.598,0.063>, +<0.591,0.806,0.025>, +<0.373,0.928,-0.004>, +<0.268,0.963,-0.013>, +<0.391,0.920,-0.029>, +<0.566,0.824,-0.017>, +<0.725,0.689,-0.003>, +<0.847,0.531,0.011>, +<0.921,0.389,0.019>, +<0.954,0.299,0.012>, +<0.943,0.331,-0.009>, +<0.891,0.454,-0.031>, +<0.809,0.585,-0.048>, +<0.704,0.708,-0.053>, +<0.596,0.801,-0.052>, +<0.506,0.861,-0.041>, +<0.457,0.889,-0.019> +<0.577,-0.817,-0.010>, +<0.640,-0.767,-0.048>, +<0.728,-0.683,-0.055>, +<0.815,-0.578,-0.046>, +<0.884,-0.467,-0.028>, +<0.922,-0.388,0>, +<0.917,-0.397,0.018>, +<0.872,-0.489,0.026>, +<0.793,-0.609,0.023>, +<0.672,-0.741,0.009>, +<0.523,-0.852,-0.008>, +<0.366,-0.930,-0.033>, +<0.293,-0.956,-0.028>, +<0.425,-0.905,-0.012>, +<0.631,-0.775,0.021>, +<0.826,-0.560,0.061>, +<0.958,-0.272,0.093>, +<0.994,0.020,0.105>, +<0.951,0.295,0.093>, +<0.963,0.265,0.039>, +<0.996,-0.079,-0.031>, +<0.886,-0.454,-0.095>, +<0.627,-0.768,-0.127>, +<0.302,-0.942,-0.148>, +<0.303,-0.951,-0.068>, +<0.685,-0.728,0.032>, +<0.942,-0.310,0.125>, +<0.966,0.186,0.181>, +<0.923,0.382,0.044>, +<0.998,0.058,-0.002>, +<0.902,-0.418,-0.104>, +<0.623,-0.769,-0.144>, +<0.640,-0.768,-0.003>, +<0.937,-0.329,0.114>, +<0.953,0.219,0.211>, +<0.954,0.297,0.042>, +<0.962,-0.180,-0.204>, +<0.821,-0.554,-0.140>, +<0.830,-0.550,0.091>, +<0.963,-0.183,0.199>, +<0.946,0.269,0.182>, +<0.978,0.209,-0.014>, +<0.987,-0.049,-0.150>, +<0.946,-0.319,-0.048>, +<0.904,-0.389,0.175>, +<0.974,0.082,0.210>, +<0.899,0.404,0.167>, +<0.963,0.265,-0.041>, +<0.991,-0.134,-0.020>, +<0.987,-0.103,0.122>, +<0.938,0.344,0.043>, +<0.866,0.489,-0.107>, +<0.979,0.119,-0.163>, +<0.968,-0.251,0.021>, +<0.957,-0.221,0.186>, +<0.955,0.208,0.211>, +<0.723,0.686,0.082>, +<0.626,0.775,-0.088>, +<0.816,0.551,-0.177>, +<0.986,0.140,-0.088>, +<0.946,-0.321,0.050>, +<0.927,-0.342,0.157>, +<0.986,0.034,0.165>, +<0.850,0.517,0.105>, +<0.527,0.850,0.008>, +<0.238,0.970,-0.051>, +<0.402,0.901,-0.164>, +<0.726,0.674,-0.136>, +<0.938,0.334,-0.092>, +<1,-0.032,0.006>, +<0.945,-0.321,0.056>, +<0.966,-0.229,0.120>, +<0.993,0.062,0.099>, +<0.924,0.373,0.082>, +<0.757,0.652,0.050>, +<0.542,0.840,0.028>, +<0.329,0.944,-0.019>, +<0.265,0.963,-0.041>, +<0.414,0.910,-0.032>, +<0.579,0.815,-0.006>, +<0.730,0.683,0.019>, +<0.841,0.540,0.033>, +<0.909,0.416,0.028>, +<0.940,0.342,0.013>, +<0.928,0.373,-0.010>, +<0.876,0.481,-0.037>, +<0.799,0.599,-0.053>, +<0.705,0.707,-0.061>, +<0.612,0.789,-0.052>, +<0.545,0.838,-0.014> +<0.668,-0.744,-0.003>, +<0.727,-0.686,-0.040>, +<0.803,-0.594,-0.046>, +<0.867,-0.497,-0.033>, +<0.902,-0.432,-0.014>, +<0.899,-0.437,0.010>, +<0.861,-0.508,0.030>, +<0.792,-0.610,0.033>, +<0.685,-0.728,0.021>, +<0.547,-0.837,0.003>, +<0.400,-0.916,-0.018>, +<0.300,-0.954,-0.026>, +<0.386,-0.922,-0.027>, +<0.579,-0.815,0.011>, +<0.779,-0.625,0.051>, +<0.934,-0.348,0.086>, +<0.994,-0.042,0.106>, +<0.962,0.245,0.121>, +<0.931,0.358,0.070>, +<0.994,0.101,0.033>, +<0.960,-0.271,-0.073>, +<0.753,-0.644,-0.138>, +<0.441,-0.883,-0.164>, +<0.190,-0.975,-0.111>, +<0.402,-0.911,-0.092>, +<0.789,-0.610,0.067>, +<0.984,-0.112,0.142>, +<0.910,0.369,0.187>, +<0.911,0.401,0.097>, +<0.998,-0.045,-0.041>, +<0.836,-0.533,-0.128>, +<0.527,-0.843,-0.111>, +<0.642,-0.767,-0.017>, +<0.955,-0.265,0.133>, +<0.919,0.346,0.190>, +<0.929,0.359,0.088>, +<0.976,-0.210,-0.049>, +<0.742,-0.653,-0.150>, +<0.750,-0.660,0.043>, +<0.975,-0.153,0.159>, +<0.904,0.399,0.156>, +<0.900,0.435,0.005>, +<0.982,-0.026,-0.189>, +<0.837,-0.545,-0.046>, +<0.850,-0.513,0.124>, +<0.984,0.064,0.167>, +<0.839,0.529,0.129>, +<0.914,0.403,-0.050>, +<0.976,-0.217,-0.017>, +<0.975,-0.185,0.125>, +<0.898,0.440,0.015>, +<0.834,0.540,-0.118>, +<0.985,0.152,-0.082>, +<0.947,-0.322,-0.017>, +<0.908,-0.364,0.205>, +<0.991,0.086,0.107>, +<0.752,0.660,-0.011>, +<0.514,0.855,-0.074>, +<0.713,0.685,-0.152>, +<0.969,0.239,-0.068>, +<0.951,-0.302,0.064>, +<0.871,-0.467,0.152>, +<0.974,-0.144,0.177>, +<0.926,0.346,0.150>, +<0.648,0.761,0.036>, +<0.258,0.962,-0.089>, +<0.213,0.966,-0.147>, +<0.543,0.827,-0.144>, +<0.840,0.536,-0.089>, +<0.989,0.145,-0.016>, +<0.973,-0.217,0.078>, +<0.929,-0.359,0.090>, +<0.982,-0.149,0.119>, +<0.982,0.148,0.116>, +<0.885,0.455,0.098>, +<0.700,0.712,0.050>, +<0.486,0.874,-0.012>, +<0.292,0.956,-0.033>, +<0.292,0.956,-0.035>, +<0.449,0.893,-0.014>, +<0.606,0.795,0.009>, +<0.743,0.669,0.025>, +<0.838,0.544,0.032>, +<0.896,0.444,0.024>, +<0.922,0.387,0>, +<0.909,0.417,-0.021>, +<0.861,0.508,-0.042>, +<0.788,0.613,-0.052>, +<0.706,0.707,-0.042>, +<0.642,0.767,-0.002> +<0.728,-0.685,0.030> +<0.782,-0.624,-0.005> +<0.845,-0.534,-0.014> +<0.887,-0.462,-0.019> +<0.894,-0.447,-0.022> +<0.866,-0.499,-0.011> +<0.812,-0.584,-0.005> +<0.724,-0.689,-0.011> +<0.599,-0.800,-0.027> +<0.453,-0.890,-0.045> +<0.323,-0.945,-0.045> +<0.313,-0.950,0.013> +<0.492,-0.870,0.042> +<0.684,-0.723,0.098> +<0.868,-0.473,0.150> +<0.971,-0.160,0.179> +<0.973,0.143,0.181> +<0.921,0.365,0.139> +<0.951,0.306,0.042> +<0.998,-0.044,-0.045> +<0.889,-0.433,-0.147> +<0.605,-0.768,-0.209> +<0.266,-0.938,-0.221> +<0.163,-0.983,-0.082> +<0.529,-0.849,-0.016> +<0.875,-0.459,0.152> +<0.976,0.094,0.196> +<0.865,0.466,0.189> +<0.916,0.383,0.116> +<0.989,-0.129,-0.075> +<0.732,-0.653,-0.195> +<0.418,-0.902,-0.105> +<0.667,-0.745,0.018> +<0.971,-0.156,0.183> +<0.875,0.448,0.183> +<0.925,0.363,0.114> +<0.968,-0.248,-0.034> +<0.675,-0.728,-0.120> +<0.714,-0.700,0.017> +<0.984,-0.117,0.131> +<0.863,0.485,0.140> +<0.862,0.507,0.014> +<0.995,-0.062,-0.076> +<0.781,-0.624,-0.029> +<0.811,-0.580,0.077> +<0.992,0.039,0.117> +<0.808,0.581,0.093> +<0.868,0.495,-0.043> +<0.973,-0.231,0.017> +<0.967,-0.228,0.114> +<0.891,0.455,-0.007> +<0.782,0.618,-0.083> +<0.974,0.185,-0.128> +<0.899,-0.437,0.016> +<0.866,-0.425,0.263> +<0.996,0.084,0.023> +<0.823,0.567,-0.036> +<0.505,0.860,-0.069> +<0.604,0.785,-0.137> +<0.926,0.366,-0.094> +<0.975,-0.204,0.085> +<0.840,-0.522,0.152> +<0.907,-0.327,0.265> +<0.952,0.177,0.248> +<0.751,0.655,0.084> +<0.357,0.932,-0.059> +<0.133,0.983,-0.126> +<0.366,0.912,-0.185> +<0.692,0.705,-0.153> +<0.941,0.319,-0.114> +<0.998,-0.067,0> +<0.922,-0.384,0.041> +<0.932,-0.314,0.180> +<0.979,-0.034,0.203> +<0.939,0.291,0.183> +<0.806,0.580,0.121> +<0.600,0.797,0.070> +<0.388,0.921,0.019> +<0.252,0.968,-0.018> +<0.348,0.935,-0.069> +<0.513,0.857,-0.051> +<0.664,0.747,-0.030> +<0.780,0.625,-0.012> +<0.854,0.519,-0.007> +<0.899,0.438,-0.016> +<0.913,0.407,-0.022> +<0.890,0.455,-0.017> +<0.838,0.546,-0.011> +<0.766,0.643,-0.001> +<0.706,0.708,0.035> +} +uv_vectors { +nx*ny, +#local i=0; +#while (i, + #else + + #end + #local j=j+1; + #end + #local i=i+1; +#end +} +face_indices { +15842 +#local i=0; +#while (i + #end + #if (((j-1) >= 0) & ((i-1) >= 0)) + + #end + #local j=j+1; + #end + #local i=i+1; +#end +} diff --git a/samples/POV-Ray SDL/sky.inc b/samples/POV-Ray SDL/sky.inc new file mode 100755 index 00000000..93753d02 --- /dev/null +++ b/samples/POV-Ray SDL/sky.inc @@ -0,0 +1,91 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Persistence Of Vision Ray Tracer Include File +// File: sky.inc +// Desc: sky for 'balcony.pov' demonstration scene +// Date: July/August 2001 +// Auth: Christoph Hormann + +// Updated: 09Aug2008 (jh) for v3.7 distribution + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (version < 3.7) + #version 3.5; +#end + +#local P_Clouds= +pigment { + gradient z + pigment_map { + [ 0.0 color rgbt 1] + [ 0.1 + bozo + color_map { + [0.0 color rgbt < 0.85, 0.88, 0.94, 0.0>] + [0.15 color rgbt < 0.91, 0.96, 0.99, 0.0>] + [0.35 color rgbt < 0.91, 0.96, 0.99, 1.0>] + } + turbulence 0.75 + lambda 2.4 + omega 0.6 + octaves 8 + scale <0.4,0.4,0.15> + ] + [ 0.4 + bozo + color_map { + [0.0 color rgbt < 0.85, 0.88, 0.94, 0.0>] + [0.15 color rgbt < 0.91, 0.96, 0.99, 0.0>] + [0.35 color rgbt < 0.91, 0.96, 0.99, 1.0>] + } + turbulence 0.75 + lambda 2.4 + omega 0.6 + octaves 8 + scale <0.4,0.4,0.15> + ] + [ 0.65 color rgbt 1] + + } + rotate 10*z +} + + +#local Tex_Sky = +texture { + pigment { + function { abs(z) } + color_map { + [0.0 color rgb < 0.640, 0.685, 0.800 >] + [0.3 color rgb < 0.400, 0.550, 0.900 >] + } + turbulence 0.05 + } + + finish { + diffuse 0 + ambient 1 + } +} +texture { + pigment { P_Clouds } + finish { + diffuse 0 + ambient 1 + } +} + + +sphere { + <0, 0, 0>, 1 + texture { Tex_Sky } + scale<1000000, 1000000, 300000> + no_shadow + hollow on + photons{ collect off } +} + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ diff --git a/samples/POV-Ray SDL/table.inc b/samples/POV-Ray SDL/table.inc new file mode 100755 index 00000000..17981897 --- /dev/null +++ b/samples/POV-Ray SDL/table.inc @@ -0,0 +1,171 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Persistence Of Vision Ray Tracer Include File +// File: table.inc +// Desc: table for 'balcony.pov' demonstration scene +// Date: July/August 2001 +// Auth: Christoph Hormann + +// Updated: 09Aug2008 (jh) for v3.7 distribution + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (version < 3.7) + #version 3.5; +#end + +#declare Tex_Table_Foot= +texture { + pigment { + color rgb 0.4 + } + finish { + ambient 0.0 + diffuse 0.3 + specular 0.4 + roughness 0.01 + metallic + + reflection { + 0.8 + metallic + } + } +} + +#declare Tex_Table_Foot_Bottom= +texture { + pigment { + color rgb 0.2 + } + finish { + ambient 0.0 + diffuse 0.3 + specular 0.4 + roughness 0.02 + } +} + +#declare Tex_Dark_Wood= +texture { + pigment { + bozo + color_map { + [0.3 color rgb <0.0,0.0,0.16> ] + [0.5 color rgb <0.0,0.0,0.08> ] + [0.7 color rgb <0.0,0.0,0.0> ] + } + scale <4,1,1>*0.036 + } + finish { + ambient 0.09 + diffuse 0.3 + specular 0.5 + roughness 0.025 + + reflection { + 0.15 + metallic + } + } + normal { + granite 0.1 + scale 0.03 + accuracy 0.007 + } + scale 0.5 + rotate 90*y +} + +#declare Tex_Dark_Wood2 = +texture { + pigment { + wood + color_map { + [ 0.0000 color rgb<0.6431, 0.3176, 0.0824> ] + [ 0.1000 color rgb<0.6196, 0.2824, 0.0588> ] + [ 0.2000 color rgb<0.7137, 0.3725, 0.1529> ] + [ 0.3000 color rgb<0.7529, 0.4157, 0.1922> ] + [ 0.4000 color rgb<0.8157, 0.4941, 0.2588> ] + [ 0.5000 color rgb<0.7686, 0.4745, 0.2196> ] + [ 0.6000 color rgb<0.8471, 0.5647, 0.2980> ] + [ 0.7000 color rgb<0.8627, 0.5843, 0.3137> ] + [ 0.8000 color rgb<0.8902, 0.6314, 0.3529> ] + [ 0.9000 color rgb<0.8627, 0.6118, 0.3294> ] + [ 1.0000 color rgb<0.8392, 0.5922, 0.3098> ] + } + + turbulence <0.075, 0.075, 0.65> + scale <0.04, 0.04, 0.6> + + scale 0.27 + rotate 91*y + translate -0.1*z + } + finish { + ambient 0.0 + diffuse 0.4 + specular 0.3 + roughness 0.025 + + reflection { + 0.17 + metallic + } + } + normal { + granite 0.015 + scale <0.02, 0.02, 0.06> + rotate 91*y + accuracy 0.007 + } +} + + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#include "shapes.inc" + +#declare Table_Height=0.66; + +#declare Table= +union { + + torus { 0.49, 0.01 sturm rotate 90*x translate z*(Table_Height-0.01) } + cylinder { z*(Table_Height-0.05), z*(Table_Height-0.01), 0.5 } + cylinder { z*(Table_Height-0.01), z*Table_Height, 0.49 } + + union { + cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x } + cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x rotate 120*z } + cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x rotate 240*z } + + texture { Tex_Table_Foot } + + rotate -70*z + } + + union { + object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x } + object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x rotate 120*z } + object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x rotate 240*z } + + texture { Tex_Table_Foot_Bottom } + + rotate -70*z + } + + texture { Tex_Dark_Wood2 } + + #if (show_TableCloth) + scale <0.97, 0.97, 0.99> + #else + scale <0.97, 0.97, 1.00> + #end +} + +object { Table translate <3.3,2.52,0> } + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ diff --git a/samples/POV-Ray SDL/table_cloth.inc b/samples/POV-Ray SDL/table_cloth.inc new file mode 100755 index 00000000..84bf9331 --- /dev/null +++ b/samples/POV-Ray SDL/table_cloth.inc @@ -0,0 +1,91 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Persistence Of Vision Ray Tracer Include File +// File: table_cloth.inc +// Desc: table cloth for 'balcony.pov' demonstration scene +// Date: July/August 2001 +// Auth: Christoph Hormann + +// Updated: 09Aug2008 (jh) for v3.7 distribution + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (version < 3.7) + #version 3.5; +#end + +#declare ClCol01=color rgb <0.8, 0.7, 0.4>; +#declare ClCol02=color rgb <0.07, 0.12, 0.4>; + +#declare CPig1= +pigment { + gradient x + triangle_wave + color_map { + [0.04 ClCol01 ] + [0.04 ClCol02 ] + [0.06 ClCol02 ] + [0.06 ClCol01 ] + [0.09 ClCol01 ] + [0.09 ClCol02 ] + [0.13 ClCol02 ] + [0.13 ClCol01 ] + [0.16 ClCol01 ] + [0.16 ClCol02 ] + [0.18 ClCol02 ] + [0.18 ClCol01 ] + } +} + +#declare CPig2= +pigment { + gradient y + triangle_wave + pigment_map { + [0.04 CPig1 ] + [0.04 ClCol02 ] + [0.06 ClCol02 ] + [0.06 CPig1 ] + [0.09 CPig1 ] + [0.09 ClCol02 ] + [0.13 ClCol02 ] + [0.13 CPig1 ] + [0.16 CPig1 ] + [0.16 ClCol02 ] + [0.18 ClCol02 ] + [0.18 CPig1 ] + } +} + + /* +#include "clothutil.inc" + +ReadClothFile("cloth.cth") +DrawSmoothTriangles2(Points, 90, 90, on, true, "cloth.inc") + */ +#declare Table_Cloth= +mesh2{ + #include "cloth.inc" + texture { + uv_mapping + pigment { + CPig2 + } + finish { + ambient 0.0 + diffuse 0.6 + } + normal { + quilted 0.16 + scale 0.008 + } + } + rotate -30*z +} + +object { Table_Cloth translate <3.3,2.52,0> } + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + diff --git a/samples/POV-Ray SDL/table_stuff.inc b/samples/POV-Ray SDL/table_stuff.inc new file mode 100755 index 00000000..0bcdc4e5 --- /dev/null +++ b/samples/POV-Ray SDL/table_stuff.inc @@ -0,0 +1,136 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Persistence Of Vision Ray Tracer Include File +// File: table_stuff.inc +// Desc: stuff on the table for 'balcony.pov' demonstration scene +// Date: July/August 2001 +// Auth: Christoph Hormann + +// Updated: 09Aug2008 (jh) for v3.7 distribution + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (version < 3.7) + #version 3.5; +#end + +#declare Mat_Glass= +material { + texture { + pigment { color rgbt 1 } + finish { + ambient 0.0 + diffuse 0.1 + specular 0.5 + roughness 0.01 + + reflection { + 0.15, 1.0 + fresnel on + } + + conserve_energy + } + } + interior { + ior 1.5 + fade_distance 0.1 + fade_power 1001 + fade_color <0.4,0.4,0.8> + } +} + +#declare Tex_Box_Metal= +texture { + pigment { + color rgb <0.5,0.45,0.4> + } + finish { + ambient 0.0 + diffuse 0.05 + specular 0.5 + roughness 0.01 + metallic + + reflection { + 0.8 + metallic + } + } +} + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#include "shapes.inc" +#include "functions.inc" + +#declare Table_Height=0.66; + +#declare Box_Iso= +isosurface { + function { -f_superellipsoid(x,y,z, 0.2, 0.2) } + contained_by {box { -1.2, 1.2 }} + max_gradient 1.1 + + translate 1.001*z +} + +#declare Box= +union { + intersection { + object { Box_Iso } + object { Round_Box_Merge (<-1.1,-1.1,1.6>, <1.1,1.1,-0.1>, 0.4) } + + } + intersection { + object { Box_Iso } + object { Round_Box_Merge (<-1.1,-1.1,1.6>, <1.1,1.1,2.2>, 0.4) } + scale 1.01 + rotate 0.2 + } + torus { + 0.6, 0.13 + rotate 90*z + translate 2*z + } + + scale <1,1,0.6> +} + +#include "bglass.inc" + +union { + object { + Glass + + photons{ + target 1.0 + refraction on + reflection on + } + + translate <-0.16,-0.1,0> + } + + object { + Box + + texture { + Tex_Box_Metal + } + photons{ + target 1.0 + reflection on + } + + scale 0.06 + translate <-0.1,0.2,0> + } + + + translate <3.3,2.52,Table_Height> +} + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ diff --git a/samples/POV-Ray SDL/terrain.inc b/samples/POV-Ray SDL/terrain.inc new file mode 100755 index 00000000..24f8408e --- /dev/null +++ b/samples/POV-Ray SDL/terrain.inc @@ -0,0 +1,118 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Persistence of Vision Ray Tracer Include File +// File: terrain.inc +// Desc: terrain for 'balcony.pov' demonstration scene +// Date: July/August 2001 +// Auth: Christoph Hormann + +// Updated: 09Aug2008 (jh) for v3.7 distribution + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (version < 3.7) + #version 3.5; +#end + +#declare Tex_Vegetation= +texture { + pigment { + bozo + color_map { + [0.3 color rgb <0.20,0.35,0.1>*0.9 ] + [0.8 color rgb <0.12,0.35,0.1>*0.7 ] + } + scale 4 + } + finish { + ambient 0.0 + diffuse 0.5 + brilliance 0.8 + specular 0.1 + } + normal { + granite 0.4 + } +} + +#declare Tex_Stone= +texture { + pigment { + color rgb <0.6,0.6,0.6> + } + finish { + ambient 0.0//0.1 + diffuse 0.45 + specular 0.15 + } +} + +#declare Tex_Terrain= +texture { + slope -z + texture_map { + [0.34 Tex_Vegetation ] + [0.34 Tex_Stone ] + } +} + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + + + +#declare Terrain= +object { + height_field { + + function 300,300 { + pigment { + function { 1-(min(pow(x*x + z*z,1.3), 1) -0.0001) } + color_map { + [0.0 color rgb 0.0] + [1.0 color rgb 1.0] + } + scale 0.35 + translate <0.5,0,0.5> + + warp { turbulence 0.3 } + + scale 3 + warp { turbulence 0.4 lambda 2.2 octaves 8 } + scale 1/3 + + rotate -90*x + translate -0.5*y + scale <1, -1, 1> + translate 0.5*y + } + } + + water_level 0.02 + + rotate 90*x + rotate -10*z + + scale <4, 4, 1> + scale 30 + } +} + + +union { + object { + Terrain + translate <130, 368, -10> + } + + object { + Terrain + rotate -180*z + scale 0.3 + translate <90, 97, -6> + } + texture { Tex_Terrain } +} + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ diff --git a/samples/POV-Ray SDL/water.inc b/samples/POV-Ray SDL/water.inc new file mode 100755 index 00000000..14facf30 --- /dev/null +++ b/samples/POV-Ray SDL/water.inc @@ -0,0 +1,74 @@ +// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License. +// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a +// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA. + +// Persistence Of Vision Ray Tracer Include File +// File: water.inc +// Desc: water for 'balcony.pov' demonstration scene +// Date: July/August 2001 +// Auth: Christoph Hormann + +// Updated: 09Aug2008 (jh) for v3.7 distribution + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ + +#if (version < 3.7) + #version 3.5; +#end + +#include "functions.inc" + +#declare RMF=function{ f_ridged_mf(x, y, z, 0.07, 2.2, 7, 0.6, 0.9, 1)} + +#declare M_Watx4 = +material { + texture { + pigment { + color rgbt <0.2, 0.22, 0.21, 0.94> + } + finish { + diffuse 0.0 + ambient -0.2 + + reflection { + 0.0, 0.95 + fresnel on + } + + conserve_energy + + specular 0.4 + roughness 0.007 + } + normal{ + function { RMF(x, y, z) } 0.8 + scale 0.3 + } + } + interior { + ior 1.31 + fade_distance 5 + fade_power 1001.0 + fade_color <0.02, 0.20, 0.06> + } +} + +plane { + z, -1 + material { + M_Watx4 + } + hollow on +} + +plane { + z, -12.0 + + texture { + pigment { color rgb 0 } + finish { ambient 0.0 diffuse 0.0 } + } + hollow on +} + +/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/ From 51d6d741e5e1132feabf84551d6a39eb67c969d6 Mon Sep 17 00:00:00 2001 From: Christoph Lipka Date: Sun, 10 Jan 2016 20:11:26 +0100 Subject: [PATCH 137/205] Fixed ordering of POV-Ray SDL in `languages.yml` --- lib/linguist/languages.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 8baabdbd..c2974906 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2542,6 +2542,15 @@ PLpgSQL: extensions: - .sql +POV-Ray SDL: + type: programming + aliases: + - pov-ray + - povray + extensions: + - .pov + - .inc + Pan: type: programming color: '#cc0000' @@ -2711,15 +2720,6 @@ PostScript: aliases: - postscr ace_mode: text - -POV-Ray SDL: - type: programming - aliases: - - pov-ray - - povray - extensions: - - .pov - - .inc PowerShell: type: programming From 06af36dac2b367e01a703905082af8f290566837 Mon Sep 17 00:00:00 2001 From: Christoph Lipka Date: Sun, 10 Jan 2016 20:23:09 +0100 Subject: [PATCH 138/205] Fixed POV-Ray SDL entry in `grammars.yml` and Ace mode in `languages.yml` --- grammars.yml | 2 +- lib/linguist/languages.yml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) mode change 100644 => 100755 grammars.yml diff --git a/grammars.yml b/grammars.yml old mode 100644 new mode 100755 index 0ad993fc..a8882b15 --- a/grammars.yml +++ b/grammars.yml @@ -359,7 +359,7 @@ vendor/grammars/language-maxscript: vendor/grammars/language-ncl: - source.ncl vendor/grammars/language-povray: -- source.povray +- source.pov-ray sdl vendor/grammars/language-python: - text.python.console - text.python.traceback diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index c2974906..383cff72 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2550,6 +2550,7 @@ POV-Ray SDL: extensions: - .pov - .inc + ace_mode: text Pan: type: programming From 9d11128362f86218a3b8e6f081dda66bcaaf9ba6 Mon Sep 17 00:00:00 2001 From: Christoph Lipka Date: Sun, 10 Jan 2016 21:24:02 +0100 Subject: [PATCH 140/205] Updated POV-Ray SDL grammar sub-project --- vendor/grammars/language-povray | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/grammars/language-povray b/vendor/grammars/language-povray index f5c6de81..35b37059 160000 --- a/vendor/grammars/language-povray +++ b/vendor/grammars/language-povray @@ -1 +1 @@ -Subproject commit f5c6de8132fc01bd2274bf15e006bb4e3da7d710 +Subproject commit 35b3705991820b12f9280d8a5ced1cdad5c9f68f From 0b9897db1f83248b5252536ba4cd5cc5a804a375 Mon Sep 17 00:00:00 2001 From: Robert Clipsham Date: Mon, 11 Jan 2016 19:15:01 +0000 Subject: [PATCH 141/205] Support .rs.in as a file extension for Rust files. When using syntax extensions in stable or beta Rust channels using the syntex package, it is common to use the file extension .rs.in for the source file, and .rs for the generated file. --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index fe3ed9aa..a94d48e8 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3081,6 +3081,7 @@ Rust: color: "#dea584" extensions: - .rs + - .rs.in ace_mode: rust SAS: From 49254f1f749b7fb21fea5d65c39f429e3756a655 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Fri, 15 Jan 2016 09:19:24 -0500 Subject: [PATCH 142/205] Grammar update --- vendor/grammars/AutoHotkey | 2 +- vendor/grammars/SublimePapyrus | 2 +- vendor/grammars/factor | 2 +- vendor/grammars/html.tmbundle | 2 +- vendor/grammars/language-babel | 2 +- vendor/grammars/language-gfm | 2 +- vendor/grammars/language-inform7 | 2 +- vendor/grammars/language-python | 2 +- vendor/grammars/latex.tmbundle | 2 +- vendor/grammars/sql.tmbundle | 2 +- vendor/grammars/sublime-typescript | 2 +- vendor/grammars/swift.tmbundle | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/vendor/grammars/AutoHotkey b/vendor/grammars/AutoHotkey index 77b8f2d7..4da62de2 160000 --- a/vendor/grammars/AutoHotkey +++ b/vendor/grammars/AutoHotkey @@ -1 +1 @@ -Subproject commit 77b8f2d7857e9251e3a6b9047f3eca5f76f0be43 +Subproject commit 4da62de23dc705bf9b95e76cf5e8e51aa1e68fea diff --git a/vendor/grammars/SublimePapyrus b/vendor/grammars/SublimePapyrus index 75d567dc..293a45f6 160000 --- a/vendor/grammars/SublimePapyrus +++ b/vendor/grammars/SublimePapyrus @@ -1 +1 @@ -Subproject commit 75d567dc3a890acbc6edebedad2879b0af426766 +Subproject commit 293a45f665de3fb4e1eaaf37bf152b3861a70d7a diff --git a/vendor/grammars/factor b/vendor/grammars/factor index 7b289493..fffb5014 160000 --- a/vendor/grammars/factor +++ b/vendor/grammars/factor @@ -1 +1 @@ -Subproject commit 7b289493316955db1649eb2745a2db7a78a4c9f9 +Subproject commit fffb501486083871377237b9320159de140a943a diff --git a/vendor/grammars/html.tmbundle b/vendor/grammars/html.tmbundle index 36b90bc1..58640721 160000 --- a/vendor/grammars/html.tmbundle +++ b/vendor/grammars/html.tmbundle @@ -1 +1 @@ -Subproject commit 36b90bc113cdd59dcaeb0885103f9b6a773939e1 +Subproject commit 58640721ca0ea5210786086940f789c299366791 diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel index 20c649bc..e63e3e29 160000 --- a/vendor/grammars/language-babel +++ b/vendor/grammars/language-babel @@ -1 +1 @@ -Subproject commit 20c649bcc79b9fd9a72e4b6e1fa11e14d553a9d8 +Subproject commit e63e3e29e93327e1d0979e3acb37a0e2acc463c0 diff --git a/vendor/grammars/language-gfm b/vendor/grammars/language-gfm index e5b24d57..6b60f7d8 160000 --- a/vendor/grammars/language-gfm +++ b/vendor/grammars/language-gfm @@ -1 +1 @@ -Subproject commit e5b24d57e73463f747fae061d6e9d59a74b9f927 +Subproject commit 6b60f7d89bb7afc67640d46eb8a7cc83e266b30d diff --git a/vendor/grammars/language-inform7 b/vendor/grammars/language-inform7 index b953a1ef..857864cd 160000 --- a/vendor/grammars/language-inform7 +++ b/vendor/grammars/language-inform7 @@ -1 +1 @@ -Subproject commit b953a1efedcff21091ba3b7e7fbcd1040c1f02bb +Subproject commit 857864cd812279672284f424da4f65e3c81b6c87 diff --git a/vendor/grammars/language-python b/vendor/grammars/language-python index cdb699e7..75f0d2b0 160000 --- a/vendor/grammars/language-python +++ b/vendor/grammars/language-python @@ -1 +1 @@ -Subproject commit cdb699e7a86fd9f9f84ae561abddb696aad777aa +Subproject commit 75f0d2b06122a51db6e8e0b129b57585cd68f99c diff --git a/vendor/grammars/latex.tmbundle b/vendor/grammars/latex.tmbundle index 3be8cd92..ed94d309 160000 --- a/vendor/grammars/latex.tmbundle +++ b/vendor/grammars/latex.tmbundle @@ -1 +1 @@ -Subproject commit 3be8cd9208fb2aa5e9fe4ebd0074f55433bca7e0 +Subproject commit ed94d3091501cfc6d9aa293ea241d1c0ad6c6395 diff --git a/vendor/grammars/sql.tmbundle b/vendor/grammars/sql.tmbundle index 1fd3f03f..6d4edbc1 160000 --- a/vendor/grammars/sql.tmbundle +++ b/vendor/grammars/sql.tmbundle @@ -1 +1 @@ -Subproject commit 1fd3f03f97e37fde2c7f2dd4c11728a19242d320 +Subproject commit 6d4edbc113d3272f7c097d6b1504624289ee2bc5 diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript index d2c76b8c..0504a558 160000 --- a/vendor/grammars/sublime-typescript +++ b/vendor/grammars/sublime-typescript @@ -1 +1 @@ -Subproject commit d2c76b8c8262c9a848d4814662a0c8e13d1e2a6a +Subproject commit 0504a5582b6e5d814630259c87f2d8f8e6027c47 diff --git a/vendor/grammars/swift.tmbundle b/vendor/grammars/swift.tmbundle index e6375f4d..f5ce5833 160000 --- a/vendor/grammars/swift.tmbundle +++ b/vendor/grammars/swift.tmbundle @@ -1 +1 @@ -Subproject commit e6375f4dbb9c5a715e1924b1e9fc1056f0b3dee7 +Subproject commit f5ce5833a914f71aa1ab7df0a262104acd3436ef From 77dfb19a5017dcff22d223f922f7dc193031aa1a Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Fri, 15 Jan 2016 09:21:43 -0500 Subject: [PATCH 143/205] Bumping to v4.7.4 --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index b389c1c9..ba44bb5b 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.7.3" + VERSION = "4.7.4" end From d8666e53093f84e3cb0d9b253005b15081e5a7ab Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sat, 16 Jan 2016 11:21:26 +0100 Subject: [PATCH 144/205] Heuristic for Pod vs. Perl .pod files classified as Pod if they contain any Pod syntax --- lib/linguist/heuristics.rb | 8 ++++++++ samples/Perl/Sample.pod | 10 ++++++++++ samples/{Perl => Pod}/PSGI.pod | 0 test/test_heuristics.rb | 8 ++++++++ 4 files changed, 26 insertions(+) create mode 100644 samples/Perl/Sample.pod rename samples/{Perl => Pod}/PSGI.pod (100%) diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 01be4e33..0806ce1f 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -293,6 +293,14 @@ module Linguist end end + disambiguate ".pod" do |data| + if /^=\w+$/.match(data) + Language["Pod"] + else + Language["Perl"] + end + end + disambiguate ".pro" do |data| if /^[^#]+:-/.match(data) Language["Prolog"] diff --git a/samples/Perl/Sample.pod b/samples/Perl/Sample.pod new file mode 100644 index 00000000..00fa0b99 --- /dev/null +++ b/samples/Perl/Sample.pod @@ -0,0 +1,10 @@ +use strict; +use warnings; +package DZT::Sample; + +sub return_arrayref_of_values_passed { + my $invocant = shift; + return \@_; +} + +1; diff --git a/samples/Perl/PSGI.pod b/samples/Pod/PSGI.pod similarity index 100% rename from samples/Perl/PSGI.pod rename to samples/Pod/PSGI.pod diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index 524a522a..702320e9 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -155,6 +155,14 @@ class TestHeuristcs < Minitest::Test }) end + # Candidate languages = ["Pod", "Perl"] + def test_pod_by_heuristics + assert_heuristics({ + "Perl" => all_fixtures("Perl", "*.pod"), + "Pod" => all_fixtures("Pod", "*.pod") + }) + end + # Candidate languages = ["IDL", "Prolog", "QMake", "INI"] def test_pro_by_heuristics assert_heuristics({ From d87fad649c32be985a6a009bf117ad26e7314daf Mon Sep 17 00:00:00 2001 From: chrisarcand Date: Sat, 16 Jan 2016 07:50:55 -0500 Subject: [PATCH 145/205] Improved vim modeline detection TLDR: This greatly increases the flexibility of vim modeline detection to manually set the language of a file. In vim there are two forms of modelines: [text]{white}{vi:|vim:|ex:}[white]{options} examples: 'vim: syntax=perl', 'ex: filetype=ruby' -and- [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text] examples: 'vim set syntax=perl:', 'Vim: se ft=ruby:' As you can see, there are many combinations. These changes should allow most combinations to be used. The two most important additions are the use of the keyword 'syntax', as well as the addition of the first form (you now no longer need to use the keyword 'set' with a colon at the end). The use of first form with 'syntax' is very, very common across GitHub: https://github.com/search?l=ruby&q=vim%3A+syntax%3D&ref=searchresults&type=Code&utf8=%E2%9C%93 --- README.md | 3 +++ lib/linguist/strategy/modeline.rb | 17 ++++++++++++++--- test/fixtures/Data/Modelines/ruby4 | 3 +++ test/fixtures/Data/Modelines/ruby5 | 3 +++ test/fixtures/Data/Modelines/ruby6 | 3 +++ test/fixtures/Data/Modelines/ruby7 | 3 +++ test/fixtures/Data/Modelines/ruby8 | 3 +++ test/fixtures/Data/Modelines/ruby9 | 3 +++ test/test_modelines.rb | 6 ++++++ 9 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/Data/Modelines/ruby4 create mode 100644 test/fixtures/Data/Modelines/ruby5 create mode 100644 test/fixtures/Data/Modelines/ruby6 create mode 100644 test/fixtures/Data/Modelines/ruby7 create mode 100644 test/fixtures/Data/Modelines/ruby8 create mode 100644 test/fixtures/Data/Modelines/ruby9 diff --git a/README.md b/README.md index 36bcbd50..2d661ef9 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,9 @@ Alternatively, you can use Vim or Emacs style modelines to set the language for ##### Vim ``` +# Some examples of various styles: +vim: syntax=java +vim: set syntax=ruby: vim: set filetype=prolog: vim: set ft=cpp: ``` diff --git a/lib/linguist/strategy/modeline.rb b/lib/linguist/strategy/modeline.rb index f995d940..ece98a1f 100644 --- a/lib/linguist/strategy/modeline.rb +++ b/lib/linguist/strategy/modeline.rb @@ -1,8 +1,19 @@ module Linguist module Strategy class Modeline - EmacsModeline = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i - VimModeline = /vim:\s*set.*\s(?:ft|filetype)=(\w+)\s?.*:/i + EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i + + # First form vim modeline + # [text]{white}{vi:|vim:|ex:}[white]{options} + # ex: 'vim: syntax=perl' + VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i + + # Second form vim modeline (compatible with some versions of Vi) + # [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text] + # ex: 'vim set syntax=perl:' + VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i + + MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2] # Public: Detects language based on Vim and Emacs modelines # @@ -22,7 +33,7 @@ module Linguist # # Returns a String or nil def self.modeline(data) - match = data.match(EmacsModeline) || data.match(VimModeline) + match = MODELINES.map { |regex| data.match(regex) }.reject(&:nil?).first match[1] if match end end diff --git a/test/fixtures/Data/Modelines/ruby4 b/test/fixtures/Data/Modelines/ruby4 new file mode 100644 index 00000000..e3b50151 --- /dev/null +++ b/test/fixtures/Data/Modelines/ruby4 @@ -0,0 +1,3 @@ +# vim: filetype=ruby + +# I am Ruby diff --git a/test/fixtures/Data/Modelines/ruby5 b/test/fixtures/Data/Modelines/ruby5 new file mode 100644 index 00000000..10349050 --- /dev/null +++ b/test/fixtures/Data/Modelines/ruby5 @@ -0,0 +1,3 @@ +# vim: ft=ruby + +# I am Ruby diff --git a/test/fixtures/Data/Modelines/ruby6 b/test/fixtures/Data/Modelines/ruby6 new file mode 100644 index 00000000..a2b49dae --- /dev/null +++ b/test/fixtures/Data/Modelines/ruby6 @@ -0,0 +1,3 @@ +# vim: syntax=Ruby + +# I am Ruby diff --git a/test/fixtures/Data/Modelines/ruby7 b/test/fixtures/Data/Modelines/ruby7 new file mode 100644 index 00000000..1ed5b28f --- /dev/null +++ b/test/fixtures/Data/Modelines/ruby7 @@ -0,0 +1,3 @@ +# vim: se syntax=ruby: + +# I am Ruby diff --git a/test/fixtures/Data/Modelines/ruby8 b/test/fixtures/Data/Modelines/ruby8 new file mode 100644 index 00000000..8e854741 --- /dev/null +++ b/test/fixtures/Data/Modelines/ruby8 @@ -0,0 +1,3 @@ +# vim: set syntax=ruby: + +# I am Ruby diff --git a/test/fixtures/Data/Modelines/ruby9 b/test/fixtures/Data/Modelines/ruby9 new file mode 100644 index 00000000..ac82358d --- /dev/null +++ b/test/fixtures/Data/Modelines/ruby9 @@ -0,0 +1,3 @@ +# ex: syntax=ruby + +# I am Ruby diff --git a/test/test_modelines.rb b/test/test_modelines.rb index fd259782..85718955 100644 --- a/test/test_modelines.rb +++ b/test/test_modelines.rb @@ -11,6 +11,12 @@ class TestModelines < Minitest::Test assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby") assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby2") assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby3") + assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby4") + assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby5") + assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby6") + assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby7") + assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby8") + assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby9") assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplus") assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs1") assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs2") From 52938f6dbf65d317c5074933319f2309e2557d99 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sun, 17 Jan 2016 18:14:51 +0100 Subject: [PATCH 146/205] Test submodules are using HTTPS links --- test/test_grammars.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/test_grammars.rb b/test/test_grammars.rb index a2ad1e53..29211cc2 100644 --- a/test/test_grammars.rb +++ b/test/test_grammars.rb @@ -113,6 +113,20 @@ class TestGrammars < Minitest::Test assert_equal [], licensed, msg end + def test_submodules_use_https_links + File.open(".gitmodules", "r") do |fh| + ssh_submodules = [] + fh.each_line do |line| + if matches = line.match(/url = (git@.*)/) + submodule_link = matches.captures[0] + ssh_submodules.push(submodule_link) + end + end + msg = "The following submodules don't have an HTTPS link:\n* #{ssh_submodules.join("\n* ")}" + assert_equal [], ssh_submodules, msg + end + end + private def submodule_paths From df88de14e3135915181370d8c421be7cc73be8ef Mon Sep 17 00:00:00 2001 From: James Ko Date: Wed, 20 Jan 2016 19:01:19 -0500 Subject: [PATCH 147/205] Add .xproj to list of XML extensions --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index fe3ed9aa..c4fb0a4c 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3797,6 +3797,7 @@ XML: - .xliff - .xmi - .xml.dist + - .xproj - .xsd - .xul - .zcml From e32a837fb2a506164bec324074fb02dc47f2e63e Mon Sep 17 00:00:00 2001 From: Bayu Aldi Yansyah Date: Thu, 28 Jan 2016 10:52:03 +0700 Subject: [PATCH 148/205] languages.yml: add Terra --- lib/linguist/languages.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 1f411637..18e98a38 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3508,6 +3508,16 @@ Tea: tm_scope: source.tea ace_mode: text +Terra: + type: programming + extensions: + - .t + color: "#0077AA" + ace_mode: lua + group: Lua + interpreters: + - lua + Text: type: prose wrap: true From 9b8b39f4449e324ca283f52ea4a09709205b4bff Mon Sep 17 00:00:00 2001 From: Bayu Aldi Yansyah Date: Thu, 28 Jan 2016 11:22:27 +0700 Subject: [PATCH 149/205] samples: add Terra samples source: https://github.com/zdevito/terra/tree/master/tests --- samples/Terra/abouttocompile.t | 22 ++ samples/Terra/addlanguage1.t | 17 + samples/Terra/aggregatearr.t | 18 + samples/Terra/ainline.t | 24 ++ samples/Terra/alignment.t | 7 + samples/Terra/and.t | 9 + samples/Terra/anon.t | 26 ++ samples/Terra/anon3.t | 18 + samples/Terra/anonstruct.t | 12 + samples/Terra/anonstruct2.t | 7 + samples/Terra/antiquote1.t | 12 + samples/Terra/antiquote2.t | 13 + samples/Terra/antiquote3.t | 16 + samples/Terra/antiquote4.t | 11 + samples/Terra/antiquote5.t | 21 + samples/Terra/arith.t | 114 ++++++ samples/Terra/array.t | 60 +++ samples/Terra/arraylit.t | 29 ++ samples/Terra/arrayt.t | 75 ++++ samples/Terra/arrayt2.t | 82 ++++ samples/Terra/arrptr.t | 5 + samples/Terra/asm.t | 28 ++ samples/Terra/atoi.t | 7 + samples/Terra/avxhadd.t | 32 ++ samples/Terra/badname.t | 4 + samples/Terra/benchmark_fannkuchredux.t | 148 +++++++ samples/Terra/benchmark_nbody.t | 150 ++++++++ samples/Terra/bf.t | 60 +++ samples/Terra/blankexp.t | 7 + samples/Terra/blockescape.t | 23 ++ samples/Terra/blocking.t | 57 +++ samples/Terra/blocking2-fixed.t | 68 ++++ samples/Terra/blocking2.t | 81 ++++ samples/Terra/blocking3.t | 85 +++++ samples/Terra/bounce.t | 23 ++ samples/Terra/bug.t | 20 + samples/Terra/bug2.t | 20 + samples/Terra/bug3.t | 15 + samples/Terra/bug4.t | 14 + samples/Terra/calc.t | 33 ++ samples/Terra/call.t | 53 +++ samples/Terra/callbackcache.t | 9 + samples/Terra/canon.t | 45 +++ samples/Terra/canon2.t | 41 ++ samples/Terra/cast.t | 11 + samples/Terra/cbool.t | 13 + samples/Terra/cconv.t | 488 ++++++++++++++++++++++++ samples/Terra/cfgbug.t | 14 + samples/Terra/clanginfo.t | 1 + samples/Terra/class.t | 235 ++++++++++++ samples/Terra/class2.t | 45 +++ samples/Terra/class3.t | 36 ++ samples/Terra/class4.t | 22 ++ samples/Terra/class5.t | 54 +++ samples/Terra/class6.t | 66 ++++ samples/Terra/classifyfloatstructs.t | 137 +++++++ samples/Terra/clean.t | 17 + samples/Terra/cnames.t | 25 ++ samples/Terra/cnamespace.t | 24 ++ samples/Terra/cnamespaces.t | 32 ++ samples/Terra/compilecallback.t | 16 + samples/Terra/completec.t | 13 + samples/Terra/conflict.t | 12 + samples/Terra/constant.t | 35 ++ samples/Terra/constant2.t | 21 + samples/Terra/constructor.t | 12 + samples/Terra/coverage.t | 47 +++ samples/Terra/coverage2.t | 209 ++++++++++ samples/Terra/coverage3.t | 107 ++++++ samples/Terra/crash1.t | 1 + samples/Terra/crash2.t | 1 + samples/Terra/cstruct.t | 20 + samples/Terra/cstruct2.t | 8 + samples/Terra/cudaagg.t | 56 +++ samples/Terra/cudaaggregate.t | 45 +++ samples/Terra/cudaatomic.t | 39 ++ samples/Terra/cudaconst2.t | 14 + samples/Terra/cudaglobal.t | 48 +++ samples/Terra/cudahello.t | 30 ++ samples/Terra/cudaoffline.t | 65 ++++ samples/Terra/cudaoo.t | 20 + samples/Terra/cudaprintf.t | 50 +++ samples/Terra/cudashared.t | 47 +++ samples/Terra/cudatest.t | 47 +++ samples/Terra/cudatex.t | 59 +++ samples/Terra/cunion.t | 34 ++ samples/Terra/cunion2.t | 35 ++ samples/Terra/customline.t | 10 + samples/Terra/customtable.t | 10 + samples/Terra/cvar.t | 9 + samples/Terra/debugcallback.t | 23 ++ samples/Terra/declerrors.t | 29 ++ samples/Terra/decltwice.t | 18 + samples/Terra/def1.t | 16 + samples/Terra/defaultoperator.t | 9 + samples/Terra/defer.t | 111 ++++++ samples/Terra/deferbreak.t | 35 ++ samples/Terra/defercond.t | 82 ++++ samples/Terra/defergoto.t | 35 ++ samples/Terra/dgemm.t | 143 +++++++ samples/Terra/dgemm2.t | 163 ++++++++ samples/Terra/dgemm3.t | 213 +++++++++++ samples/Terra/dgemmpaper.t | 75 ++++ samples/Terra/diffuse.t | 237 ++++++++++++ samples/Terra/dynlib.t | 47 +++ samples/Terra/eager.t | 10 + samples/Terra/empty.t | 0 samples/Terra/emptycalls.t | 31 ++ samples/Terra/emptyname.t | 5 + samples/Terra/emptystruct.t | 30 ++ samples/Terra/enumc.t | 14 + samples/Terra/evenodd.t | 20 + samples/Terra/examplecompiler1.t | 41 ++ samples/Terra/examplelanguage1.t | 7 + samples/Terra/exampleparser1.t | 22 ++ samples/Terra/exittest.t | 9 + samples/Terra/explicitcast.t | 11 + samples/Terra/exportdynamic.t | 9 + samples/Terra/expvec.t | 34 ++ samples/Terra/f2.t | 17 + samples/Terra/fact.t | 16 + samples/Terra/fakeasm.t | 31 ++ samples/Terra/falsespec.t | 8 + samples/Terra/fastcall.t | 24 ++ samples/Terra/fib.t | 26 ++ samples/Terra/fib2.t | 27 ++ samples/Terra/fnames.t | 5 + samples/Terra/fncalltest.t | 16 + samples/Terra/fnpointer.t | 24 ++ samples/Terra/fnptr.t | 7 + samples/Terra/fnptrc.t | 25 ++ samples/Terra/foo.t | 1 + samples/Terra/for.t | 31 ++ samples/Terra/for2.t | 31 ++ samples/Terra/forbreak.t | 17 + samples/Terra/forlist.t | 24 ++ samples/Terra/forlist2.t | 37 ++ samples/Terra/forp.t | 21 + samples/Terra/forsym.t | 24 ++ samples/Terra/forwardtodef.t | 7 + samples/Terra/functionnoproto.t | 6 + samples/Terra/gctest.t | 18 + samples/Terra/gemm.t | 207 ++++++++++ samples/Terra/getmethod.t | 19 + samples/Terra/gettype.t | 18 + samples/Terra/globals.t | 26 ++ samples/Terra/goto.t | 16 + samples/Terra/goto2.t | 18 + samples/Terra/gvarfault.t | 24 ++ samples/Terra/hasbeenfrozen.t | 33 ++ samples/Terra/hello.t | 8 + samples/Terra/hello2.t | 10 + samples/Terra/hexf.t | 9 + samples/Terra/huge.t | 7 + samples/Terra/ifelse.t | 17 + samples/Terra/includec.t | 42 ++ samples/Terra/includetwice.t | 21 + samples/Terra/incomplete.t | 32 ++ samples/Terra/incomplete2.t | 25 ++ samples/Terra/incomplete3.t | 29 ++ samples/Terra/incomplete4.t | 22 ++ samples/Terra/incomplete5.t | 65 ++++ samples/Terra/incompletetypetest.t | 13 + samples/Terra/incompletetypetest2.t | 13 + samples/Terra/incompletetypetest3.t | 13 + samples/Terra/indexing64.t | 10 + samples/Terra/indexingbug.t | 31 ++ samples/Terra/interface.t | 33 ++ samples/Terra/interface2.t | 38 ++ samples/Terra/intrinsic.t | 21 + samples/Terra/isvolatile.t | 7 + samples/Terra/labelbug.t | 5 + samples/Terra/latelink.t | 24 ++ samples/Terra/lazycstring.t | 21 + samples/Terra/lazylog.t | 61 +++ samples/Terra/leaktest.t | 27 ++ samples/Terra/let1.t | 15 + samples/Terra/let2.t | 64 ++++ samples/Terra/linkllvm.t | 13 + samples/Terra/localenv.t | 46 +++ samples/Terra/localenv2.t | 7 + samples/Terra/logical.t | 33 ++ samples/Terra/luabridge.t | 18 + samples/Terra/luabridge2.t | 92 +++++ samples/Terra/luabridgefn.t | 23 ++ samples/Terra/luabridgerec.t | 10 + samples/Terra/luabridgeunion.t | 14 + samples/Terra/luaterramethod.t | 40 ++ samples/Terra/lvaluepointer.t | 10 + samples/Terra/lvaluequote.t | 22 ++ samples/Terra/lvaluetreelist.t | 9 + samples/Terra/macro.t | 50 +++ samples/Terra/macro2.t | 14 + samples/Terra/macro3.t | 14 + samples/Terra/macrokey.t | 9 + samples/Terra/macrolet.t | 17 + samples/Terra/macroselect.t | 11 + samples/Terra/macrotest.t | 9 + samples/Terra/malloc.t | 23 ++ samples/Terra/mathlib.t | 9 + samples/Terra/metatype.t | 16 + samples/Terra/method.t | 42 ++ samples/Terra/methodantiquote.t | 18 + samples/Terra/methodmissing.t | 17 + samples/Terra/methodrvalue.t | 18 + samples/Terra/methodsugar.t | 15 + samples/Terra/missingfields.t | 14 + samples/Terra/mixed.t | 13 + samples/Terra/multiconstructor.t | 17 + samples/Terra/multimacro.t | 17 + samples/Terra/multiterra.t | 79 ++++ samples/Terra/names.t | 16 + samples/Terra/nestedcalls.t | 11 + samples/Terra/nestextract.t | 40 ++ samples/Terra/nestnoerror.t | 17 + samples/Terra/new.t | 14 + samples/Terra/nillocal.t | 6 + samples/Terra/niltype.t | 9 + samples/Terra/nojit.t | 20 + samples/Terra/nolengthop.t | 2 + samples/Terra/nonprototypec.t | 12 + samples/Terra/nontemporal.t | 7 + samples/Terra/numliteral.t | 14 + samples/Terra/objc.t | 25 ++ samples/Terra/objc2.t | 42 ++ samples/Terra/objtest.t | 45 +++ samples/Terra/offsetcalc.t | 33 ++ samples/Terra/opaquealloc.t | 19 + samples/Terra/or.t | 9 + samples/Terra/ordercomplete.t | 25 ++ samples/Terra/output.t | 16 + samples/Terra/overload.t | 17 + samples/Terra/overload2.t | 15 + samples/Terra/overload3.t | 15 + samples/Terra/overloadcall.t | 12 + samples/Terra/overloadmethod.t | 24 ++ samples/Terra/overloadmethod2.t | 17 + samples/Terra/overloadmethod3.t | 18 + samples/Terra/overloadproduct.t | 65 ++++ samples/Terra/overloadrecv.t | 20 + samples/Terra/painfulrecstruct.t | 22 ++ samples/Terra/paren.t | 5 + samples/Terra/parsecrash.t | 7 + samples/Terra/parsefail.t | 35 ++ samples/Terra/parsefail2.t | 5 + samples/Terra/pattern.t | 43 +++ samples/Terra/point.t | 13 + samples/Terra/pointerarith.t | 31 ++ samples/Terra/pointerlike.t | 7 + samples/Terra/pow.t | 28 ++ samples/Terra/ppltalk.t | 18 + samples/Terra/ppnil.t | 4 + samples/Terra/pratttest1.t | 4 + samples/Terra/prec.t | 4 + samples/Terra/prec2.t | 2 + samples/Terra/pretty.t | 69 ++++ samples/Terra/printd.t | 5 + samples/Terra/printfarray.t | 12 + samples/Terra/printfloat.t | 7 + samples/Terra/proxystruct.t | 19 + samples/Terra/pt.t | 18 + samples/Terra/pthreads.t | 47 +++ samples/Terra/quote.t | 10 + samples/Terra/quote10.t | 13 + samples/Terra/quote2.t | 9 + samples/Terra/quote3.t | 13 + samples/Terra/quote4.t | 9 + samples/Terra/quote5.t | 20 + samples/Terra/quote6.t | 12 + samples/Terra/quote7.t | 23 ++ samples/Terra/quote8.t | 19 + samples/Terra/quote9.t | 19 + samples/Terra/quoteblock.t | 12 + samples/Terra/quoteenv.t | 25 ++ samples/Terra/quoteselect.t | 12 + samples/Terra/rd.t | 1 + samples/Terra/receivercasts.t | 22 ++ samples/Terra/recfn.t | 10 + samples/Terra/recoverfromerror.t | 15 + samples/Terra/recstruct.t | 33 ++ samples/Terra/recstruct2.t | 17 + samples/Terra/rename.t | 8 + samples/Terra/renaming.t | 21 + samples/Terra/requiretwice.t | 3 + samples/Terra/rvaluerecv.t | 30 ++ samples/Terra/scope.t | 13 + samples/Terra/selectoverload.t | 25 ++ samples/Terra/setname.t | 7 + samples/Terra/setter.t | 39 ++ samples/Terra/sgemm-old.t | 205 ++++++++++ samples/Terra/sgemm.t | 162 ++++++++ samples/Terra/sgemm3.t | 124 ++++++ samples/Terra/sgemmkernel.t | 164 ++++++++ samples/Terra/shallowfreeze.t | 24 ++ samples/Terra/sharedlib.t | 22 ++ samples/Terra/shift.t | 7 + samples/Terra/signext.t | 12 + samples/Terra/simple.t | 6 + samples/Terra/simpleadd.t | 15 + samples/Terra/simpleapply.t | 19 + samples/Terra/simpleglobal.t | 19 + samples/Terra/simplerec.t | 25 ++ samples/Terra/simplestruct.t | 10 + samples/Terra/simplevec.t | 12 + samples/Terra/sintable.t | 17 + samples/Terra/special.t | 61 +++ samples/Terra/speed.t | 30 ++ samples/Terra/splitprimary.t | 19 + samples/Terra/ssimple.t | 477 +++++++++++++++++++++++ samples/Terra/staticmethod.t | 9 + samples/Terra/stattest.t | 13 + samples/Terra/stencil.t | 134 +++++++ samples/Terra/strerror.t | 9 + samples/Terra/string.t | 15 + samples/Terra/struct.t | 50 +++ samples/Terra/structarg.t | 9 + samples/Terra/structcast.t | 38 ++ samples/Terra/structconstructor.t | 9 + samples/Terra/structrvalue.t | 16 + samples/Terra/structsyntax.t | 14 + samples/Terra/sugar.t | 15 + samples/Terra/sumlanguage1.t | 2 + samples/Terra/sumlanguage2.t | 4 + samples/Terra/symbolmangling.t | 4 + samples/Terra/symbolvar.t | 11 + samples/Terra/symbolvar2.t | 16 + samples/Terra/symbolvar3.t | 16 + samples/Terra/symbolvar4.t | 16 + samples/Terra/symbolvar5.t | 16 + samples/Terra/symbolvar6.t | 16 + samples/Terra/symbolvar7.t | 15 + samples/Terra/symparam.t | 9 + samples/Terra/symparam2.t | 9 + samples/Terra/symparam3.t | 15 + samples/Terra/template.t | 6 + samples/Terra/terracast.t | 15 + samples/Terra/terralua.t | 32 ++ samples/Terra/terraluamethod.t | 16 + samples/Terra/terranew.t | 19 + samples/Terra/testdebug.t | 57 +++ samples/Terra/testimport.t | 6 + samples/Terra/testlang1.t | 21 + samples/Terra/testlang2.t | 4 + samples/Terra/testlog.t | 8 + samples/Terra/testrequire.t | 14 + samples/Terra/teststd.t | 45 +++ samples/Terra/testvector.t | 57 +++ samples/Terra/torturechain.t | 67 ++++ samples/Terra/toterraexpression.t | 8 + samples/Terra/twolang.t | 23 ++ samples/Terra/typeexp.t | 9 + samples/Terra/union.t | 26 ++ samples/Terra/unm.t | 20 + samples/Terra/unpacktuple.t | 30 ++ samples/Terra/unsafesym.t | 14 + samples/Terra/unstrict.t | 5 + samples/Terra/usercast.t | 24 ++ samples/Terra/varargcstring.t | 2 + samples/Terra/vars.t | 23 ++ samples/Terra/vars2.t | 17 + samples/Terra/vec.t | 27 ++ samples/Terra/vecarith.t | 138 +++++++ samples/Terra/veclit.t | 29 ++ samples/Terra/vecobj.t | 54 +++ samples/Terra/vecptr.t | 4 + samples/Terra/vecsize.t | 5 + samples/Terra/vtablerec.t | 30 ++ samples/Terra/zeroargs.t | 5 + samples/Terra/zeroreturn.t | 18 + samples/Terra/zeroreturn2.t | 17 + 370 files changed, 11921 insertions(+) create mode 100644 samples/Terra/abouttocompile.t create mode 100755 samples/Terra/addlanguage1.t create mode 100644 samples/Terra/aggregatearr.t create mode 100644 samples/Terra/ainline.t create mode 100644 samples/Terra/alignment.t create mode 100644 samples/Terra/and.t create mode 100644 samples/Terra/anon.t create mode 100644 samples/Terra/anon3.t create mode 100644 samples/Terra/anonstruct.t create mode 100644 samples/Terra/anonstruct2.t create mode 100644 samples/Terra/antiquote1.t create mode 100644 samples/Terra/antiquote2.t create mode 100644 samples/Terra/antiquote3.t create mode 100644 samples/Terra/antiquote4.t create mode 100644 samples/Terra/antiquote5.t create mode 100644 samples/Terra/arith.t create mode 100644 samples/Terra/array.t create mode 100644 samples/Terra/arraylit.t create mode 100644 samples/Terra/arrayt.t create mode 100644 samples/Terra/arrayt2.t create mode 100644 samples/Terra/arrptr.t create mode 100644 samples/Terra/asm.t create mode 100644 samples/Terra/atoi.t create mode 100644 samples/Terra/avxhadd.t create mode 100644 samples/Terra/badname.t create mode 100644 samples/Terra/benchmark_fannkuchredux.t create mode 100644 samples/Terra/benchmark_nbody.t create mode 100644 samples/Terra/bf.t create mode 100644 samples/Terra/blankexp.t create mode 100644 samples/Terra/blockescape.t create mode 100644 samples/Terra/blocking.t create mode 100644 samples/Terra/blocking2-fixed.t create mode 100644 samples/Terra/blocking2.t create mode 100644 samples/Terra/blocking3.t create mode 100644 samples/Terra/bounce.t create mode 100644 samples/Terra/bug.t create mode 100644 samples/Terra/bug2.t create mode 100644 samples/Terra/bug3.t create mode 100644 samples/Terra/bug4.t create mode 100644 samples/Terra/calc.t create mode 100644 samples/Terra/call.t create mode 100644 samples/Terra/callbackcache.t create mode 100644 samples/Terra/canon.t create mode 100644 samples/Terra/canon2.t create mode 100644 samples/Terra/cast.t create mode 100644 samples/Terra/cbool.t create mode 100644 samples/Terra/cconv.t create mode 100644 samples/Terra/cfgbug.t create mode 100644 samples/Terra/clanginfo.t create mode 100644 samples/Terra/class.t create mode 100644 samples/Terra/class2.t create mode 100644 samples/Terra/class3.t create mode 100644 samples/Terra/class4.t create mode 100644 samples/Terra/class5.t create mode 100644 samples/Terra/class6.t create mode 100644 samples/Terra/classifyfloatstructs.t create mode 100644 samples/Terra/clean.t create mode 100644 samples/Terra/cnames.t create mode 100644 samples/Terra/cnamespace.t create mode 100644 samples/Terra/cnamespaces.t create mode 100644 samples/Terra/compilecallback.t create mode 100644 samples/Terra/completec.t create mode 100644 samples/Terra/conflict.t create mode 100644 samples/Terra/constant.t create mode 100644 samples/Terra/constant2.t create mode 100644 samples/Terra/constructor.t create mode 100644 samples/Terra/coverage.t create mode 100644 samples/Terra/coverage2.t create mode 100644 samples/Terra/coverage3.t create mode 100644 samples/Terra/crash1.t create mode 100644 samples/Terra/crash2.t create mode 100644 samples/Terra/cstruct.t create mode 100644 samples/Terra/cstruct2.t create mode 100644 samples/Terra/cudaagg.t create mode 100644 samples/Terra/cudaaggregate.t create mode 100644 samples/Terra/cudaatomic.t create mode 100644 samples/Terra/cudaconst2.t create mode 100644 samples/Terra/cudaglobal.t create mode 100644 samples/Terra/cudahello.t create mode 100644 samples/Terra/cudaoffline.t create mode 100644 samples/Terra/cudaoo.t create mode 100644 samples/Terra/cudaprintf.t create mode 100644 samples/Terra/cudashared.t create mode 100644 samples/Terra/cudatest.t create mode 100644 samples/Terra/cudatex.t create mode 100644 samples/Terra/cunion.t create mode 100644 samples/Terra/cunion2.t create mode 100644 samples/Terra/customline.t create mode 100644 samples/Terra/customtable.t create mode 100644 samples/Terra/cvar.t create mode 100644 samples/Terra/debugcallback.t create mode 100644 samples/Terra/declerrors.t create mode 100644 samples/Terra/decltwice.t create mode 100755 samples/Terra/def1.t create mode 100644 samples/Terra/defaultoperator.t create mode 100644 samples/Terra/defer.t create mode 100644 samples/Terra/deferbreak.t create mode 100644 samples/Terra/defercond.t create mode 100644 samples/Terra/defergoto.t create mode 100644 samples/Terra/dgemm.t create mode 100644 samples/Terra/dgemm2.t create mode 100644 samples/Terra/dgemm3.t create mode 100644 samples/Terra/dgemmpaper.t create mode 100644 samples/Terra/diffuse.t create mode 100644 samples/Terra/dynlib.t create mode 100644 samples/Terra/eager.t create mode 100644 samples/Terra/empty.t create mode 100644 samples/Terra/emptycalls.t create mode 100644 samples/Terra/emptyname.t create mode 100644 samples/Terra/emptystruct.t create mode 100644 samples/Terra/enumc.t create mode 100644 samples/Terra/evenodd.t create mode 100755 samples/Terra/examplecompiler1.t create mode 100755 samples/Terra/examplelanguage1.t create mode 100644 samples/Terra/exampleparser1.t create mode 100644 samples/Terra/exittest.t create mode 100644 samples/Terra/explicitcast.t create mode 100644 samples/Terra/exportdynamic.t create mode 100644 samples/Terra/expvec.t create mode 100644 samples/Terra/f2.t create mode 100644 samples/Terra/fact.t create mode 100644 samples/Terra/fakeasm.t create mode 100644 samples/Terra/falsespec.t create mode 100644 samples/Terra/fastcall.t create mode 100644 samples/Terra/fib.t create mode 100644 samples/Terra/fib2.t create mode 100644 samples/Terra/fnames.t create mode 100644 samples/Terra/fncalltest.t create mode 100644 samples/Terra/fnpointer.t create mode 100644 samples/Terra/fnptr.t create mode 100644 samples/Terra/fnptrc.t create mode 100644 samples/Terra/foo.t create mode 100644 samples/Terra/for.t create mode 100644 samples/Terra/for2.t create mode 100644 samples/Terra/forbreak.t create mode 100644 samples/Terra/forlist.t create mode 100644 samples/Terra/forlist2.t create mode 100644 samples/Terra/forp.t create mode 100644 samples/Terra/forsym.t create mode 100644 samples/Terra/forwardtodef.t create mode 100644 samples/Terra/functionnoproto.t create mode 100644 samples/Terra/gctest.t create mode 100644 samples/Terra/gemm.t create mode 100644 samples/Terra/getmethod.t create mode 100644 samples/Terra/gettype.t create mode 100644 samples/Terra/globals.t create mode 100644 samples/Terra/goto.t create mode 100644 samples/Terra/goto2.t create mode 100644 samples/Terra/gvarfault.t create mode 100644 samples/Terra/hasbeenfrozen.t create mode 100644 samples/Terra/hello.t create mode 100644 samples/Terra/hello2.t create mode 100644 samples/Terra/hexf.t create mode 100644 samples/Terra/huge.t create mode 100644 samples/Terra/ifelse.t create mode 100644 samples/Terra/includec.t create mode 100644 samples/Terra/includetwice.t create mode 100644 samples/Terra/incomplete.t create mode 100644 samples/Terra/incomplete2.t create mode 100644 samples/Terra/incomplete3.t create mode 100644 samples/Terra/incomplete4.t create mode 100644 samples/Terra/incomplete5.t create mode 100644 samples/Terra/incompletetypetest.t create mode 100644 samples/Terra/incompletetypetest2.t create mode 100644 samples/Terra/incompletetypetest3.t create mode 100644 samples/Terra/indexing64.t create mode 100644 samples/Terra/indexingbug.t create mode 100644 samples/Terra/interface.t create mode 100644 samples/Terra/interface2.t create mode 100644 samples/Terra/intrinsic.t create mode 100644 samples/Terra/isvolatile.t create mode 100644 samples/Terra/labelbug.t create mode 100644 samples/Terra/latelink.t create mode 100644 samples/Terra/lazycstring.t create mode 100644 samples/Terra/lazylog.t create mode 100644 samples/Terra/leaktest.t create mode 100644 samples/Terra/let1.t create mode 100644 samples/Terra/let2.t create mode 100644 samples/Terra/linkllvm.t create mode 100644 samples/Terra/localenv.t create mode 100644 samples/Terra/localenv2.t create mode 100644 samples/Terra/logical.t create mode 100644 samples/Terra/luabridge.t create mode 100644 samples/Terra/luabridge2.t create mode 100644 samples/Terra/luabridgefn.t create mode 100644 samples/Terra/luabridgerec.t create mode 100644 samples/Terra/luabridgeunion.t create mode 100644 samples/Terra/luaterramethod.t create mode 100644 samples/Terra/lvaluepointer.t create mode 100644 samples/Terra/lvaluequote.t create mode 100644 samples/Terra/lvaluetreelist.t create mode 100644 samples/Terra/macro.t create mode 100644 samples/Terra/macro2.t create mode 100644 samples/Terra/macro3.t create mode 100644 samples/Terra/macrokey.t create mode 100644 samples/Terra/macrolet.t create mode 100644 samples/Terra/macroselect.t create mode 100644 samples/Terra/macrotest.t create mode 100644 samples/Terra/malloc.t create mode 100644 samples/Terra/mathlib.t create mode 100644 samples/Terra/metatype.t create mode 100644 samples/Terra/method.t create mode 100644 samples/Terra/methodantiquote.t create mode 100644 samples/Terra/methodmissing.t create mode 100644 samples/Terra/methodrvalue.t create mode 100644 samples/Terra/methodsugar.t create mode 100644 samples/Terra/missingfields.t create mode 100644 samples/Terra/mixed.t create mode 100644 samples/Terra/multiconstructor.t create mode 100644 samples/Terra/multimacro.t create mode 100644 samples/Terra/multiterra.t create mode 100644 samples/Terra/names.t create mode 100644 samples/Terra/nestedcalls.t create mode 100644 samples/Terra/nestextract.t create mode 100644 samples/Terra/nestnoerror.t create mode 100644 samples/Terra/new.t create mode 100644 samples/Terra/nillocal.t create mode 100644 samples/Terra/niltype.t create mode 100644 samples/Terra/nojit.t create mode 100644 samples/Terra/nolengthop.t create mode 100644 samples/Terra/nonprototypec.t create mode 100644 samples/Terra/nontemporal.t create mode 100644 samples/Terra/numliteral.t create mode 100644 samples/Terra/objc.t create mode 100644 samples/Terra/objc2.t create mode 100644 samples/Terra/objtest.t create mode 100644 samples/Terra/offsetcalc.t create mode 100644 samples/Terra/opaquealloc.t create mode 100644 samples/Terra/or.t create mode 100644 samples/Terra/ordercomplete.t create mode 100644 samples/Terra/output.t create mode 100644 samples/Terra/overload.t create mode 100644 samples/Terra/overload2.t create mode 100644 samples/Terra/overload3.t create mode 100644 samples/Terra/overloadcall.t create mode 100644 samples/Terra/overloadmethod.t create mode 100644 samples/Terra/overloadmethod2.t create mode 100644 samples/Terra/overloadmethod3.t create mode 100644 samples/Terra/overloadproduct.t create mode 100644 samples/Terra/overloadrecv.t create mode 100644 samples/Terra/painfulrecstruct.t create mode 100644 samples/Terra/paren.t create mode 100644 samples/Terra/parsecrash.t create mode 100644 samples/Terra/parsefail.t create mode 100644 samples/Terra/parsefail2.t create mode 100644 samples/Terra/pattern.t create mode 100644 samples/Terra/point.t create mode 100644 samples/Terra/pointerarith.t create mode 100644 samples/Terra/pointerlike.t create mode 100644 samples/Terra/pow.t create mode 100644 samples/Terra/ppltalk.t create mode 100644 samples/Terra/ppnil.t create mode 100755 samples/Terra/pratttest1.t create mode 100644 samples/Terra/prec.t create mode 100644 samples/Terra/prec2.t create mode 100644 samples/Terra/pretty.t create mode 100644 samples/Terra/printd.t create mode 100644 samples/Terra/printfarray.t create mode 100644 samples/Terra/printfloat.t create mode 100644 samples/Terra/proxystruct.t create mode 100644 samples/Terra/pt.t create mode 100644 samples/Terra/pthreads.t create mode 100644 samples/Terra/quote.t create mode 100644 samples/Terra/quote10.t create mode 100644 samples/Terra/quote2.t create mode 100644 samples/Terra/quote3.t create mode 100644 samples/Terra/quote4.t create mode 100644 samples/Terra/quote5.t create mode 100644 samples/Terra/quote6.t create mode 100644 samples/Terra/quote7.t create mode 100644 samples/Terra/quote8.t create mode 100644 samples/Terra/quote9.t create mode 100644 samples/Terra/quoteblock.t create mode 100644 samples/Terra/quoteenv.t create mode 100644 samples/Terra/quoteselect.t create mode 100644 samples/Terra/rd.t create mode 100644 samples/Terra/receivercasts.t create mode 100644 samples/Terra/recfn.t create mode 100644 samples/Terra/recoverfromerror.t create mode 100644 samples/Terra/recstruct.t create mode 100644 samples/Terra/recstruct2.t create mode 100644 samples/Terra/rename.t create mode 100644 samples/Terra/renaming.t create mode 100644 samples/Terra/requiretwice.t create mode 100644 samples/Terra/rvaluerecv.t create mode 100644 samples/Terra/scope.t create mode 100644 samples/Terra/selectoverload.t create mode 100644 samples/Terra/setname.t create mode 100644 samples/Terra/setter.t create mode 100644 samples/Terra/sgemm-old.t create mode 100644 samples/Terra/sgemm.t create mode 100644 samples/Terra/sgemm3.t create mode 100644 samples/Terra/sgemmkernel.t create mode 100644 samples/Terra/shallowfreeze.t create mode 100644 samples/Terra/sharedlib.t create mode 100644 samples/Terra/shift.t create mode 100644 samples/Terra/signext.t create mode 100644 samples/Terra/simple.t create mode 100644 samples/Terra/simpleadd.t create mode 100644 samples/Terra/simpleapply.t create mode 100644 samples/Terra/simpleglobal.t create mode 100644 samples/Terra/simplerec.t create mode 100644 samples/Terra/simplestruct.t create mode 100644 samples/Terra/simplevec.t create mode 100644 samples/Terra/sintable.t create mode 100644 samples/Terra/special.t create mode 100644 samples/Terra/speed.t create mode 100644 samples/Terra/splitprimary.t create mode 100644 samples/Terra/ssimple.t create mode 100644 samples/Terra/staticmethod.t create mode 100644 samples/Terra/stattest.t create mode 100644 samples/Terra/stencil.t create mode 100644 samples/Terra/strerror.t create mode 100644 samples/Terra/string.t create mode 100644 samples/Terra/struct.t create mode 100644 samples/Terra/structarg.t create mode 100644 samples/Terra/structcast.t create mode 100644 samples/Terra/structconstructor.t create mode 100644 samples/Terra/structrvalue.t create mode 100644 samples/Terra/structsyntax.t create mode 100644 samples/Terra/sugar.t create mode 100755 samples/Terra/sumlanguage1.t create mode 100755 samples/Terra/sumlanguage2.t create mode 100644 samples/Terra/symbolmangling.t create mode 100644 samples/Terra/symbolvar.t create mode 100644 samples/Terra/symbolvar2.t create mode 100644 samples/Terra/symbolvar3.t create mode 100644 samples/Terra/symbolvar4.t create mode 100644 samples/Terra/symbolvar5.t create mode 100644 samples/Terra/symbolvar6.t create mode 100644 samples/Terra/symbolvar7.t create mode 100644 samples/Terra/symparam.t create mode 100644 samples/Terra/symparam2.t create mode 100644 samples/Terra/symparam3.t create mode 100644 samples/Terra/template.t create mode 100644 samples/Terra/terracast.t create mode 100644 samples/Terra/terralua.t create mode 100644 samples/Terra/terraluamethod.t create mode 100644 samples/Terra/terranew.t create mode 100644 samples/Terra/testdebug.t create mode 100644 samples/Terra/testimport.t create mode 100755 samples/Terra/testlang1.t create mode 100755 samples/Terra/testlang2.t create mode 100644 samples/Terra/testlog.t create mode 100644 samples/Terra/testrequire.t create mode 100644 samples/Terra/teststd.t create mode 100644 samples/Terra/testvector.t create mode 100644 samples/Terra/torturechain.t create mode 100644 samples/Terra/toterraexpression.t create mode 100644 samples/Terra/twolang.t create mode 100644 samples/Terra/typeexp.t create mode 100644 samples/Terra/union.t create mode 100644 samples/Terra/unm.t create mode 100644 samples/Terra/unpacktuple.t create mode 100644 samples/Terra/unsafesym.t create mode 100644 samples/Terra/unstrict.t create mode 100644 samples/Terra/usercast.t create mode 100644 samples/Terra/varargcstring.t create mode 100644 samples/Terra/vars.t create mode 100644 samples/Terra/vars2.t create mode 100644 samples/Terra/vec.t create mode 100644 samples/Terra/vecarith.t create mode 100644 samples/Terra/veclit.t create mode 100644 samples/Terra/vecobj.t create mode 100644 samples/Terra/vecptr.t create mode 100644 samples/Terra/vecsize.t create mode 100644 samples/Terra/vtablerec.t create mode 100644 samples/Terra/zeroargs.t create mode 100644 samples/Terra/zeroreturn.t create mode 100644 samples/Terra/zeroreturn2.t diff --git a/samples/Terra/abouttocompile.t b/samples/Terra/abouttocompile.t new file mode 100644 index 00000000..f6f9f6c8 --- /dev/null +++ b/samples/Terra/abouttocompile.t @@ -0,0 +1,22 @@ +struct A { + a : int; + b : int; +} + +function A.metamethods.__getentries(self) + print("GET ENTRIES") + for i,e in ipairs(self.entries) do + e.field = "foo"..e.field + end + return self.entries +end + +terra foo() + var a : A + a.fooa = 3 + a.foob = 4 + return a.fooa + a.foob +end + + +assert(foo() == 7) \ No newline at end of file diff --git a/samples/Terra/addlanguage1.t b/samples/Terra/addlanguage1.t new file mode 100755 index 00000000..ad383d9e --- /dev/null +++ b/samples/Terra/addlanguage1.t @@ -0,0 +1,17 @@ +do +import "lib/addlanguage" +local a = 4 +local b = add a,3,4+5,(function() terra one() return a end return one() end)() end +local inception = add add 3,4,a end,4 end +local test = require("test") + + +test.eq(b,20) +test.eq(inception,15) +end + +do +import "lib/addlanguage" +local c = add 4,5 end +assert(9 == c) +end \ No newline at end of file diff --git a/samples/Terra/aggregatearr.t b/samples/Terra/aggregatearr.t new file mode 100644 index 00000000..b54f3dc3 --- /dev/null +++ b/samples/Terra/aggregatearr.t @@ -0,0 +1,18 @@ + + +a = terralib.new(int[4]) + +terra foo() + a[3] = 4 +end + +foo() +assert(4 == a[3]) + + +terra bar() + a = array(5,6,7,8) +end + +bar() +assert(a[3] == 8) diff --git a/samples/Terra/ainline.t b/samples/Terra/ainline.t new file mode 100644 index 00000000..4f6dcabe --- /dev/null +++ b/samples/Terra/ainline.t @@ -0,0 +1,24 @@ + +C = terralib.includec("stdio.h") +terra foo() + C.printf("hello, world\n") + C.printf("hello, world\n") + C.printf("hello, world\n") + C.printf("hello, world\n") + C.printf("hello, world\n") + C.printf("hello, world\n") + C.printf("hello, world\n") + C.printf("hello, world\n") + C.printf("hello, world\n") + C.printf("hello, world\n") +end + +foo:getdefinitions()[1]:setinlined(true) + +terra bar() + foo() + return 4 +end + +bar:compile() +bar:disas() diff --git a/samples/Terra/alignment.t b/samples/Terra/alignment.t new file mode 100644 index 00000000..08b648f8 --- /dev/null +++ b/samples/Terra/alignment.t @@ -0,0 +1,7 @@ +local alignment = 16 +local aligned = terralib.aligned +terra foobar(a : &float) + terralib.attrstore(a,terralib.attrload(a+3,{ align = alignment }), { align = alignment }) +end + +foobar:disas() \ No newline at end of file diff --git a/samples/Terra/and.t b/samples/Terra/and.t new file mode 100644 index 00000000..87ea0284 --- /dev/null +++ b/samples/Terra/and.t @@ -0,0 +1,9 @@ +local test = require("test") + +terra foo(a : double, b : double, c : double) : bool + return a < b and b < c +end + +test.eq(foo(1,2,3),true) +test.eq(foo(1,2,1),false) +test.eq(foo(2,1,2),false) \ No newline at end of file diff --git a/samples/Terra/anon.t b/samples/Terra/anon.t new file mode 100644 index 00000000..c5d3315f --- /dev/null +++ b/samples/Terra/anon.t @@ -0,0 +1,26 @@ +local test = require("test") + +local Num = int + +local fib = +terra(a : Num) : Num + var i,c,p = 0,1,1 + while i < a do + c,p = c + p,c + i = i + 1 + end + return c +end + +function fib2(a) + local i,c,p = 0,1,1 + while i < a do + c,p = c + p,c + i = i + 1 + end + return c +end +for i = 0,10 do + print(fib(i)) + test.eq(fib(i),fib2(i)) +end \ No newline at end of file diff --git a/samples/Terra/anon3.t b/samples/Terra/anon3.t new file mode 100644 index 00000000..5d37c7c7 --- /dev/null +++ b/samples/Terra/anon3.t @@ -0,0 +1,18 @@ +C,T = terralib.includecstring [[ + struct D { + struct { int a; struct { int c; } c; } b; + } c; + typedef struct {int c;} B; + typedef struct { + struct { int a; } a; + struct { int b; } b; + B c; + } A; +]] + +terra foo(a : &C.A) + var c = a.a + var b = a.b.b + return c.a + b + a.c.c; +end +foo:compile() \ No newline at end of file diff --git a/samples/Terra/anonstruct.t b/samples/Terra/anonstruct.t new file mode 100644 index 00000000..5f661249 --- /dev/null +++ b/samples/Terra/anonstruct.t @@ -0,0 +1,12 @@ + +local C = tuple(int,tuple(int,int)) +terra anon() + var c : tuple(int,tuple(int,int)) = { 1, {2,3} } + var d : C = c + d._0 = 2 + return d._0 + c._1._0 + c._1._1 +end + +test = require("test") + +test.eq(anon(),7) \ No newline at end of file diff --git a/samples/Terra/anonstruct2.t b/samples/Terra/anonstruct2.t new file mode 100644 index 00000000..156e2a8b --- /dev/null +++ b/samples/Terra/anonstruct2.t @@ -0,0 +1,7 @@ + +struct A { a : &A } + +terra foo() + var a : A +end +foo() \ No newline at end of file diff --git a/samples/Terra/antiquote1.t b/samples/Terra/antiquote1.t new file mode 100644 index 00000000..8bddcf3e --- /dev/null +++ b/samples/Terra/antiquote1.t @@ -0,0 +1,12 @@ + + +function omgfunc() + return 2 +end + +terra foo() + return 1 + [{omgfunc()}] + [omgfunc()] +end + +local test = require("test") +test.eq(foo(),5) \ No newline at end of file diff --git a/samples/Terra/antiquote2.t b/samples/Terra/antiquote2.t new file mode 100644 index 00000000..7ad4f86d --- /dev/null +++ b/samples/Terra/antiquote2.t @@ -0,0 +1,13 @@ + + +function omgfunc() + return 4 +end + +local what = `[ {2,3} ] +terra foo() + return [{3,`[ {2,3} ]}] +end + +local test = require("test") +test.meq({3,2,3},foo()) diff --git a/samples/Terra/antiquote3.t b/samples/Terra/antiquote3.t new file mode 100644 index 00000000..1d34ef7e --- /dev/null +++ b/samples/Terra/antiquote3.t @@ -0,0 +1,16 @@ + + +function omgfunc() + return 2 +end + +a = global(0) + +terra foo() + [quote a = a + 1 end]; + [{quote a = a + 1 end,quote a = a + 1 end}] + return a +end + +local test = require("test") +test.eq(foo(),3) \ No newline at end of file diff --git a/samples/Terra/antiquote4.t b/samples/Terra/antiquote4.t new file mode 100644 index 00000000..d6585edc --- /dev/null +++ b/samples/Terra/antiquote4.t @@ -0,0 +1,11 @@ + + +terra foo() + var a = 4 + return [a] +end + +foo:printpretty() + +local test = require("test") +test.eq(foo(),4) \ No newline at end of file diff --git a/samples/Terra/antiquote5.t b/samples/Terra/antiquote5.t new file mode 100644 index 00000000..9ebbbed4 --- /dev/null +++ b/samples/Terra/antiquote5.t @@ -0,0 +1,21 @@ + + +function makeloop(N,body) + return quote + for i = 0, N do + body + end + end +end + + +terra stuff() + var a = 0; + [makeloop(10,quote + a = a + 1 + end)] + return a +end + + +print(stuff()) \ No newline at end of file diff --git a/samples/Terra/arith.t b/samples/Terra/arith.t new file mode 100644 index 00000000..d73a46da --- /dev/null +++ b/samples/Terra/arith.t @@ -0,0 +1,114 @@ +--[[ + +- ++ + +* +/ +% + +^ +and +or +~= == < > >= <= +<< >> + +]] + + + + +terra test0() + var a = 1 + 3 + var b = 1LL + 2LL + var c = 1ULL + 2ULL + var d = 1.f + 2.f + var e = 1.0 + 2.0 + return a + b + c + d + e +end +terra test1() + var a = 1 - 3 + var b = 1LL - 2LL + var c = 1ULL - 2ULL + var d = 1.f - 2.f + var e = 1.0 - 2.0 + return a - b - c - d - e +end +terra test2() + var a = 2 * 3 + var b = 3LL * 2LL + var c = 3ULL * 2ULL + var d = 1.f * 2.f + var e = 3.0 * 2.0 + return a * b * c * d * e +end + +terra test3() + var a = 2 / 3 + 1 + var b = 3LL / 2LL + 1 + var c = 3ULL / 2ULL + var d = 1.f / 2.f + var e = 3.0 / 2.0 + return a * b * c * d * e +end + +terra test4() + var a = 2 % 3 + var b = 3LL % 4LL + var c = 3ULL % 2ULL + var d = 1.f % 2.f + var e = 3.75 % 2.0 + return (a == 2) and (b == 3LL) and (d == 1.f) and (e == 1.75) +end + +terra test5() + var a = 2 ^ 3 + var b = 3LL ^ 4LL + var c = 3ULL ^ 2ULL + return (a == 1) and (b == 7LL) and (c == 1ULL) +end + +terra test6() + var a = 2 and 3 + var b = 3LL and 4LL + var c = 3ULL and 2ULL + return (a == 2) and (b == 0LL) and (c == 2ULL) +end + +terra test7() + var a = 2 or 3 + var b = 3LL or 4LL + var c = 3ULL or 2ULL + return (a == 3) and (b == 7LL) and (c == 3ULL) +end + + +terra test8() + var a0,a1 = 2 ~= 3, 2 == 3 + var b0,b1 = 2 < 3, 2 >= 3 + var c0,c1 = 2 > 3, 2 <= 3 + + return a0 and not a1 and b0 and not b1 and not c0 and c1 +end + +terra test9() + var a0, a1 = 8 >> 1, 8 << 1 + var b0, b1 = -8 >> 1, -8 << 1 + return a0 == 4 and a1 == 16 and b0 == -4 and b1 == -16 +end + + +local test = require("test") + +test.eq(test0(),16) +test.eq(test1(),2) +test.eq(test2(),2592) +test.eq(test3(),1.5) + +test.eq(test4(),true) + +test.eq(test5(),true) +test.eq(test6(),true) +test.eq(test7(),true) +test.eq(test8(),true) +test.eq(test9(),true) \ No newline at end of file diff --git a/samples/Terra/array.t b/samples/Terra/array.t new file mode 100644 index 00000000..28040709 --- /dev/null +++ b/samples/Terra/array.t @@ -0,0 +1,60 @@ + +terra bar() + var a : int[2] + a[0] = 1 + a[1] = 2 + return a +end + +terra foo() + var a : int[4] + a[1], a[2] = 4,2 + return a[1] + a[2] +end + +terra foo2() + var b = bar() + return b[0] + b[1] +end + +terra foo3() + return (bar())[0] +end + +terra foo4() + var a : int[4] + a[3] = 7 + var b = &a[0] + b[2] = 8 + return b[2] + b[3] +end + +terra bar2(a : &int) + a[1] = 100 + return a[0] +end + +terra foo5() + var a : int[4] + bar2(a) + return a[1] +end + +terra foo6() + return bar2(bar()) +end + + +terra foo7() + var a = array(1,2,3,4) + return a[1]+a[2] +end +local test = require("test") + +test.eq(6,foo()) +test.eq(3,foo2()) +test.eq(1,foo3()) +test.eq(15,foo4()) +test.eq(100,foo5()) +test.eq(1,foo6()) +test.eq(5,foo7()) \ No newline at end of file diff --git a/samples/Terra/arraylit.t b/samples/Terra/arraylit.t new file mode 100644 index 00000000..3731a367 --- /dev/null +++ b/samples/Terra/arraylit.t @@ -0,0 +1,29 @@ + +terra foo() + var a = array(1,2,3) + return a[0] + a[1] + a[2] +end + +terra foo2() + var a = array(1,2.5,3) + return a[1] +end +terra what() + return 3,4.5 +end +local expand = macro(function(a) return {`a._0,`a._1} end) +terra foo3() + var w = what() + var a = array(1,2.5,expand(w)) + return a[3] +end +terra foo4() + var a = array("what","magic","is","this") + return a[1][1] +end + +local test = require("test") +test.eq(foo(),6) +test.eq(foo2(),2.5) +test.eq(foo3(),4.5) +test.eq(foo4(),97) \ No newline at end of file diff --git a/samples/Terra/arrayt.t b/samples/Terra/arrayt.t new file mode 100644 index 00000000..29fca5b4 --- /dev/null +++ b/samples/Terra/arrayt.t @@ -0,0 +1,75 @@ +C = terralib.includecstring [[ + #include + #include +]] +local arraytypes = {} +function Array(T) + local struct ArrayImpl { + data : &T; + N : int; + } + function ArrayImpl.metamethods.__typename(self) + return "Array("..tostring(T)..")" + end + arraytypes[ArrayImpl] = true + terra ArrayImpl:init(N : int) + self.data = [&T](C.malloc(N*sizeof(T))) + self.N = N + end + terra ArrayImpl:free() + C.free(self.data) + end + ArrayImpl.metamethods.__apply = macro(function(self,idx) + return `self.data[idx] + end) + ArrayImpl.metamethods.__methodmissing = macro(function(methodname,selfexp,...) + local args = terralib.newlist {...} + local i = symbol(int) + local promotedargs = args:map(function(a) + if arraytypes[a:gettype()] then + return `a(i) + else + return a + end + end) + return quote + var self = selfexp + var r : ArrayImpl + r:init(self.N) + for [i] = 0,r.N do + r.data[i] = self.data[i]:[methodname](promotedargs) + end + in + r + end + end) + return ArrayImpl +end + +struct Complex { + real : float; + imag : float; +} + +terra Complex:add(c : Complex) + return Complex { self.real + c.real, self.imag + c.imag } +end + +ComplexArray = Array(Complex) +N = 10 +terra testit() + var ca : ComplexArray + ca:init(N) + for i = 0,N do + ca(i) = Complex { i, i + 1 } + end + var ra = ca:add(ca) + return ra +end +local r = testit() +assert(r.N == N) +for i = 0,N-1 do + assert(r.data[i].real == 2*i) + assert(r.data[i].imag == 2*(i+1)) +end +assert(tostring(Array(int)) == "Array(int32)") \ No newline at end of file diff --git a/samples/Terra/arrayt2.t b/samples/Terra/arrayt2.t new file mode 100644 index 00000000..8b6c9f2f --- /dev/null +++ b/samples/Terra/arrayt2.t @@ -0,0 +1,82 @@ +local f = assert(io.popen("uname", 'r')) +local s = assert(f:read('*a')) +f:close() + +if s~="Darwin\n" then + print("Warning, not running test b/c this isn't a mac") + return +end + +C = terralib.includecstring [[ + #include + #include +]] +local arraytypes = {} +function Array(T) + if arraytypes[T] then return arraytypes[T] end + local struct ArrayImpl { + data : &T; + N : int; + } + arraytypes[T] = ArrayImpl + terra ArrayImpl:init(N : int) + self.data = [&T](C.malloc(N*sizeof(T))) + self.N = N + end + terra ArrayImpl:free() + C.free(self.data) + end + ArrayImpl.metamethods.__apply = macro(function(self,idx) + return `self.data[idx] + end) + ArrayImpl.metamethods.__methodmissing = macro(function(methodname,selfexp,...) + local args = terralib.newlist {...} + local params = args:map(function(a) return symbol(a:gettype()) end) + local terra elemfn(a : &T, [params]) + return a:[methodname](params) + end + local RT = elemfn:gettype().returntype + return quote + var self = selfexp + var r : Array(RT) + r:init(self.N) + for i = 0,r.N do + r.data[i] = elemfn(&self.data[i],args) + end + in + r + end + end) + return ArrayImpl +end + +local OC = require("lib/objc") +local IO = terralib.includec("stdio.h") + +struct Rect { + a : double, + b : double, + c : double, + d : double +} + +terra str(data : &uint8) + return OC.NSString:stringWithUTF8String(data) +end + +terra main() + OC.NSAutoreleasePool:new() + var app = OC.NSApplication:sharedApplication() + var rec = Rect {0,0,200,200} + var windows : Array(OC.ID) + windows:init(2) + windows(0) = OC.NSWindow + windows(1) = OC.NSWindow + windows = windows:alloc():initWithContentRect_styleMask_backing_defer(rec,1,2,false) + windows:makeKeyAndOrderFront(nil) + IO.printf("entering run loop\n") + app:run() +end + +terralib.linklibrary("/System/Library/Frameworks/Cocoa.framework/Cocoa") +main:compile() diff --git a/samples/Terra/arrptr.t b/samples/Terra/arrptr.t new file mode 100644 index 00000000..55b6a918 --- /dev/null +++ b/samples/Terra/arrptr.t @@ -0,0 +1,5 @@ +a = &int[4] +a = (&int)[4] +local test = require("test") +test.eq(false,a:ispointer()) +test.eq(true,a:isarray()) \ No newline at end of file diff --git a/samples/Terra/asm.t b/samples/Terra/asm.t new file mode 100644 index 00000000..803b6882 --- /dev/null +++ b/samples/Terra/asm.t @@ -0,0 +1,28 @@ +local a = ... +if not a then + --force MCJIT + os.execute("../terra -m asm.t true") + return +end + +C = terralib.includec("stdio.h") + +struct Vendor { + maxV : int; + b : int; + c : int; + d : int; +} + +terra foo() + var r = terralib.asm(Vendor,"cpuid","={eax},={ebx},={ecx},={edx},{eax},~{dirflag},~{fpsr},~{flags}",false,0) + r.c,r.d = r.d,r.c + C.printf("%.12s\n", &r.b) +end +foo() + + +terra addone(a : int) + return terralib.asm(int,"addl $$1,$1","=r,0",true,a) +end +assert(addone(3) == 4) \ No newline at end of file diff --git a/samples/Terra/atoi.t b/samples/Terra/atoi.t new file mode 100644 index 00000000..929f9672 --- /dev/null +++ b/samples/Terra/atoi.t @@ -0,0 +1,7 @@ +c = terralib.includec("stdlib.h") + +terra what() + return c.atoi("52") +end + +print(what()) diff --git a/samples/Terra/avxhadd.t b/samples/Terra/avxhadd.t new file mode 100644 index 00000000..d1e762b7 --- /dev/null +++ b/samples/Terra/avxhadd.t @@ -0,0 +1,32 @@ +local haddavx = terralib.intrinsic("llvm.x86.avx.hadd.ps.256", { vector(float,8), vector(float,8) } -> vector(float,8)) + +terra hadd(v : vector(float,8)) + var v1 = haddavx(v,v) + var v2 = haddavx(v1,v1) + return v2[0] + v2[4] +end + +ffi = require("ffi") + +local stdio = terralib.includec("stdio.h") + +terra foobar(a : &float) + return hadd(@[&vector(float,8)](a)) +end + +dat = ffi.new("float[?] __attribute__((aligned(32)))",8) + +for i = 1,8 do + dat[i-1] = i +end + +if terralib.llvmversion == 31 then + print("ignoring...") +else + foobar:compile() + local test = require("test") + test.eq(foobar(dat),36) +end + +--terralib.saveobj("avxhadd",{main = foobar}) +--os.execute("./avxhadd") \ No newline at end of file diff --git a/samples/Terra/badname.t b/samples/Terra/badname.t new file mode 100644 index 00000000..a2436c12 --- /dev/null +++ b/samples/Terra/badname.t @@ -0,0 +1,4 @@ +--tostring on a type should never error, so we assign it its original name if it does +struct A {} +A.metamethods.__typename = error +print(A) \ No newline at end of file diff --git a/samples/Terra/benchmark_fannkuchredux.t b/samples/Terra/benchmark_fannkuchredux.t new file mode 100644 index 00000000..2ec27e6e --- /dev/null +++ b/samples/Terra/benchmark_fannkuchredux.t @@ -0,0 +1,148 @@ +--[[ + The Computer Language Benchmarks Game + http://shootout.alioth.debian.org/ + + contributed by Ledrug Katz + + ]] + + +local C = { + printf = terralib.externfunction("printf", terralib.types.funcpointer(rawstring,int,true)), + exit = terralib.externfunction("exit", int -> {}), + atoi = terralib.externfunction("atoi", rawstring -> int) +} + +-- this depends highly on the platform. It might be faster to use +-- char type on 32-bit systems; it might be faster to use unsigned. + +elem = int + +s = global(elem[16]) +t = global(elem[16]) + +maxflips = global(int) +max_n = global(int) +odd = global(bool) +checksum = global(int) + +terra flip() + var i = max_n + var x : &elem = t + var y : &elem = s + var c : elem + + while i > 0 do + i = i - 1 + @x = @y + x = x + 1 + y = y + 1 + end + + i = 1 + + repeat + x = t + y = t + t[0] + while x < y do + c = @x + @x = @y + x = x + 1 + @y = c + y = y - 1 + end + i = i + 1 + until t[t[0]] == 0 + --C.printf("flip %d\n",i); + return i +end + + +terra rotate(n : int) + var c = s[0] + for i = 0,n do + s[i] = s[i+1] + end + s[n] = c + --C.printf("rotate(%d) %d\n",n,c); +end + + +terra tk(n : int) + var i = 0 + var f : int + var c : elem[16] + + for i = 0,16 do + c[i] = 0 + end + + while i < n do + rotate(i) + if c[i] >= i then + c[i] = 0 + i = i + 1 + goto continue + end + + c[i] = c[i] + 1 + i = 1 + odd = not odd + if s[0] ~= 0 then + if s[s[0]] ~= 0 then + f = flip() + else + f = 1 + end + if f > maxflips then + maxflips = f + end + --C.printf("f = %d\n",f) + if odd then + checksum = checksum - f + else + checksum = checksum + f + end + end + ::continue:: + end + +end + + +terra doit(N : int) + maxflips = 0 + odd = false + checksum = 0 + max_n = N + if max_n < 3 or max_n > 15 then + C.printf("range: must be 3 <= n <= 12\n") + C.exit(1) + end + + for i = 0,max_n do + s[i] = i + end + tk(max_n) + C.printf("%d\nPfannkuchen(%d) = %d\n", checksum, max_n, maxflips) + return checksum +end + +terra main(argc : int, v : &&int8) + if argc < 2 then + C.printf("usage: %s number\n", v[0]) + C.exit(1); + end + + doit(C.atoi(v[1])) + return 0 +end + +local test = require("test") + +doit:compile() +print(test.time(function() + test.eq(doit(10),73196) +end)) + +terralib.saveobj("benchmark_fannkuchredux", { main = main } ) diff --git a/samples/Terra/benchmark_nbody.t b/samples/Terra/benchmark_nbody.t new file mode 100644 index 00000000..8b007193 --- /dev/null +++ b/samples/Terra/benchmark_nbody.t @@ -0,0 +1,150 @@ +local C = terralib.includecstring[[ + +#include +#include +#include + +]] + +pi = 3.141592653589793 +solar_mass = (4 * pi * pi) +days_per_year = 365.24 + +struct planet { + x : double; + y : double; + z : double; + vx : double; + vy : double; + vz : double; + mass : double; +} + +terra advance(nbodies : int, bodies : &planet, dt : double) + + for i = 0, nbodies do + var b = &bodies[i] + for j = i + 1, nbodies do + var b2 = &bodies[j] + + var dx = b.x - b2.x; + var dy = b.y - b2.y; + var dz = b.z - b2.z; + var distance = C.sqrt(dx * dx + dy * dy + dz * dz); + var mag = dt / (distance * distance * distance); + --C.printf("%f %f %f %f %f\n",dx,dy,dz,distance,mag); + b.vx = b.vx - dx * b2.mass * mag; + b.vy = b.vy - dy * b2.mass * mag; + b.vz = b.vz - dz * b2.mass * mag; + b2.vx = b2.vx + dx * b.mass * mag; + b2.vy = b2.vy + dy * b.mass * mag; + b2.vz = b2.vz + dz * b.mass * mag; + --C.printf("%f %f %f %f %f %f\n",b.vx,b.vy,b.vz,b2.vx,b2.vy,b2.vz) + end + end + for i = 0,nbodies do + var b = &bodies[i] + b.x = b.x + dt * b.vx; + b.y = b.y + dt * b.vy; + b.z = b.z + dt * b.vz; + end +end + +terra energy(nbodies : int, bodies : &planet) + var e = 0.0 + for i = 0, nbodies do + var b = &bodies[i] + e = e + 0.5 * b.mass * (b.vx * b.vx + b.vy * b.vy + b.vz * b.vz); + for j = i + 1, nbodies do + var b2 = &bodies[j] + var dx = b.x - b2.x + var dy = b.y - b2.y + var dz = b.z - b2.z + var distance = C.sqrt(dx * dx + dy * dy + dz * dz) + e = e - (b.mass * b2.mass) / distance + end + end + return e +end + +terra offset_momentum(nbodies : int, bodies : &planet) + var px,py,pz = 0.0,0.0,0.0 + + for i = 0,nbodies do + px = px + bodies[i].vx * bodies[i].mass + py = py + bodies[i].vy * bodies[i].mass + pz = pz + bodies[i].vz * bodies[i].mass + end + bodies[0].vx = - px / solar_mass + bodies[0].vy = - py / solar_mass + bodies[0].vz = - pz / solar_mass +end + +NBODIES = 5 + +terra main(argc : int, argv : &&int8) + var bodies = array( + planet { -- sun */ + 0, 0, 0, 0, 0, 0, solar_mass + }, + planet { -- jupiter */ + 4.84143144246472090e+00, + -1.16032004402742839e+00, + -1.03622044471123109e-01, + 1.66007664274403694e-03 * days_per_year, + 7.69901118419740425e-03 * days_per_year, + -6.90460016972063023e-05 * days_per_year, + 9.54791938424326609e-04 * solar_mass + }, + planet { -- saturn */ + 8.34336671824457987e+00, + 4.12479856412430479e+00, + -4.03523417114321381e-01, + -2.76742510726862411e-03 * days_per_year, + 4.99852801234917238e-03 * days_per_year, + 2.30417297573763929e-05 * days_per_year, + 2.85885980666130812e-04 * solar_mass + }, + planet { -- uranus */ + 1.28943695621391310e+01, + -1.51111514016986312e+01, + -2.23307578892655734e-01, + 2.96460137564761618e-03 * days_per_year, + 2.37847173959480950e-03 * days_per_year, + -2.96589568540237556e-05 * days_per_year, + 4.36624404335156298e-05 * solar_mass + }, + planet { -- neptune */ + 1.53796971148509165e+01, + -2.59193146099879641e+01, + 1.79258772950371181e-01, + 2.68067772490389322e-03 * days_per_year, + 1.62824170038242295e-03 * days_per_year, + -9.51592254519715870e-05 * days_per_year, + 5.15138902046611451e-05 * solar_mass + } + ) + var n = C.atoi(argv[1]) + offset_momentum(NBODIES, bodies) + C.printf ("%.9f\n", energy(NBODIES, bodies)) + for i = 0,n do + advance(NBODIES, bodies, 0.01) + end + C.printf ("%.9f\n", energy(NBODIES, bodies)); + return 0 +end + +terra run() + main(2,array("what","1000000")) +end + +--run:compile() + + +--local test = require("test") + +--print(test.time(run)) + +terralib.saveobj("benchmark_nbody",{ main = main } ) +energy:disas() +energy:printpretty() \ No newline at end of file diff --git a/samples/Terra/bf.t b/samples/Terra/bf.t new file mode 100644 index 00000000..84b99b5a --- /dev/null +++ b/samples/Terra/bf.t @@ -0,0 +1,60 @@ + +local C = terralib.includec("stdio.h") + +local function compile(code,N) + local function body(data,ptr) + local stmts = terralib.newlist() + local jumpstack = {} + for i = 1,#code do + local c = code:sub(i,i) + local stmt + if c == ">" then + stmt = quote ptr = ptr + 1 end + elseif c == "<" then + stmt = quote ptr = ptr - 1 end + elseif c == "+" then + stmt = quote data[ptr] = data[ptr] + 1 end + elseif c == "-" then + stmt = quote data[ptr] = data[ptr] - 1 end + elseif c == "." then + stmt = quote C.putchar(data[ptr]) end + elseif c == "," then + stmt = quote data[ptr] = C.getchar() end + elseif c == "[" then + local target = { before = symbol(), after = symbol() } + table.insert(jumpstack,target) + stmt = quote + ::[target.before]:: + if data[ptr] == 0 then + goto [target.after] + end + end + elseif c == "]" then + local target = table.remove(jumpstack) + assert(target) + stmt = quote + goto [target.before] + :: [target.after] :: + end + else + error("unknown character "..c) + end + stmts:insert(stmt) + end + return stmts + end + return terra() + var data : int[N] + for i = 0, N do + data[i] = 0 + end + var ptr = 0; + [ body(data,ptr) ] + end +end + +local helloworld = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>." + +local fn = compile(helloworld,256) + +fn() \ No newline at end of file diff --git a/samples/Terra/blankexp.t b/samples/Terra/blankexp.t new file mode 100644 index 00000000..e53242c1 --- /dev/null +++ b/samples/Terra/blankexp.t @@ -0,0 +1,7 @@ +local a = quote + while false do end +end +terra foo() + return a +end +foo() \ No newline at end of file diff --git a/samples/Terra/blockescape.t b/samples/Terra/blockescape.t new file mode 100644 index 00000000..eb475932 --- /dev/null +++ b/samples/Terra/blockescape.t @@ -0,0 +1,23 @@ +terra foo() + var c = 3 + escape + local a = 1 + for i = 1,10 do + emit quote c = c + a end + end + end + return c +end + +assert(foo() == 13) + +terra foo2() + return escape emit(1) end +end + +assert(1 == foo2()) + +a = terralib.newlist() +a:insert quote + foo() +end \ No newline at end of file diff --git a/samples/Terra/blocking.t b/samples/Terra/blocking.t new file mode 100644 index 00000000..8ee19e3e --- /dev/null +++ b/samples/Terra/blocking.t @@ -0,0 +1,57 @@ +function symmat(name,I,...) + if not I then return symbol(name) end + local r = {} + for i = 1,I do + r[i] = symmat(name..tostring(i),...) + end + return r +end + +terra min(a : int, b : int) + return terralib.select(a < b, a, b) +end + +function blockedloop(bounds,sizes,bodyfn) + local indexes = symmat("i",#sizes,#bounds) + --local makeloop --bug local function doesn't add to set of live variables... + local function makeloop(s,b) + if s > #sizes then + return bodyfn(unpack(indexes[#sizes])) + elseif b > #bounds then + return makeloop(s + 1, 1) + else + local topbound = bounds[b] + local blocksize = sizes[s] + local begin,bound + if s == 1 then + begin,bound = 0, topbound + else + begin,bound = indexes[s-1][b], sizes[s-1] + end + local step = sizes[s] + return quote + for [indexes[s][b]] = begin,min(begin+bound,topbound),step do + [ makeloop(s,b+1) ] + end + end + end + end + return makeloop(1,1) +end + +IO = terralib.includec("stdio.h") + +terra main() + + var M,N = 30,40; + + [blockedloop({M,N}, {10,1}, function(m,n) + return quote + IO.printf("%d %d\n",m,n) + end + end)] + +end + +main:printpretty() +main() \ No newline at end of file diff --git a/samples/Terra/blocking2-fixed.t b/samples/Terra/blocking2-fixed.t new file mode 100644 index 00000000..10ff5a6d --- /dev/null +++ b/samples/Terra/blocking2-fixed.t @@ -0,0 +1,68 @@ +C = terralib.includec("stdio.h") + +terra min(a: int, b: int) : int + if a < b then return a + else return b end +end +std = terralib.includec("stdlib.h") +function Image(PixelType) + local struct ImageImpl { + data : &PixelType, + N : int + } + terra ImageImpl:init(N: int): {} --returns nothing + self.data = [&PixelType]( + std.malloc(N*N*sizeof(PixelType))) + self.N = N + end + terra ImageImpl:get(x: int, y: int) : PixelType + return self.data[x*self.N + y] + end + + + terra ImageImpl:set(x: int, y: int, v : PixelType) + self.data[x*self.N + y] = v + end + terra ImageImpl:save(i : rawstring) + for i = 0, 2 do for j = 0, 2 do + C.printf("%d %d %f\n", i,j,self:get(i,j)) + end end + end + terra ImageImpl:load(i : rawstring) self:init(16) + for i = 0, 4 do for j = 0, 4 do + self:set(i,j,(i*4+j)%3) + --C.printf("%f\n",self:get(i,j)) + end end + end + terra ImageImpl:free() end + + --omitted methods for: set, save, load, free + return ImageImpl +end +GreyscaleImage = Image(float) +terra laplace(img: &GreyscaleImage, + out: &GreyscaleImage) : {} + --shrink result, do not calculate boundaries + var newN = img.N - 2 + out:init(newN) + for i = 0,newN do + for j = 0,newN do + var v = img:get(i+0,j+1) + img:get(i+2,j+1) + + img:get(i+1,j+2) + img:get(i+1,j+0) + - 4 * img:get(i+1,j+1) + out:set(i,j,v) + end + end +end +terra runlaplace(input: rawstring, + output: rawstring) : {} + var i: GreyscaleImage, o : GreyscaleImage + i:load(input) + laplace(&i,&o) + o:save(output) + i:free(); o:free() +end + +runlaplace("myinput","myoutput") + terralib.saveobj("runlaplace.o", + {runlaplace = runlaplace}) diff --git a/samples/Terra/blocking2.t b/samples/Terra/blocking2.t new file mode 100644 index 00000000..2b0b3b71 --- /dev/null +++ b/samples/Terra/blocking2.t @@ -0,0 +1,81 @@ +terra min(a : int, b : int) + return terralib.select(a < b, a, b) +end +function blockedloop(N,blocksizes,bodyfn) + local function generatelevel(n,ii,jj,bb) + if n > #blocksizes then + return bodyfn(ii,jj) + end + local blocksize = blocksizes[n] + return quote + for i = ii,min(ii+bb,N),blocksize do + for j = jj,min(jj+bb,N),blocksize do + [ generatelevel(n+1,i,j,blocksize) ] + end + end + end + end + return generatelevel(1,0,0,N) +end + +IO = terralib.includec("stdio.h") +stdlib = terralib.includec("stdlib.h") + +terra main() + + var a : int[8][8] + var c = 0 + var N = 8 + [blockedloop(N, {4,2,1}, function(i,j) + return quote + --IO.printf("%d %d\n",i,j) + a[i][j] = c + c = c + 1 + end + end)] + for i = 0,N do + for j = 0,N do + IO.printf("%d\t",a[i][j]) + end + IO.printf("\n") + end +end + +main() + + + +function Image(Spectrum) + local struct ImageImpl { + data : &Spectrum, + N : int + } + terra ImageImpl:init(N : int) + self.data = [&float](stdlib.malloc(N*N*sizeof(Spectrum))) + self.N = N + end + ImageImpl.methods.pixel = macro(function(self,x,y) + return `self.data[x*self.N + y] + end) + return ImageImpl +end + +GreyScaleImage = Image(float) + +terra laplace(input : &GreyScaleImage, output : &GreyScaleImage) + var newN = input.N - 2 --shrink result since we do not calculate boundaries + output:init(newN); + [blockedloop(newN,{32,1},function(i,j) + return quote + output:pixel(i,j) = + input:pixel(i+0,j+1) + + input:pixel(i+2,j+1) + + input:pixel(i+1,j+2) + + input:pixel(i+1,j+0) + - 4 * input:pixel(i+1,j+1) + end + end)] +end + +laplace:compile() +laplace:printpretty() \ No newline at end of file diff --git a/samples/Terra/blocking3.t b/samples/Terra/blocking3.t new file mode 100644 index 00000000..c7b99b98 --- /dev/null +++ b/samples/Terra/blocking3.t @@ -0,0 +1,85 @@ +C = terralib.includec("stdio.h") + +function blockedloop(N,blocksizes,bodyfn) + local function generatelevel(n,ii,jj,bb) + if n > #blocksizes then + return bodyfn(ii,jj) + end + local blocksize = blocksizes[n] + return quote + for i = ii,min(ii+bb,N),blocksize do + for j = jj,min(jj+bb,N),blocksize do + [ generatelevel(n+1,i,j,blocksize) ] + end + end + end + end + return generatelevel(1,0,0,N) +end + +terra min(a: int, b: int) : int + if a < b then return a + else return b end +end +std = terralib.includec("stdlib.h") +function Image(PixelType) + local struct ImageImpl { + data : &PixelType, + N : int + } + terra ImageImpl:init(N: int): {} --returns nothing + self.data = + [&PixelType](std.malloc(N*N*sizeof(PixelType))) + self.N = N + end + terra ImageImpl:get(x: int, y: int) : PixelType + return self.data[x*self.N + y] + end + + + terra ImageImpl:set(x: int, y: int, v : PixelType) + self.data[x*self.N + y] = v + end + terra ImageImpl:save(i : rawstring) + for i = 0, 8 do for j = 0, 8 do + C.printf("%d %d %f\n", i,j,self:get(i,j)) + end end + end + terra ImageImpl:load(i : rawstring) self:init(16) + for i = 0, 10 do for j = 0, 10 do + self:set(i,j,(i*4+j)%3) + --C.printf("%f\n",self:get(i,j)) + end end + end + terra ImageImpl:free() end + + --omitted methods for: set, save, load, free + return ImageImpl +end +GreyscaleImage = Image(float) +terra laplace(img: &GreyscaleImage, + out: &GreyscaleImage) : {} + --shrink result, do not calculate boundaries + var newN = img.N - 2 + out:init(newN); + [blockedloop(newN,{4,2,1}, function(i,j) + return quote + var v = img:get(i+0,j+1) + img:get(i+2,j+1) + + img:get(i+1,j+2) + img:get(i+1,j+0) + - 4 * img:get(i+1,j+1) + out:set(i,j,v) + end + end)] +end +terra runlaplace(input: rawstring, + output: rawstring) : {} + var i: GreyscaleImage, o : GreyscaleImage + i:load(input) + laplace(&i,&o) + o:save(output) + i:free(); o:free() +end + +runlaplace("myinput","myoutput") + terralib.saveobj("runlaplace.o", + {runlaplace = runlaplace}) diff --git a/samples/Terra/bounce.t b/samples/Terra/bounce.t new file mode 100644 index 00000000..85e7400c --- /dev/null +++ b/samples/Terra/bounce.t @@ -0,0 +1,23 @@ +local io = terralib.includec("stdio.h") + +struct Count { value : int } +function luafn(a) + print("lua:",a.value) + a.value = a.value + 1 + terrafn(a) +end +terra terrafn(a : &Count) + io.printf("terra: %d\n",a.value) + if a.value < 100 then + luafn(a) + end + return a.value +end + +terra begin() + var c = Count {0} + return terrafn(&c) +end + +local test = require("test") +test.eq(begin(),100) \ No newline at end of file diff --git a/samples/Terra/bug.t b/samples/Terra/bug.t new file mode 100644 index 00000000..5d2f860d --- /dev/null +++ b/samples/Terra/bug.t @@ -0,0 +1,20 @@ +local f = assert(io.popen("uname", 'r')) +local s = assert(f:read('*a')) +f:close() + +if s~="Darwin\n" then + print("Warning, not running test b/c this isn't a mac") +else + + +local OC = require("lib/objc") +local OCR = terralib.includec("objc/runtime.h") + +terra main() + var nsobject = OC.NSObject + OCR.objc_allocateClassPair([&OCR.objc_class](nsobject.data),nil,0) +end + +main:compile() + +end \ No newline at end of file diff --git a/samples/Terra/bug2.t b/samples/Terra/bug2.t new file mode 100644 index 00000000..91b77cbd --- /dev/null +++ b/samples/Terra/bug2.t @@ -0,0 +1,20 @@ +ffi = require("ffi") +cstdio = terralib.includec("stdio.h") + +local vec4 = &vector(float,4) + +local align = terralib.aligned +terra lol( w : &float, out : &float) + var a = terralib.attrload(vec4(w),{align = 4}) + terralib.attrstore(vec4(out), a, {align = 4}) +end + +dat = ffi.new("float[?]",32) +for i=0,31 do dat[i]=i end +datO = ffi.new("float[?]",32) + +lol:compile() +lol:disas() + +lol(dat, datO) + diff --git a/samples/Terra/bug3.t b/samples/Terra/bug3.t new file mode 100644 index 00000000..e58be1df --- /dev/null +++ b/samples/Terra/bug3.t @@ -0,0 +1,15 @@ + + +local S = terralib.types.newstruct("mystruct") + +struct A { + v : int +} + +S.entries:insert( { type = A, field = "what" } ) +terra foo() + var v : S + return v.what.v +end + +foo:compile() diff --git a/samples/Terra/bug4.t b/samples/Terra/bug4.t new file mode 100644 index 00000000..2690b028 --- /dev/null +++ b/samples/Terra/bug4.t @@ -0,0 +1,14 @@ +c = terralib.includecstring [[ + #include + #include +]] +struct exception { slug : int8[60]; code : int; msg : int8[960]; } +EXC_INFO = terralib.new(exception) +terra bar() c.memcpy(EXC_INFO.slug + 0, 'foobar', 7); c.printf('%s\n', EXC_INFO.slug + 0); end +bar() + +terra zoo() EXC_INFO.slug[0] = 65; EXC_INFO.slug[1] = 0; c.printf('%s\n', EXC_INFO.slug + 0); end +zoo() + +terra zoo2() EXC_INFO.slug[0] = 65; EXC_INFO.slug[1] = 0; return EXC_INFO.slug[0] end +assert(zoo2() == 65) \ No newline at end of file diff --git a/samples/Terra/calc.t b/samples/Terra/calc.t new file mode 100644 index 00000000..2167f2b8 --- /dev/null +++ b/samples/Terra/calc.t @@ -0,0 +1,33 @@ +function makecalcfn(inst) + local stk = {} + for i,v in ipairs(inst) do + if type(v) == "number" then + table.insert(stk,`v) + else + local b = table.remove(stk) + local a = table.remove(stk) + + if v == "+" then + table.insert(stk,`a + b) + elseif v == "-" then + table.insert(stk,`a - b) + elseif v == "*" then + table.insert(stk,`a * b) + elseif v == "/" then + table.insert(stk,`a / b) + end + end + end + + local result = table.remove(stk) + + local terra wrapper() + return result + end + + return wrapper +end + +local calcfn = makecalcfn({5,4,"*",5,"-",3,"+"}) +local test = require("test") +test.eq(calcfn(),18) diff --git a/samples/Terra/call.t b/samples/Terra/call.t new file mode 100644 index 00000000..4bf49c62 --- /dev/null +++ b/samples/Terra/call.t @@ -0,0 +1,53 @@ + +terra bar(a : int, b : int) : int + return a + b +end +terra foo(a : int,b : int) : int + return bar(a,b) + 1 +end + +terra baz(a : int, b : int) : int + var f,c,d = 4,baz2(a,b) + return f + c + d +end and +terra baz2(a : int, b : int) : {int, int} + return a + 1, b + 2 +end + +terra two(a : int, b : int) : int + return a + b +end +terra baz3() : int + var a,b = baz2(1,2) + return two(a,b) +end +terra baz4() : int + return two(5,(baz2(1,2))._0) +end + +terra baz5() + var a,b = baz2(0,0) + return 1,2,a,b +end + +terra baz6() + var a,b,c,d = baz5() + var e = (baz5()._0) + return a + b + c + d + e +end + +terra baz7(a : int) + if a < 3 then + return 1,(baz5())._0 + else + return 100,2 + end +end +local test = require("test") + +test.eq(foo(2,3),6) +test.eq(baz(1,2),10) +test.eq(baz3(),6) +test.eq(baz4(),7) +test.eq(baz6(),7) +test.meq({100,2},baz7(10)) \ No newline at end of file diff --git a/samples/Terra/callbackcache.t b/samples/Terra/callbackcache.t new file mode 100644 index 00000000..06450cf3 --- /dev/null +++ b/samples/Terra/callbackcache.t @@ -0,0 +1,9 @@ + + +for i = 1,10 do + local terra doprint() + print(1,2) + print(3) + end + doprint() +end \ No newline at end of file diff --git a/samples/Terra/canon.t b/samples/Terra/canon.t new file mode 100644 index 00000000..c07ffaae --- /dev/null +++ b/samples/Terra/canon.t @@ -0,0 +1,45 @@ + +struct B { + a : A +} and +struct A { + b : &B +} + + + + +struct C { + i : int +} +local U = struct { c : C } +local UP = &U + + +local FP = UP -> int +local FP2 = UP -> int + +local FI = int -> int +local FI2 = int -> int +terra anon() + var b : B + b.a.b = &b + return 4 +end + +terra anon2() + var u = U { C {3} } + + var fp : FP, fi : FI + var fi2 : FI2 = fi + var fp2 : FP2 = fp + var up : UP = &u + return up.c.i +end + + + +test = require("test") + +test.eq(anon(),4) +test.eq(anon2(),3) \ No newline at end of file diff --git a/samples/Terra/canon2.t b/samples/Terra/canon2.t new file mode 100644 index 00000000..a73b8577 --- /dev/null +++ b/samples/Terra/canon2.t @@ -0,0 +1,41 @@ +local C = terralib.includecstring [[ + typedef union { + float v[2]; + struct { + float x; + float y; + }; + } float2; + static float2 a; + void doit() { + a.x = 4; + a.y = 5; + } + float2* what() { return &a; } +]] + +C.float2:printpretty() + +local anonstructgetter = macro(function(name,self) + for i,e in pairs(self:gettype():getfields()) do + if e.key:match("_%d+") and e.type:getfield(name) then + return `self.[e.key].[name] + end + end + error("no field "..name.." in struct of type "..tostring(T)) +end) + +C.float2.metamethods.__entrymissing = anonstructgetter + +terra foo(pa : &C.float2) + var a = @C.what() + return a.v[0],a.v[1],a.x,a.y +end + +C.doit() + +local a = foo(C.what()) +assert(4 == a._0) +assert(5 == a._1) +assert(4 == a._2) +assert(5 == a._3) \ No newline at end of file diff --git a/samples/Terra/cast.t b/samples/Terra/cast.t new file mode 100644 index 00000000..6de7f79d --- /dev/null +++ b/samples/Terra/cast.t @@ -0,0 +1,11 @@ +terra bar(a : int) : int + return a + 1 +end +terra foo(a : int) : int + + return a +end + +local test = require("test") +test.eq(foo(2),2) +test.eq(bar(2),3) diff --git a/samples/Terra/cbool.t b/samples/Terra/cbool.t new file mode 100644 index 00000000..cfa7cd4a --- /dev/null +++ b/samples/Terra/cbool.t @@ -0,0 +1,13 @@ + + +C = terralib.includecstring [[ + _Bool And(_Bool a, _Bool b) { return a && b; } +]] + + +terra foobar(a : bool, b : bool) + return C.And(a,b) +end + +assert(foobar(false,true) == false) +assert(foobar(true,true) == true) \ No newline at end of file diff --git a/samples/Terra/cconv.t b/samples/Terra/cconv.t new file mode 100644 index 00000000..ba12b5e9 --- /dev/null +++ b/samples/Terra/cconv.t @@ -0,0 +1,488 @@ + +local test = require("test") + +terra f1(a : int) + return a +end + +terra c1() + return 1 + f1(4),f1(4) +end + +terra f2(a : int, b : float) + return a + b +end + +terra c2() + return f2(3,4) + 1, f2(3,4) +end + + +terra f3() + return 3,4 +end + +terra c3() + var r = f3() + return f3()._0 + 1,unpackstruct(r) +end + +terra f4() : {float,float} + return 3.25,4.25 +end + +terra c4() + var r = f4() + return f4()._0 + 1, unpackstruct(r) +end + + +terra f5(a : int) : {uint8,uint8,uint8,uint8} + return 0,1,a,3 +end + +terra c5() + var r = f5(8) + return f5(8)._0 + 1, unpackstruct(r) +end + +terra f6() : {double, double, int} + return 3.25, 4.25, 3 +end + +terra c6() + var r = f6() + return f6()._0 + 1, unpackstruct(r) +end +test.meq({4.25, 3.25,4.25,3},c6()) + +terra f7(a : int) : {double, double, int} + return 3.25, 4.25, a +end + +terra c7() + var r = f7(4) + return f7(4)._0 + 1, unpackstruct(r) +end +test.meq({4.25,3.25,4.25,4},c7()) + +terra f8() : {double, double} + return 3.25, 4.25 +end + +terra c8() + var r= f8() + return f8()._0 + 1, unpackstruct(r) +end + +test.meq({4.25,3.25,4.25},c8()) + +struct S1 { + a : int; + b : int; +} + +terra f9(a : S1) + return a.a+1,a.b+2 +end + +terra c9() + var a = S1 { 4, 5} + var r = f9(a) + return f9(a)._0 + 1, unpackstruct(r) +end +test.meq({6,5,7},c9()) + +struct S2 { + a : int; + b : double; + c : double; +} + +terra f10(a : S2) + return a.a, a.b, a.c +end + +terra c10() + var s2 = S2 { 4,5,6 } + var r = f10(s2) + return f10(s2)._0 + 1, unpackstruct(r) +end + +test.meq({5,4,5,6},c10()) + +C = terralib.includec("stdio.h") + +terra f11(a : int) + C.printf("f11 %d\n",a) +end + + +terra c11() + f11(7) +end +c11() + +struct S3 { + a : vector(float,2); + b : double; +} + +struct S4 { + b : double; + a : vector(float,2); +} + +struct S5 { + a : vector(uint8,4); + b : int; +} + +terra f12a(a : S3) + return a.a[0] + a.a[1], a.b +end + +terra c12a() + var a = S3 { vector(2.25f, 3.25f), 4 } + var r = f12a(a) + return f12a(a)._0 + 1, unpackstruct(r) +end +test.meq({6.5,5.5,4},c12a()) + +terra f12b(a : S4) + return a.a[0] + a.a[1], a.b +end + +terra c12b() + var a = S4 { 4, vector(2.25f, 3.25f) } + var r = f12b(a) + return f12b(a)._0 + 1, unpackstruct(r) +end +test.meq({6.5,5.5,4},c12b()) + + +terra f12() + var a = S3 { vector(8.f,2.f), 3.0 } + var b = S4 { 3.0, vector(8.f,2.f) } + var c,d = f12a(a) + var e,f = f12b(b) + return c,d,e,f +end + +terra f13a(a : S5) + return a.a[0] + a.a[1] + a.a[2] + a.a[3], a.b +end + +terra f13() + var a = S5 { vectorof(int8, 1,2,3,4), 5 } + return f13a(a) +end + + +struct S6 { + a : float; + aa : float; + b : float +} + +struct S7a { + a : int; + b : int; +} +struct S7 { + a : int; + b : S7a; + c : int; +} + +terra f14(a : S6) + return a.a,a.aa,a.b +end + +terra c14() + var a = S6 { 4,2,3} + var r = f14(a) + return f14(a)._0 + 1, unpackstruct(r) +end +test.meq({5,4,2,3},c14()) + +terra f15(a : S7) + return a.a, a.b.a, a.b.b, a.c +end + +terra c15() + var a = S7 {1, S7a { 2,3 }, 4} + var r = f15(a) + return f15(a)._0 + 1, unpackstruct(r) +end + +test.meq({2,1,2,3,4}, c15()) + +struct S8 { + a : uint8[7]; +} + +terra f16(a : S8) + return a.a[0],a.a[6] +end + +terra c16() + var a = S8 { arrayof(uint8, 1,2,3,4,5,6,7) } + var r = f16(a) + return f16(a)._0 + 1, unpackstruct(r) +end + +test.meq({2,1,7},c16()) + +struct S9 { + a : uint8[9]; +} + +terra f17(a : S9) + return a.a[0],a.a[8] +end + +terra c17() + var a = S9 { arrayof(uint8, 1,2,3,4,5,6,7,8,9) } + var r = f17(a) + return f17(a)._0 + 1, unpackstruct(r) +end + + +test.meq({2,1,9},c17()) + + +struct S10 { + a : double; + b : int64 +} + + +terra f18a(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a5 : int, a : S10) + return a.a, a.b +end + +terra c18a() + var r = f18a(1,2,3,4,5,6,S10{7,8}) + return f18a(1,2,3,4,5,6,S10{7,8})._0 + 1, unpackstruct(r) +end + +test.meq({8,7,8},c18a()) + + +terra f18b(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a : S10) + return a.a, a.b +end + +terra c18b() + var r = f18b(1,2,3,4,5,S10{7,8}) + return f18b(1,2,3,4,5,S10{7,8})._0 + 1, unpackstruct(r) +end + +test.meq({8,7,8},c18b()) + +terra f18c(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a : S10) + return a.a, a.b, a0, a1, a2 +end +terra c18c() + var r = f18c(1,2,3,4,5,S10 {7,8}) + return f18c(1,2,3,4,5,S10{7,8})._0 + 1, unpackstruct(r) +end + +test.meq({8,7,8,1,2,3},c18c()) + +struct S11 { + a : float; + b : int; +} + +terra f18d(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a5 : int, a : S11) + return a.a, a.b +end +terra c18d() + var r = f18d(1,2,3,4,5,6,S11{7,8}) + return f18d(1,2,3,4,5,6,S11{7,8})._0 + 1, unpackstruct(r) +end +test.meq({8,7,8},c18d()) + + +terra f18e(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a : S11) + return a.a, a.b +end + +terra c18e() + var r = f18e(1,2,3,4,5,S11{7,8}) + return f18e(1,2,3,4,5,S11{7,8})._0 + 1, unpackstruct(r) +end + +test.meq({8,7,8},c18e()) + +terra f18f(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a : S11) + return a.a, a.b, a0, a1, a2 +end + +terra c18f() + var r = f18f(1,2,3,4,5,S11{7,8}) + return f18f(1,2,3,4,5,S11{7,8})._0 + 1, unpackstruct(r) +end + +test.meq({8,7,8,1,2,3},c18f()) + + +terra f18g(a0 : float, a1 : float, a2 : float, a3 : float, a4: float, a5 : float, a6 : float, a7 : float, a : S10) + return a.a, a.b +end + +terra c18g() + var r = f18g(1,2,3,4,5,6,9,10,S10{7,8}) + return f18g(1,2,3,4,5,6,9,10,S10{7,8})._0 + 1, unpackstruct(r) +end + +test.meq({8,7,8},c18g()) + +terra f18h(a0 : float, a1 : float, a2 : float, a3 : float, a4: float, a5 : float, a6 : float, a : S10) + return a.a, a.b +end + +terra c18h() + var r = f18h(1,2,3,4,5,6,9,S10{7,8}) + return f18h(1,2,3,4,5,6,9,S10{7,8})._0 + 1, unpackstruct(r) +end + +test.meq({8,7,8},c18h()) + +terra f18i(a0 : float, a1 : float, a2 : float, a3 : float, a4: float, a5 : float, a6 : float, a : S10) + return a.a, a.b, a0, a1, a2 +end + +terra c18i() + var r = f18i(1,2,3,4,5,6,9,S10{7,8}) + return f18i(1,2,3,4,5,6,9,S10{7,8})._0 + 1, unpackstruct(r) +end + +test.meq({8,7,8,1,2,3},c18i()) + +struct S12 { + a : float; + b : int; +} + +terra f19(a : S12) + return a.a, a.b +end +terra c19() + var a = S12 { 3,5 } + var r = f19(a) + return f19(a)._0 + 1, unpackstruct(r) +end +test.meq({4,3,5},c19()) + + + +terra f20(a : S10, b : int) + return a.a,a.b,b +end +terra c20() + var r = f20(S10{1,2},3) + return f20(S10{1,2},3)._0 + 1, unpackstruct(r) +end +test.meq({2,1,2,3},c20()) + + +terra f21() + return +end +f21() + +terra f22() + return S12 { 3, 4} +end +terra c22() + return f22().a, f22() +end +local s22_0, s22_1 = terralib.unpackstruct(c22()) +test.eq(s22_0,3) +test.eq(s22_1.a,3) +test.eq(s22_1.b,4) + +terra f23() + return S10 { 1, 2} +end + +terra c23() + return f23().a, f23() +end +local s23_0, s23_1 = terralib.unpackstruct(c23()) +test.eq(s23_0,1) +test.eq(s23_1.a,1) +test.eq(s23_1.b,2) + +terra f24() + return S2 { 1,2,3} +end + +terra c24() + return f24().a, f24() +end +local s24_0, s24_1 = terralib.unpackstruct(c24()) +test.eq(s24_0,1) +test.eq(s24_1.a,1) +test.eq(s24_1.b,2) +test.eq(s24_1.c,3) + + +local s22 = f22() +test.eq(s22.a,3) +test.eq(s22.b,4) + +local s23 = f23() +test.eq(s23.a,1) +test.eq(s23.b,2) + + +local s24 = f24() + +test.eq(s24.a,1) +test.eq(s24.b,2) +test.eq(s24.c,3) + + +test.meq({1,2,3},f20({1,2},3)) + + +test.eq(f1(3),3) +test.eq(f2(4,5),9) +test.meq({3,4},f3()) +test.meq({3.25,4.25},f4()) +test.meq({0,1,2,3},f5(2)) +test.meq({3.25,4.25,3},f6()) +test.meq({3.25,4.25,4},f7(4)) +test.meq({3.25,4.25},f8()) +test.meq({3,5},f9({2,3})) +test.meq({1,2.5,3.5},f10({1,2.5,3.5})) +f11(3) +test.meq({10,3,10,3},f12()) +test.meq({10,5},f13()) +test.meq({4,5,6},f14({4,5,6})) +test.meq({1,2,3,4},f15({1,{2,3},4})) +test.meq({1,7},f16({{1,2,3,4,5,6,7}})) +test.meq({1,9},f17({{1,2,3,4,5,6,7,8,9}})) +test.meq({7,8},f18a(1,2,3,4,5,6,{7,8})) +test.meq({7,8},f18b(1,2,3,4,5,{7,8})) +test.meq({7,8,1,2,3},f18c(1,2,3,4,5,{7,8})) + +test.meq({7,8},f18d(1,2,3,4,5,6,{7,8})) +test.meq({7,8},f18e(1,2,3,4,5,{7,8})) +test.meq({7,8,1,2,3},f18f(1,2,3,4,5,{7,8})) + +test.meq({9,10},f18g(1,2,3,4,5,6,7,8,{9,10})) +test.meq({9,10},f18h(1,2,3,4,5,6,7,{9,10})) +test.meq({9,10,1,2,3},f18i(1,2,3,4,5,6,7,{9,10})) + +test.meq({4,5}, f19({4,5})) + +test.meq({5,4},c1()) +test.meq({8,7},c2()) +test.meq({4,3,4},c3()) +test.meq({4.25,3.25,4.25},c4()) +test.meq({1,0,1,8,3},c5()) \ No newline at end of file diff --git a/samples/Terra/cfgbug.t b/samples/Terra/cfgbug.t new file mode 100644 index 00000000..b1f9b31c --- /dev/null +++ b/samples/Terra/cfgbug.t @@ -0,0 +1,14 @@ +local struct Type { + field: int +} + +local terra foo(obj: Type) end +foo:setinlined(false) + +local terra bar() + var obj: Type + defer foo(obj) + return +end + +bar() \ No newline at end of file diff --git a/samples/Terra/clanginfo.t b/samples/Terra/clanginfo.t new file mode 100644 index 00000000..b1d27a70 --- /dev/null +++ b/samples/Terra/clanginfo.t @@ -0,0 +1 @@ +terralib.includec("stdio.h",{"-v"}) diff --git a/samples/Terra/class.t b/samples/Terra/class.t new file mode 100644 index 00000000..e02546d9 --- /dev/null +++ b/samples/Terra/class.t @@ -0,0 +1,235 @@ + +IO = terralib.includec("stdio.h") +local Class = require("lib/javalike") + +struct A { + a : int +} +terra A:times2() : int + return self.a*2 +end + +struct B { + b : int +} +Class.extends(B,A) + +terra B:combine(a : int) : int + return self.b + self.a + a +end + + +struct C { + c : double +} +Class.extends(C,B) + +terra C:combine(a : int) : int + return self.c + self.a + self.b + a +end +terra C:times2() : double + return self.a * 4 +end + +terra doubleAnA(a : &A) + return a:times2() +end + +terra combineAB(b : &B) + return b:combine(3) +end + +terra returnA(a : A) + return a +end +terra foobar1() + var c = C.alloc() + c.a,c.b,c.c = 1,2,3.5 + return c:times2() +end + +assert(foobar1() == 4) + +terra foobar() + + var a = A.alloc() + a.a = 1 + var b = B.alloc() + b.a,b.b = 1,2 + + var c = C.alloc() + c.a,c.b,c.c = 1,2,3.5 + + var r = doubleAnA(a) + doubleAnA(b) + doubleAnA(c) + combineAB(b) + combineAB(c) + + a:free() + b:free() + c:free() + + return r +end + +assert(23 == foobar()) + +Doubles = Class.interface { times2 = {} -> int } + +Adds = Class.interface { add = int -> int } + +struct D { + data : int +} +Class.implements(D,Doubles) +Class.implements(D,Adds) + + +terra D:times2() : int + return self.data * 2 +end + +terra D:add(a : int) : int + return self.data + a +end + + +terra aDoubles(a : &Doubles) + return a:times2() +end + +terra aAdds(a : &Adds) + return a:add(3) +end + +terra foobar2() + var a : D + a:init() + a.data = 3 + return aDoubles(&a) + aAdds(&a) +end + +assert(12 == foobar2()) + + +local IO = terralib.includec("stdio.h") +struct Animal { + data : int +} +terra Animal:speak() : {} + IO.printf("... %d\n",self.data) +end + +struct Dog { +} +Class.extends(Dog,Animal) +terra Dog:speak() : {} + IO.printf("woof! %d\n",self.data) +end + +struct Cat { +} + +Class.extends(Cat,Animal) + +terra Cat:speak() : {} + IO.printf("meow! %d\n",self.data) +end + +terra dospeak(a : &Animal) + a:speak() +end + +terra barnyard() + var c : Cat + var d : Dog + c:init() + d:init() + c.data,d.data = 0,1 + + dospeak(&c) + dospeak(&d) +end +barnyard() + + +local Add = Class.interface { add = int -> int } + +local Sub = Class.interface { sub = int -> int } + +local struct P { + data : int +} +Class.implements(P,Add) + +local struct C { + data2 : int +} +Class.extends(C,P) +Class.implements(C,Sub) + +terra P:add(b : int) : int + self.data = self.data + b + return self.data +end + +terra C:sub(b : int) : int + return self.data2 - b +end + +terra doadd(a : &Add) + return a:add(1) +end + +terra dopstuff(p : &P) + return p:add(2) + doadd(p) +end + +terra dosubstuff(s : &Sub) + return s:sub(1) +end + +terra dotests() + var p : P + p:init() + var c : C + c:init() + p.data = 1 + c.data = 1 + c.data2 = 2 + return dopstuff(&p) + dopstuff(&c) + dosubstuff(&c) +end + +assert(dotests() == 15) + +terra timeadd(a :&P, N : int) + IO.printf("%p\n",a) + for i = 0, N,10 do + a:add(1) + a:add(1) + a:add(1) + a:add(1) + a:add(1) + a:add(1) + a:add(1) + a:add(1) + a:add(1) + a:add(1) + end + return a +end + +local a = global(C) + +terra doinit() : &P + a:init() + a.data = 0 + return &a +end + +local v = doinit() +timeadd:compile() + +local b = terralib.currenttimeinseconds() +--timeadd(v,100000000) +local e = terralib.currenttimeinseconds() +print(e - b) +print(v.data) + diff --git a/samples/Terra/class2.t b/samples/Terra/class2.t new file mode 100644 index 00000000..1af0da25 --- /dev/null +++ b/samples/Terra/class2.t @@ -0,0 +1,45 @@ +local Interface = require("lib/golike") + +local I = Interface.create { + get = {} -> int; + set = int -> {}; +} + +struct A { + data : int +} + +terra A:get() + return self.data +end + +terra A:set(a : int) + self.data = a +end + +struct B { + data : int +} + +terra B:get() + return self.data + 1 +end + +terra B:set(a : int) + self.data = self.data + a +end + + +terra anInterface(a : I) + a:set(3) + return a:get() +end + +terra foo() + var a = A { 0 } + var b = B { 2 } + return anInterface(&a) + anInterface(&b) +end + +local test = require("test") +test.eq(foo(),9) \ No newline at end of file diff --git a/samples/Terra/class3.t b/samples/Terra/class3.t new file mode 100644 index 00000000..8ecc6963 --- /dev/null +++ b/samples/Terra/class3.t @@ -0,0 +1,36 @@ + +C = terralib.includec("stdio.h") + +local Class = require("lib/javalike") + + +local Prints = Class.interface { print = {} -> {} } + +struct Leaf { + data : int +} +Class.implements(Leaf,Prints) + +terra Leaf:print() : {} + C.printf("%d\n",self.data) +end + + +struct Node { + next : &Leaf +} +Class.extends(Node,Leaf) + +terra Node:print() : {} + C.printf("%d\n",self.data) + self.next:print() +end + +terra test() + var a,b = Leaf.alloc(), Node.alloc() + a.data,b.data,b.next = 1,2,a + var p : &Prints = b + p:print() +end + +test() \ No newline at end of file diff --git a/samples/Terra/class4.t b/samples/Terra/class4.t new file mode 100644 index 00000000..f369adba --- /dev/null +++ b/samples/Terra/class4.t @@ -0,0 +1,22 @@ +J = require("lib/javalike") + +struct Shape { + foo : int +} + +Drawable = J.interface { draw = {} -> {} } + +struct Square { + length : int +} +J.extends(Square,Shape) +J.implements(Square,Drawable) + +terra Square:draw() : {} end + +terra bar() + var a : &Square = Square.alloc() + a:draw() +end + +bar() \ No newline at end of file diff --git a/samples/Terra/class5.t b/samples/Terra/class5.t new file mode 100644 index 00000000..ab021c59 --- /dev/null +++ b/samples/Terra/class5.t @@ -0,0 +1,54 @@ + +IO = terralib.includec("stdio.h") +local Class = require("lib/javalike") + +struct A { + a : int; + bb : &B +} and struct B { + b : int; + aa : &A +} +Class.extends(B,A) + + +terra A:times2() : int + return self.a*2 +end + +terra B:combine(a : int) : int + return self.b + self.a + a +end + + +struct C { + c : double +} +Class.extends(C,B) + +terra C:combine(a : int) : int + return self.c + self.a + self.b + a +end +terra C:times2() : double + return self.a * 4 +end + +terra doubleAnA(a : &A) + return a:times2() +end + +terra combineAB(b : &B) + return b:combine(3) +end + +terra returnA(a : A) + return a +end +terra foobar1() + var c = C.alloc() + c.a,c.b,c.c = 1,2,3.5 + return c:times2() +end + +assert(foobar1() == 4) + diff --git a/samples/Terra/class6.t b/samples/Terra/class6.t new file mode 100644 index 00000000..008610db --- /dev/null +++ b/samples/Terra/class6.t @@ -0,0 +1,66 @@ + +IO = terralib.includec("stdio.h") +local Class = require("lib/javalikesimple") + +struct A { + a : int +} +terra A:times2() : int + return self.a*2 +end + +struct B { + b : int +} +Class.extends(B,A) + +terra B:combine(a : int) : int + return self.b + self.a + a +end + +struct C { + c : double +} +Class.extends(C,B) + +terra C:combine(a : int) : int + return self.c + self.a + self.b + a +end +terra C:times2() : double + return self.a * 4 +end + +terra doubleAnA(a : &A) + return a:times2() +end + +terra combineAB(b : &B) + return b:combine(3) +end + +terra foobar1() + var c : C + c:init() + c.a,c.b,c.c = 1,2,3.5 + return c:times2() +end + +assert(foobar1() == 4) + +terra foobar() + + var a : A, b : B, c : C + a:init(); b:init(); c:init() + + a.a = 1 + b.a,b.b = 1,2 + c.a,c.b,c.c = 1,2,3.5 + + var r = b:times2() + doubleAnA(&a) + doubleAnA(&b) + doubleAnA(&c) + combineAB(&b) + combineAB(&c) + + return r +end + + +assert(25 == foobar()) + diff --git a/samples/Terra/classifyfloatstructs.t b/samples/Terra/classifyfloatstructs.t new file mode 100644 index 00000000..e9c4d66b --- /dev/null +++ b/samples/Terra/classifyfloatstructs.t @@ -0,0 +1,137 @@ +-- reading and returning by reference produces far more compact assembly +-- in terra than reading and returning by value, even when a by-value function +-- is embedded in a by-reference wrapper. Also, optimization behavior varies +-- wildly. Here's a demonstration: + +local float4 = tuple(float,float,float,float) + +-- first, comparing assembly code size of stand-alone functions which all do +-- the same operation, in different styles. This is after aggressive +-- optimization by the LLVM backend +-------------------------------------------------------------------------------- + +-- read by value, return by value +-- 26 instructions, 120 bytes +local terra add4_val_val(a : float4, b : float4) : float4 + return { + a._0+b._0, + a._1+b._1, + a._2+b._2, + a._3+b._3 + } +end + +-- read by value, return by reference +-- 24 instructions, 103 bytes +local terra add4_val_ref(c : &float4, a : float4, b: float4) : {} + c._0 = a._0 + b._0 + c._1 = a._1 + b._1 + c._2 = a._2 + b._2 + c._3 = a._3 + b._3 +end + +-- read by reference, return by value +-- 14 instructions, 74 bytes +local terra add4_ref_val(a : &float4, b : &float4) : float4 + return { + a._0+b._0, + a._1+b._1, + a._2+b._2, + a._3+b._3 + } +end + +-- read by reference, return by reference +-- 12 instructions, 57 bytes +local terra add4_ref_ref(c : &float4, a : &float4, b: &float4) : {} + c._0 = a._0 + b._0 + c._1 = a._1 + b._1 + c._2 = a._2 + b._2 + c._3 = a._3 + b._3 +end + +-- read by reference, return by reference, BUT use temporary variables +-- 4 instructions, 12 bytes (!!!) +-- what happens here is that the tempvars are understood and treated +-- as a single SIMD register, and so only one addition is executed. +-- this is already reflected in the bytecode passed to LLVM, so I suppose +-- terra does this optimization. +local terra add4_ref_ref_tempvar(c : &float4, a : &float4, b: &float4) : {} + var x = a._0 + b._0 + var y = a._1 + b._1 + var z = a._2 + b._2 + var w = a._3 + b._3 + c._0 = x + c._1 = y + c._2 = z + c._3 = w +end + +-- turn on always-inline for later +add4_val_val:setinlined(true) +add4_val_ref:setinlined(true) +add4_ref_val:setinlined(true) +add4_ref_ref:setinlined(true) + +-- uncomment to look at individual LLVM bytecode & disassembly +add4_val_val:disas() +-- add4_val_ref:disas() +-- add4_ref_val:disas() +-- add4_ref_ref:disas() +-- add4_ref_ref_tempvar:disas() + + +if terralib.lookupsymbol and require("ffi").os ~= "Windows" then + terra sizecheck() + var si : terralib.SymbolInfo + terralib.lookupsymbol(add4_val_val,&si) + return si.size + end + assert(sizecheck() < 16) +end +-------------------------------------------------------------------------------- + +-- up to this point, one could argue that functions are always inlined into +-- other functions, and that the instructions dissolve in the greater scheme +-- of things. + +-- if that is true, let's attempt to convert one style into another and see +-- if the optimizations catch up. + +-- read by value, return by value -> read by reference, return by reference +-- the clunky solution to the slim interface +-- 38 instructions (!), 193 bytes (!!), so it gets *worse* +local terra add4_val_val_to_ref_ref(c : &float4, a : &float4, b: &float4) : {} + @c = add4_val_val(@a, @b) +end + +-- read by reference, return by reference -> read by value, return by value +-- the slim solution to the clunky interface +-- 13 instructions, 61 bytes with tempvar -- wow, that's better than +-- the original function with the actual code in it! +local terra add4_ref_ref_to_val_val(a : float4, b : float4) : float4 + var c : float4 + add4_ref_ref_tempvar(&c, &a, &b) + return c +end + +-- so what happens if we do a conversion back to the by-reference interface? +-- 41 instructions, 194 bytes +local terra add4_ref_ref_to_val_val_to_ref_ref(c : &float4, a : &float4, b: &float4) : {} + @c = add4_ref_ref_to_val_val(@a, @b) +end + +-- and nest it once more, back to the by-value interface +-- 47 instructions, 208 bytes +-- so once we pass structs by-value, we'll never recover. +local terra add4_ref_ref_to_val_val_to_ref_ref_to_val_val(a : float4, b : float4) : float4 + var c : float4 + add4_ref_ref_to_val_val_to_ref_ref(&c, &a, &b) + return c +end + +-- uncomment to look at individual disassembly +-- add4_val_val_to_ref_ref:disas() +-- add4_ref_ref_to_val_val:disas() +-- add4_ref_ref_to_val_val_to_ref_ref:disas() +-- add4_ref_ref_to_val_val_to_ref_ref_to_val_val:disas() \ No newline at end of file diff --git a/samples/Terra/clean.t b/samples/Terra/clean.t new file mode 100644 index 00000000..078a3963 --- /dev/null +++ b/samples/Terra/clean.t @@ -0,0 +1,17 @@ +local c = terralib.includec("stdio.h") + +iamclean = macro(function(arg) + return quote + var a = 3 + return a,arg + end +end) + +terra doit() + var a = 4 + iamclean(a) +end + +local a = doit() +local test = require("test") +test.meq({3,4}, a) \ No newline at end of file diff --git a/samples/Terra/cnames.t b/samples/Terra/cnames.t new file mode 100644 index 00000000..5a487ce2 --- /dev/null +++ b/samples/Terra/cnames.t @@ -0,0 +1,25 @@ +struct Foo { + c : float; +} +Foo.displayname = "struct.Foo" +terra useFoo() + var a : Foo + a.c = 4.5 + return a.c +end +assert(4.5 == useFoo()) + +C = terralib.includecstring [[ +typedef struct { int a; int b; } Foo; +]] + +terra stuff() + var a : Foo + var b : C.Foo + b.a = 1 + b.b = 2 + a.c = 4.5 + return b.a + b.b + a.c +end + +assert(7.5 == stuff()) diff --git a/samples/Terra/cnamespace.t b/samples/Terra/cnamespace.t new file mode 100644 index 00000000..dc3c6cc2 --- /dev/null +++ b/samples/Terra/cnamespace.t @@ -0,0 +1,24 @@ +G,T = terralib.includecstring [[ + typedef struct { + double c; + } A; + struct A { + int b; + }; +]] + +G2,T2 = terralib.includecstring [[ + struct A; + typedef struct C A; +]] + +assert(T2.A == T.A) +assert(G2.A ~= T2.A and G2.A ~= G.A) +terra foo() + var a : G.A + var b : T.A + a.c = 4.5 + b.b = 4.5 + return a.c + b.b +end +assert(8.5 == foo()) \ No newline at end of file diff --git a/samples/Terra/cnamespaces.t b/samples/Terra/cnamespaces.t new file mode 100644 index 00000000..54ad3cd0 --- /dev/null +++ b/samples/Terra/cnamespaces.t @@ -0,0 +1,32 @@ +C,T = terralib.includecstring [[ + + struct Foo { + int a; + }; + typedef int Foo; + typedef struct Foo * Bar; + typedef Foo * Bar2; + Bar bar(struct Foo * a, Bar2 b) { return (Bar)0; } +]] + +terra what() + var f = T.Foo { 3 } + var a : C.Bar = &f + return a.a +end + +assert(3 == what()) + +C,T = terralib.includecstring [[ + typedef struct { int a; } Foo; + typedef Foo * FooPtr; + int returna(FooPtr a) { return a->a; } +]] + +terra what2() + var a : C.Foo = C.Foo { 3 } + var ap : C.FooPtr = &a + return C.returna(ap) +end + +assert(3 == what2()) diff --git a/samples/Terra/compilecallback.t b/samples/Terra/compilecallback.t new file mode 100644 index 00000000..147fdb0e --- /dev/null +++ b/samples/Terra/compilecallback.t @@ -0,0 +1,16 @@ + +local a = 0 +local foo = macro(function(arg) + bar:gettype(function() + a = bar() + end) + a = 1 + return 3 +end) + +terra bar() + return foo() +end + +assert(bar() == 3) +assert(a == 3) \ No newline at end of file diff --git a/samples/Terra/completec.t b/samples/Terra/completec.t new file mode 100644 index 00000000..0b16091e --- /dev/null +++ b/samples/Terra/completec.t @@ -0,0 +1,13 @@ +C = terralib.includecstring [[ + struct A { + int a; + }; + static struct A foo; + struct A * getfoo() { + foo.a = 4; + return &foo; + } +]] + +assert(C.getfoo().a == 4) + diff --git a/samples/Terra/conflict.t b/samples/Terra/conflict.t new file mode 100644 index 00000000..ac871735 --- /dev/null +++ b/samples/Terra/conflict.t @@ -0,0 +1,12 @@ + +terra foo() +end + +foo:compile() +terralib.dumpmodule() + +terralib.includecstring [[ + int foo() { + return 4; + } +]] \ No newline at end of file diff --git a/samples/Terra/constant.t b/samples/Terra/constant.t new file mode 100644 index 00000000..6f44ee87 --- /dev/null +++ b/samples/Terra/constant.t @@ -0,0 +1,35 @@ + + +local foo = terralib.constant(terralib.new(int[4],{1,2,3,4})) + +struct A { + a : int; + b : float +} + +local mystr = terralib.new(A,{3,4.5}) +local const = constant(mystr) + + +terra bar() + return foo[3] + mystr.a +end + +terra bar2() + return foo[1] + mystr.b +end + +function wrapper(a) + return a + 1 +end + +local p1 = terralib.constant(int -> int, wrapper) + +terra doit() + return p1(3) +end + +local test = require("test") +test.eq(bar(),7) +test.eq(bar2(),6.5) +test.eq(doit(),4) diff --git a/samples/Terra/constant2.t b/samples/Terra/constant2.t new file mode 100644 index 00000000..bc18b2ca --- /dev/null +++ b/samples/Terra/constant2.t @@ -0,0 +1,21 @@ + + +local a = terralib.new(int,3) +local b = terralib.new(int8,4) +local c = terralib.new(int64,5) +local d = terralib.new(float,3.25) +local e = terralib.new(double,4.25) + +f = global(4) +terra foo() + return &f +end + +local pf = foo() + +terra bar() + return a + b + c + d + e + @pf +end + +local test = require("test") +test.eq(bar(),23.5) \ No newline at end of file diff --git a/samples/Terra/constructor.t b/samples/Terra/constructor.t new file mode 100644 index 00000000..87161fe9 --- /dev/null +++ b/samples/Terra/constructor.t @@ -0,0 +1,12 @@ + +local b = 1 +local dd = "d" +local c = symbol() + +terra foo() + var a = { _0 = [b], [c] = 2, [dd] = 3, r = 4} + return a._0 + a.[c] + a.d + a.r +end + +local test = require("test") +test.eq(foo(),10) \ No newline at end of file diff --git a/samples/Terra/coverage.t b/samples/Terra/coverage.t new file mode 100644 index 00000000..e865d664 --- /dev/null +++ b/samples/Terra/coverage.t @@ -0,0 +1,47 @@ +function failit(match,fn) + local success,msg = pcall(fn) + if success then + error("failed to fail.",2) + elseif not string.match(msg,match) then + error("failed wrong: "..msg,2) + end +end +local test = require("test") +local erd = "Errors reported during" + +local terra f1() + return test +end + +failit(erd,function() +f1:compile() +end) +failit("referencing a function which failed to compile",function() +f1:compile() +end) +failit(erd,function() + local terra foo() + f1() + end + foo() +end) + + +local struct A { + a : int +} + +A.metamethods.__getentries = function(self) + error("I AM BAD") +end + +failit(erd,function() + A:complete() +end) + +failit(erd,function() + local terra foo() + var a : A + end + foo() +end) diff --git a/samples/Terra/coverage2.t b/samples/Terra/coverage2.t new file mode 100644 index 00000000..b74377f7 --- /dev/null +++ b/samples/Terra/coverage2.t @@ -0,0 +1,209 @@ +function failit(match,fn) + local success,msg = pcall(fn) + if success then + error("failed to fail.",2) + elseif not string.match(msg,match) then + error("failed wrong: "..msg,2) + end +end +local test = require("test") +local erd = "Errors reported during" + +failit(erd,function() +local aglobal = 5 +local terra foo() + return [ (function() aglobal = 4; return 3 end)() ] +end +foo() +end) + +A = terralib.types.newstruct() +A.entries:insert{ field = "a", type = int[2] } + +A.metamethods.__getentries = function() error("NOPE") end + +failit(erd,function() + A:complete() +end) +local terra foo() + var a : int[2] + return 3 +end +foo:compile() +local a = 0 +foo:gettype(function() + a = a + 1 +end) +assert(a == 1) + +local terra errored +failit(erd,function() + terra errored() + return A + end + errored:compile() +end) +failit("referencing a function which failed to compile",function() + errored() +end) + +local terra ol(a : int) return a end +terra ol(a : int, b : int) return a + b end + +assert(ol(3) == 3) +assert(ol(3,4) == 7) + +failit("bad argument #1",function() + ol("a") +end) + +ol:printstats() +NSE = terralib.types.newstruct() + +failit(erd,function() + NSE.entries:insert { field = "a", type = "b" } + NSE:complete() +end) + +SICS = terralib.types.newstruct() +SICS.entries:insert { field = symbol(), type = int } +a = 1 +SICS.metamethods.__staticinitialize = function() a = a + 1 end +print(terralib.new(SICS,{3})) + +NSF = terralib.types.newstruct() +NSF.entries:insert { type = int , field = 3 } + +failit(erd,function() + NSF:complete() +end) +SICS:complete() +assert(a == 2) +struct SF { + a : SF2 +} and struct SF2 { + a : int +} +SF2.metamethods.__getentries = function(self) SF:complete() end +failit(erd,function() +SF:complete() +end) +failit("Attempting to get a property of a type that previously resulted in an error.",function() +SF:complete() +end) + +failit(erd,function() + struct SF { b : int } +end) + + +struct C { + a : int +} + +C.metamethods.__cast = function() return error("CAST ERROR") end + +local terra casttest() + return int(C { 3 }) +end +failit(erd,function() +casttest() +end) + +local terra shiftcheck() + var r = 1 << vector(1,2,3,4) + var r2 = vector(1,2,3,4) << 1 + return r[0],r[1],r[2],r[3],r2[0],r2[1],r2[2],r2[3] +end + +test.meq({2,4,8,16,2,4,6,8},shiftcheck()) + +failit(erd,function() + local terra foo() + return terralib.select(3,4,5) + end + foo() +end) +failit(erd,function() + local terra foo() + return (4):foo() + end + foo() +end) +failit(erd,function() + local terra foo() + return (C {3}):foo() + end + foo() +end) +failit(erd,function() + local a = { a = 4} + local terra foo() + return a() + end + foo() +end) +local saveit +local foom = macro(function(arg) saveit = arg; arg:astype(); end) +failit(erd,function() + local terra foo() + return foom(4) + end + foo() +end) + +failit(erd,function() + local terra foo() + return saveit + end + foo() +end) +failit(erd,function() + local struct A { + a : 3 + } +end) + +failit(erd,function() + local terra foo + local bar = macro(function() foo:compile() end) + terra foo() + return bar() + end + foo() +end) + +struct ATF { + a : int +} + +ATF.metamethods.__getentries = function(self) + local terra foo() + var a : ATF + return a.a + end + foo:compile() +end + +failit(erd,function() + ATF:complete() +end) + +struct FA { + a : &FA2 +} and struct FA2 { + a : int +} + +FA.metamethods.__staticinitialize = function() a = a + 1 end + +FA2.metamethods.__staticinitialize = function(self) + FA:complete() +end + +FA:complete() + +assert(a == 3) +--[[ +freezing asynchronus needs to be called +]] \ No newline at end of file diff --git a/samples/Terra/coverage3.t b/samples/Terra/coverage3.t new file mode 100644 index 00000000..495d6251 --- /dev/null +++ b/samples/Terra/coverage3.t @@ -0,0 +1,107 @@ +function failit(match,fn) + local success,msg = pcall(fn) + if success then + error("failed to fail.",2) + elseif not string.match(msg,match) then + error("failed wrong: "..msg,2) + end +end +local test = require("test") +local erd = "Errors reported during" + +terra foo() +end +foo:compile() +failit("inlining",function() foo:setinlined(false) end) + +terra bar +failit("attempting to call",function() +bar:compile() end) + +failit("expected a name",function() + terralib.intrinsic("far","far") +end) + +print((&int)[4]) + +struct A { + a : int[4]; + b : ∫ + union { c : int; d : int}; + e : int -> int; +} +A:printpretty() + +terra rv() return vector(1,2,3) end + +terra varg(a : vector(int,3)) + + return a[0] + a[1] + a[2] +end + +assert (6 == varg(rv())) + +local something = nil +failit(erd,function() +local terra a([something]) +end +end) + +failit(erd,function() +local terra what() + var a = A { ee = 4 } +end +what:compile() +end) + +A.metamethods.__getmethod = function(self,methodname) + return 1 +end + +failit(erd,function() +local terra what() + var a : A + A.something() +end +what:compile() +end) + +C = terralib.includec("stdio.h") + +--TODO: __sputc isn't consistent across architectures, so this is a bad test +--failit("cannot import",function() +--local a = C.__sputc +--end) + +failit("not found",function() +local a = C.nothing +end) + +terra up() return unpackstruct(3) end +assert(3 == up()) + +failit(erd,function() +local terra aloads(a : &int) + return terralib.attrload(a),terralib.attrload(nil,{3}),terralib.attrstore(a,nil) +end +aloads:compile() +end) + +terra f() end +terra f(a:int) end +failit("overloaded", function() +terralib.saveobj("err.o", { f = f}) +end) + +terra nop() end +terra nilcall(a : tuple(), b : int) + return b,a +end +terra nilstuff() + var a = nop() + var c,b = nilcall(a,4) + return c +end +assert(4 == nilstuff()) + +nilcall:disas() \ No newline at end of file diff --git a/samples/Terra/crash1.t b/samples/Terra/crash1.t new file mode 100644 index 00000000..91732c22 --- /dev/null +++ b/samples/Terra/crash1.t @@ -0,0 +1 @@ +a = &int \ No newline at end of file diff --git a/samples/Terra/crash2.t b/samples/Terra/crash2.t new file mode 100644 index 00000000..789ad7ac --- /dev/null +++ b/samples/Terra/crash2.t @@ -0,0 +1 @@ +a = global( struct { a : int } ) \ No newline at end of file diff --git a/samples/Terra/cstruct.t b/samples/Terra/cstruct.t new file mode 100644 index 00000000..6f4f0d9d --- /dev/null +++ b/samples/Terra/cstruct.t @@ -0,0 +1,20 @@ +local C = terralib.includecstring [[ + +struct teststruct { + int idata; + float fdata; +}; + +void makeitlive(struct teststruct * s) {} + +]] + + +terra foo() + var a : C.teststruct + a.idata = 3 + a.fdata = 3.5 + return a.idata + a.fdata +end + +assert(foo() == 6.5) \ No newline at end of file diff --git a/samples/Terra/cstruct2.t b/samples/Terra/cstruct2.t new file mode 100644 index 00000000..8b557c8a --- /dev/null +++ b/samples/Terra/cstruct2.t @@ -0,0 +1,8 @@ + + +C = terralib.includecstring [[ + typedef struct { int x; int y; } Point; + Point mkpoint() { Point p; p.x = p.y = 3; return p; } +]] + +assert(C.mkpoint().x == 3) \ No newline at end of file diff --git a/samples/Terra/cudaagg.t b/samples/Terra/cudaagg.t new file mode 100644 index 00000000..12fcf4ed --- /dev/null +++ b/samples/Terra/cudaagg.t @@ -0,0 +1,56 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end + +local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) +local ntid = cudalib.nvvm_read_ptx_sreg_ntid_x -- terralib.intrinsic("llvm.nvvm.read.ptx.sreg.ntid.x",{} -> int) + + +struct OneFloat { + a : int; +} + +fn = terra(result : &float, bar : int[5]) + result[tid()] = bar[0] + bar[1] + bar[2] + bar[3] + bar[4] +end +fn:setinlined(false) + +--our very simple cuda kernel +--more work needs to be done to expose the right CUDA intrinsics +--to do more complicated things +foo = terra(result : &float) + fn(result, array(tid(),tid()+1,tid()+2,tid()+3,tid()+4) ) +end + +terralib.includepath = terralib.includepath..";/usr/local/cuda/include" + +local C = terralib.includecstring [[ +#include "cuda_runtime.h" +#include +#include +]] +local R = terralib.cudacompile({ bar = foo }) + +terra doit(N : int) + var data : &float + C.cudaMalloc([&&opaque](&data),sizeof(float)*N) + var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } + R.bar(&launch,data) + var results : &float = [&float](C.malloc(sizeof(float)*N)) + C.cudaMemcpy(results,data,sizeof(float)*N,2) + var result = 0.f + for i = 0,N do + result = result + results[i] + end + return result +end + +local test = require("test") +local N = 16 + +function s(n) return (n - 1) * n / 2 end +function ex(i) return s(N+i) - s(i) end +local expected = ex(0) + ex(1) + ex(2) + ex(3) + ex(4) +test.eq(doit(N),expected) + diff --git a/samples/Terra/cudaaggregate.t b/samples/Terra/cudaaggregate.t new file mode 100644 index 00000000..9d6070d7 --- /dev/null +++ b/samples/Terra/cudaaggregate.t @@ -0,0 +1,45 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end + +local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) +local ntid = cudalib.nvvm_read_ptx_sreg_ntid_x -- terralib.intrinsic("llvm.nvvm.read.ptx.sreg.ntid.x",{} -> int) + +struct A { + a : int + b : int + c : int[2] +} +terra foo(result : &float,a : A, c : int, d : int[2]) + var t = tid() + result[t] = t + a.a + a.b + c + a.c[0] + a.c[1] + d[0] + d[1] +end + +terralib.includepath = terralib.includepath..";/usr/local/cuda/include" + +local C = terralib.includecstring [[ +#include "cuda_runtime.h" +#include +#include +]] +local R = terralib.cudacompile({ bar = foo }) + +terra doit(N : int) + var data : &float + C.cudaMalloc([&&opaque](&data),sizeof(float)*N) + var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } + R.bar(&launch,data, A { 1,2, array(3,4) },5,array(6,7)) + var results : &float = [&float](C.malloc(sizeof(float)*N)) + C.cudaMemcpy(results,data,sizeof(float)*N,2) + var result = 0.f + for i = 0,N do + result = result + results[i] + end + return result +end + +local test = require("test") +local N = 16 +local expected = (N - 1)*N/2 + N*(1 + 2 + 3 + 4 + 5 + 6 + 7) +test.eq(doit(N),expected) diff --git a/samples/Terra/cudaatomic.t b/samples/Terra/cudaatomic.t new file mode 100644 index 00000000..ebe3425d --- /dev/null +++ b/samples/Terra/cudaatomic.t @@ -0,0 +1,39 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end + +local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) + +foo = terra(result : &int) + var t = tid() + terralib.asm(terralib.types.unit,"red.global.max.u32 [$0], $1;","l,r",true,result,t) +end + +terralib.includepath = terralib.includepath..";/usr/local/cuda/include" + + +local C = terralib.includecstring [[ +#include "cuda_runtime.h" +#include +#include +]] + +sync = terralib.externfunction("cudaThreadSynchronize", {} -> int) + +local R = terralib.cudacompile({ bar = foo },true) + +terra doit(N : int) + var data = 0 + var location : &int + C.cudaMalloc([&&opaque](&location),sizeof(int)) + C.cudaMemcpy(location,&data,sizeof(int),1) + + var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } + R.bar(&launch,location) + var data2 = -1 + C.cudaMemcpy(&data2,location,sizeof(int),2) + return data2 +end + +assert(doit(32) == 31) diff --git a/samples/Terra/cudaconst2.t b/samples/Terra/cudaconst2.t new file mode 100644 index 00000000..6ca8eead --- /dev/null +++ b/samples/Terra/cudaconst2.t @@ -0,0 +1,14 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end + +local const = cudalib.constantmemory(float, 1) + +local terra kernel(data: &float) +end + +local M = terralib.cudacompile({ + kernel = kernel, + const = const +}) diff --git a/samples/Terra/cudaglobal.t b/samples/Terra/cudaglobal.t new file mode 100644 index 00000000..53564f4f --- /dev/null +++ b/samples/Terra/cudaglobal.t @@ -0,0 +1,48 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end + +local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) +local ntid = cudalib.nvvm_read_ptx_sreg_ntid_x -- terralib.intrinsic("llvm.nvvm.read.ptx.sreg.ntid.x",{} -> int) + + +theone = global(0) + +theconst = cudalib.constantmemory(int,1) + +terra foo(result : &float) + result[tid()] = tid() + theone + theconst[0] +end + +terralib.includepath = terralib.includepath..";/usr/local/cuda/include" + +local C = terralib.includecstring [[ +#include "cuda_runtime.h" +#include +#include +]] +local R = terralib.cudacompile({ foo = foo, aone = theone, theconst = theconst }) + +terra doit(N : int) + var data : &float + C.cudaMalloc([&&opaque](&data),sizeof(float)*N) + var one = 1 + var two = 2 + C.cudaMemcpy(R.aone,&one,sizeof(int),1) + C.cudaMemcpy(R.theconst,&two,sizeof(int),1) + var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } + R.foo(&launch,data) + var results : &float = [&float](C.malloc(sizeof(float)*N)) + C.cudaMemcpy(results,data,sizeof(float)*N,2) + var result = 0.f + for i = 0,N do + result = result + results[i] + end + return result +end + +local test = require("test") +local N = 16 +local expected = (N - 1)*N/2 + 3*N +test.eq(doit(N),expected) diff --git a/samples/Terra/cudahello.t b/samples/Terra/cudahello.t new file mode 100644 index 00000000..96b68462 --- /dev/null +++ b/samples/Terra/cudahello.t @@ -0,0 +1,30 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end + +local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) + +C = terralib.includec("stdio.h") +vprintf = terralib.externfunction("cudart:vprintf", {&int8,&int8} -> int) + +foo = terra(result : &float) + var t = tid() + vprintf("%d\n",[&int8](&t)) +end + +terralib.includepath = terralib.includepath..";/usr/local/cuda/include" + + +sync = terralib.externfunction("cudaThreadSynchronize", {} -> int) + +local R = terralib.cudacompile({ bar = foo }) + +terra doit(N : int) + var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } + R.bar(&launch,nil) + sync() + C.printf("and were done\n") +end + +doit(3) diff --git a/samples/Terra/cudaoffline.t b/samples/Terra/cudaoffline.t new file mode 100644 index 00000000..f750027b --- /dev/null +++ b/samples/Terra/cudaoffline.t @@ -0,0 +1,65 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end + +local tid = cudalib.nvvm_read_ptx_sreg_tid_x +local ntid = cudalib.nvvm_read_ptx_sreg_ntid_x + +theone = global(0) + +theconst = cudalib.constantmemory(int,1) + +terra foo(result : &float) + result[tid()] = tid() + theone + theconst[0] +end + +local C = terralib.includecstring [[ +#include "cuda_runtime.h" +#include +#include +]] + +local R,L = terralib.cudacompile({ foo = foo, aone = theone, theconst = theconst },nil,nil,false) + +terra doit(N : int) + var data : &float + C.cudaMalloc([&&opaque](&data),sizeof(float)*N) + var one = 1 + var two = 2 + C.cudaMemcpy(R.aone,&one,sizeof(int),1) + C.cudaMemcpy(R.theconst,&two,sizeof(int),1) + var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } + R.foo(&launch,data) + var results : &float = [&float](C.malloc(sizeof(float)*N)) + C.cudaMemcpy(results,data,sizeof(float)*N,2) + var result = 0.f + for i = 0,N do + result = result + results[i] + end + return result +end + + +terra main() : int + if L(nil,nil,nil,0) ~= 0 then + C.printf("WHAT\n") + end + var N = 16 + var expected = (N - 1)*N/2 + 3*N + return terralib.select(doit(N) == expected,0,1) +end + + +local ffi = require 'ffi' +local path = ({ OSX = "/lib", Linux = "/lib64", Windows = "\\lib\\x64" })[ffi.os] +path = terralib.cudahome..path + + +local args = ffi.os == "Windows" and {path.."\\cuda.lib", path.."\\cudart.lib"} + or {"-L"..path, "-Wl,-rpath,"..path, "-lcuda", "-lcudart"} + +local name = ffi.os == "Windows" and ".\\cudaoffline.exe" or "./cudaoffline" +terralib.saveobj(name,{ main = main },args) +assert(os.execute(name) == 0) + diff --git a/samples/Terra/cudaoo.t b/samples/Terra/cudaoo.t new file mode 100644 index 00000000..65b16688 --- /dev/null +++ b/samples/Terra/cudaoo.t @@ -0,0 +1,20 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end +C = terralib.includec("cuda_runtime.h") + +cudalib.linkruntime() + +terra foo() + var stuff : &opaque + C.cudaMalloc(&stuff,sizeof(int)) + return stuff +end + +local a = foo() + +terra blank() end +terralib.cudacompile { blank = blank } + +assert(0 == C.cudaMemset(a,0,4)) diff --git a/samples/Terra/cudaprintf.t b/samples/Terra/cudaprintf.t new file mode 100644 index 00000000..b9ef9b73 --- /dev/null +++ b/samples/Terra/cudaprintf.t @@ -0,0 +1,50 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end + +local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) + +vprintf = terralib.externfunction("cudart:vprintf", {&int8,&int8} -> int) +local function createbuffer(args) + local Buf = terralib.types.newstruct() + return quote + var buf : Buf + escape + for i,e in ipairs(args) do + local typ = e:gettype() + local field = "_"..tonumber(i) + typ = typ == float and double or typ + table.insert(Buf.entries,{field,typ}) + emit quote + buf.[field] = e + end + end + end + in + [&int8](&buf) + end +end +printf = macro(function(fmt,...) + local buf = createbuffer({...}) + return `vprintf(fmt,buf) +end) + +foo = terra(result : &float) + var t = tid() + printf("a = %d, b = %f, c = %d\n",t,1.0 + t,t + 2) +end + +sync = terralib.externfunction("cuStreamSynchronize", {&opaque} -> int) + +annotations = { {"maxntidx",43}, {"minctasm",8}} -- example of annotating cuda kernel with launch bounds +local R = terralib.cudacompile({ bar = { kernel = foo, annotations = annotations }}) + +terra doit(N : int) + var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } + R.bar(&launch,nil) + sync(nil) +end + +doit(3) + diff --git a/samples/Terra/cudashared.t b/samples/Terra/cudashared.t new file mode 100644 index 00000000..cde12737 --- /dev/null +++ b/samples/Terra/cudashared.t @@ -0,0 +1,47 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end + +local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) + +N = 1024 + +somedata = cudalib.sharedmemory(int,N) + +terra bar(result : &int) + var t = tid() + somedata[t] = t + cudalib.nvvm_barrier0() + result[t] = somedata[N - 1 - t] +end + +terralib.includepath = terralib.includepath..";/usr/local/cuda/include" + +local C = terralib.includecstring [[ +#include "cuda_runtime.h" +#include +#include +]] + +local R = terralib.cudacompile({ bar = bar },true) + + +terra doit(N : int) + var data : &int + C.cudaMalloc([&&opaque](&data),sizeof(int)*N) + var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } + R.bar(&launch,data) + var results : &int = [&int](C.malloc(sizeof(int)*N)) + C.cudaMemcpy(results,data,sizeof(int)*N,2) + var result = 0 + for i = 0,N do + --C.printf("result = %d\n",results[i]) + result = result + results[i] + end + return result +end + +local test = require("test") +local expected = (N - 1)*N/2 +test.eq(doit(N),expected) diff --git a/samples/Terra/cudatest.t b/samples/Terra/cudatest.t new file mode 100644 index 00000000..a15d54fc --- /dev/null +++ b/samples/Terra/cudatest.t @@ -0,0 +1,47 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end + +local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) +local ntid = cudalib.nvvm_read_ptx_sreg_ntid_x -- terralib.intrinsic("llvm.nvvm.read.ptx.sreg.ntid.x",{} -> int) + +fn = terra(result : &float) + var t = tid() + result[t] = t +end +fn:setinlined(false) +--our very simple cuda kernel +--more work needs to be done to expose the right CUDA intrinsics +--to do more compilicated things +foo = terra(result : &float) + fn(result) +end + +terralib.includepath = terralib.includepath..";/usr/local/cuda/include" + +local C = terralib.includecstring [[ +#include "cuda_runtime.h" +#include +#include +]] +local R = terralib.cudacompile({ bar = foo }) + +terra doit(N : int) + var data : &float + C.cudaMalloc([&&opaque](&data),sizeof(float)*N) + var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } + R.bar(&launch,data) + var results : &float = [&float](C.malloc(sizeof(float)*N)) + C.cudaMemcpy(results,data,sizeof(float)*N,2) + var result = 0.f + for i = 0,N do + result = result + results[i] + end + return result +end + +local test = require("test") +local N = 16 +local expected = (N - 1)*N/2 +test.eq(doit(N),expected) diff --git a/samples/Terra/cudatex.t b/samples/Terra/cudatex.t new file mode 100644 index 00000000..cebb6079 --- /dev/null +++ b/samples/Terra/cudatex.t @@ -0,0 +1,59 @@ +if not terralib.cudacompile then + print("CUDA not enabled, not performing test...") + return +end + +local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) + +C = terralib.includecstring [[ +#include +#include +#include +#include +]] + +vprintf = terralib.externfunction("cudart:vprintf", {&int8,&int8} -> int) + +foo = terra(result : C.cudaTextureObject_t) + var t = tid() + var r = terralib.asm([tuple(float,float,float,float)], + "tex.1d.v4.f32.s32 {$0,$1,$2,$3}, [$4, {$5}];", + "=f,=f,=f,=f,l,r",false,result,t) + var rr : double = r._0 + vprintf("%f\n",[&int8](&rr)) +end + +terralib.includepath = terralib.includepath..";/usr/local/cuda/include" + +sync = terralib.externfunction("cudaThreadSynchronize", {} -> int) + +local R = terralib.cudacompile({ foo = foo }) + +terra doit(N : int) + var d_buffer : &double + C.cudaMalloc([&&opaque](&d_buffer),N*sizeof(float)) + + var h_buffer = arrayof(float,0,1,2,3,4,5,6,7,8,9,10) + C.cudaMemcpy(d_buffer,&h_buffer[0],sizeof(float)*N, C.cudaMemcpyHostToDevice) + + var resDesc : C.cudaResourceDesc + C.memset(&resDesc,0,sizeof(C.cudaResourceDesc)) + resDesc.resType = C.cudaResourceTypeLinear; + resDesc.res.linear.devPtr = d_buffer; + resDesc.res.linear.desc.f = C.cudaChannelFormatKindFloat; + resDesc.res.linear.desc.x = 32; -- bits per channel + resDesc.res.linear.sizeInBytes = N*sizeof(float); + var texDesc : C.cudaTextureDesc + C.memset(&texDesc, 0, sizeof(C.cudaTextureDesc)); + texDesc.readMode = C.cudaReadModeElementType; + + var tex : C.cudaTextureObject_t + C.cudaCreateTextureObject(&tex, &resDesc, &texDesc, nil); + + var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } + R.foo(&launch,tex) + sync() + C.printf("and were done\n") +end + +doit(10) diff --git a/samples/Terra/cunion.t b/samples/Terra/cunion.t new file mode 100644 index 00000000..7077d4d0 --- /dev/null +++ b/samples/Terra/cunion.t @@ -0,0 +1,34 @@ +local C = terralib.includecstring [[ + +union testunion { + int idata; + float fdata; +}; + +typedef + union { + int a; + float b; + } S; + +void setUnion(union testunion * u, S * s){ + u->idata = 3; +} +int getUnionInt(union testunion * u){ + return u->idata; +} + +]] + +terra foo() : int + var u : C.testunion + C.setUnion(&u,nil) + var s : C.S + return C.getUnionInt(&u) +end + + +terralib.tree.printraw(C.S) + +local test = require("test") +test.eq(foo(),3) \ No newline at end of file diff --git a/samples/Terra/cunion2.t b/samples/Terra/cunion2.t new file mode 100644 index 00000000..08a4e3e5 --- /dev/null +++ b/samples/Terra/cunion2.t @@ -0,0 +1,35 @@ +local C = terralib.includecstring [[ + +union testunion { + int idata; + float fdata; +}; + +void setUnionI(union testunion * u){ + u->idata = 3; +} +void setUnionF(union testunion * u){ + u->fdata = 4.f; +} + +]] + +terra foo() : int + var u : C.testunion + C.setUnionI(&u) + var f = u.idata + C.setUnionF(&u) + var f2 = u.fdata + return f + f2 +end + +terra foo2() + var a : C.testunion + a.fdata = -3.0 + a.idata = a.idata and not (1 << 31) + return a.fdata +end + +local test = require("test") +test.eq(foo(),7) +test.eq(foo2(),3) \ No newline at end of file diff --git a/samples/Terra/customline.t b/samples/Terra/customline.t new file mode 100644 index 00000000..c70ecff6 --- /dev/null +++ b/samples/Terra/customline.t @@ -0,0 +1,10 @@ +terra foo(c : int, b : int) + terralib.debuginfo("../src/terralib.lua",300) + var a = b + c + terralib.debuginfo("../src/terralib.lua",301) + return a + a +end + +foo(3,4) + +--terralib.dumpmodule() \ No newline at end of file diff --git a/samples/Terra/customtable.t b/samples/Terra/customtable.t new file mode 100644 index 00000000..18649347 --- /dev/null +++ b/samples/Terra/customtable.t @@ -0,0 +1,10 @@ + + +struct A { +} + +A.metamethods.__luametatable = { __index = function(self,idx) return 4 end } +A.methods.foo = function() return 5 end +a = terralib.new(A) + +assert(a.foo == 4) \ No newline at end of file diff --git a/samples/Terra/cvar.t b/samples/Terra/cvar.t new file mode 100644 index 00000000..aaa3398f --- /dev/null +++ b/samples/Terra/cvar.t @@ -0,0 +1,9 @@ +C = terralib.includecstring [[ + int foo = 4; + const int foo2 = 5; +]] +terra t() + C.foo = C.foo + 1; + return C.foo + C.foo2 +end +assert(t() == 10) \ No newline at end of file diff --git a/samples/Terra/debugcallback.t b/samples/Terra/debugcallback.t new file mode 100644 index 00000000..2e236650 --- /dev/null +++ b/samples/Terra/debugcallback.t @@ -0,0 +1,23 @@ + +terralib.settypeerrordebugcallback(function(o) + o:printpretty() +end) + + +local function dosomecomplicatedstuff(a) + return `@a +end + +local s,e = pcall(function() + + local terra what(a : &opaque) + var b = [dosomecomplicatedstuff(a)] + return b + end + what:compile() + +end) + +assert(not s) +print(e) +assert(e:match("Errors reported during")) \ No newline at end of file diff --git a/samples/Terra/declerrors.t b/samples/Terra/declerrors.t new file mode 100644 index 00000000..58d24477 --- /dev/null +++ b/samples/Terra/declerrors.t @@ -0,0 +1,29 @@ +function failit(fn,err) + local success,msg = pcall(fn) + if success then + error("failed to fail.",2) + elseif not string.match(msg,err or "Errors reported during") then + error("failed wrong: "..msg,2) + end +end + + +failit(function() +local A = {} +terra A:foo() end +end,"expected a struct") + + +failit(function() +terra A.b() end +end,"failed attempting to index field") + +failit(function() +terra A.b.c() end +end,"failed attempting to index field") + + +failit(function() +local A = 4 +struct A.b {} +end,"failed attempting to index field") \ No newline at end of file diff --git a/samples/Terra/decltwice.t b/samples/Terra/decltwice.t new file mode 100644 index 00000000..b56eab60 --- /dev/null +++ b/samples/Terra/decltwice.t @@ -0,0 +1,18 @@ + +terra mything + +terra mybar() + return mything(4) +end + +terra mything(a : int) + return a +end + +terra mything + +terra mybar2() + return mything(4) +end + +assert(mybar() == mybar2()) \ No newline at end of file diff --git a/samples/Terra/def1.t b/samples/Terra/def1.t new file mode 100755 index 00000000..2ce3ba06 --- /dev/null +++ b/samples/Terra/def1.t @@ -0,0 +1,16 @@ +import "lib/def" + +local c = 3 +local a = 4 +local b = def(a) a + c +local d = b(10) + +def e(a) a + c +local def f(a) a + c + +print(d, e(10), f(10)) + +local test = require("test") +test.eq(d,13) +test.eq(e(10),13) +test.eq(f(10),13) diff --git a/samples/Terra/defaultoperator.t b/samples/Terra/defaultoperator.t new file mode 100644 index 00000000..fe1f6c79 --- /dev/null +++ b/samples/Terra/defaultoperator.t @@ -0,0 +1,9 @@ + +local a = "+" +local b = "__sub" +local ops = {4,5} +terra foobar() + return operator(b,operator(a,3,operator("+",ops))) +end + +assert(foobar() == -12) diff --git a/samples/Terra/defer.t b/samples/Terra/defer.t new file mode 100644 index 00000000..4d8c7a84 --- /dev/null +++ b/samples/Terra/defer.t @@ -0,0 +1,111 @@ +C = terralib.includec("stdio.h") + + +cur = global(int) + +terra d(a : int) + if cur ~= a then + C.printf("found %d while expecting %d\n",a,cur) + error(cur) + end + cur = cur + 1 + --C.printf("d%d\n",a) +end +d:setinlined(false) + +terra side(a : int, b : {}) + d(a) +end + +terra doit() + d(0) + defer side(3,d(1)) + d(2) +end +cur:set(0) +doit() + + +terra doit2() + d(0) + var i = 100 + defer d(203) + repeat + defer d(2*(100-i)+2) + d(2*(100-i)+1) + i = i - 1 + until i == 0 + defer d(202) + do defer d(201) end +end +cur:set(0) +doit2() + +terra doit3() + d(0) + defer d(11) + for i = 0,10 do + defer d(i+1) + end +end + +cur:set(0) +doit3() + +terra doit4() + d(0) + defer d(5) + if true then + defer d(2) + d(1) + end + if false then + else + defer d(3) + end + d(4) +end +cur:set(0) +doit4() + +struct A { +} + +A.methods.stackalloc = macro(function() + return quote + var a : A + defer a:free() + in + &a + end +end) +terra A:free() + d(1) + --C.printf("freeing A (%p)\n",self) +end +terra A:print() + d(0) + --C.printf("printing A (%p)\n",self) +end +terra doit5() + var a = A.stackalloc() + a:print() +end +cur:set(0) +doit5() + +terra doit6(a : int) + defer d(2) + d(0) + if a == 0 then + defer d(1) + return 4 + end + d(1) + return 3 +end +cur:set(0) +doit6(0) + +cur:set(0) +doit6(1) diff --git a/samples/Terra/deferbreak.t b/samples/Terra/deferbreak.t new file mode 100644 index 00000000..eeac802d --- /dev/null +++ b/samples/Terra/deferbreak.t @@ -0,0 +1,35 @@ +C = terralib.includec("stdio.h") + +cur = global(int) + +terra d(a : int) + if cur ~= a then + C.printf("found %d while expecting %d\n",a,cur) + error(cur) + end + cur = cur + 1 + C.printf("d%d\n",a) +end +d:setinlined(false) + +terra side(a : int, b : {}) + d(a) +end + +terra doit() + d(0) + for i = 0,10 do + defer d(2*i+2) + if true then + defer d(2*i + 1) + if i == 8 then + break + end + end + end + d(19) +end +cur:set(0) +doit() +doit:printpretty() + diff --git a/samples/Terra/defercond.t b/samples/Terra/defercond.t new file mode 100644 index 00000000..8de1901c --- /dev/null +++ b/samples/Terra/defercond.t @@ -0,0 +1,82 @@ +c = global(int,0) + +terra up() + c = c + 1 +end + +terra foo() + var a = 0 + while([quote do defer up() end in a < 10 end]) do + a = a + 1 + end +end + +foo() +assert(c:get() == 11) + +terra foo2() + var a = 0 + while(a < 10 and [quote do defer up() end in true end]) do + a = a + 1 + end +end + +foo2() +assert(c:get() == 21) + +terra foo3() + var a = 0 + while true do + var r = a < 10 and [quote do defer up() end in true end] + if not r then break end + a = a + 1 + end +end +foo3() +assert(c:get() == 31) + +function failit(match,fn) + local success,msg = pcall(fn) + if success then + error("failed to fail.",2) + elseif not string.match(msg,match) then + error("failed wrong: "..msg,2) + end +end +local df = "defer statements are not allowed in conditional expressions" +failit(df,function() + local terra foo() + if [quote defer up() in true end] then end + end + foo() +end) +failit(df,function() + local terra foo() + while [quote defer up() in true end] do end + end + foo() +end) +failit(df,function() + local terra foo() + repeat until [quote defer up() in true end] do end + end + foo() +end) +failit(df,function() + local terra foo() + var a = true or [quote defer up() in true end] + end + foo() +end) + +failit(df,function() + local terra foo() + var a = [quote defer up() in true end] and true + end + foo() +end) + local terra foo() + var a = [quote defer up() in 1 end] and 2 + end + foo() + assert(c:get() == 32) \ No newline at end of file diff --git a/samples/Terra/defergoto.t b/samples/Terra/defergoto.t new file mode 100644 index 00000000..5f73670f --- /dev/null +++ b/samples/Terra/defergoto.t @@ -0,0 +1,35 @@ +C = terralib.includec("stdio.h") +cur = global(int) + +terra d(a : int) + if cur ~= a then + C.printf("found %d while expecting %d\n",a,cur) + error(cur) + end + cur = cur + 1 + C.printf("d%d\n",a) +end +d:setinlined(false) + +terra foo() + d(0) + defer d(14) + var a = 0 + ::begin:: + defer d(terralib.select(a == 10,13,a + 1)) + if a >= 10 then + defer d(11) + goto theend + end + a = a + 1 + goto begin + ::theend:: + defer d(12) + return a +end + +foo:printpretty() +cur:set(0) + +test = require("test") +test.eq(foo(),10) \ No newline at end of file diff --git a/samples/Terra/dgemm.t b/samples/Terra/dgemm.t new file mode 100644 index 00000000..4cf577b9 --- /dev/null +++ b/samples/Terra/dgemm.t @@ -0,0 +1,143 @@ + +local IO = terralib.includec("stdio.h") +local stdlib = terralib.includec("stdlib.h") + +local function isinteger(x) return math.floor(x) == x end + + + +local NB = 48 +terra naivel1matmul(A : &double, B : &double, C : &double, lda : int, ldb : int, ldc : int, alpha : double) + + for m = 0, NB do + for n = 0, NB do + C[m*ldc + n] = alpha * C[m*ldc + n] + for k = 0, NB do + C[m*ldc + n] = C[m*ldc + n] + A[m*lda + k] * B[k*ldb + n] + end + end + end + +end + +function symmat(name,I,...) + if not I then return symbol(name) end + local r = {} + for i = 0,I-1 do + r[i] = symmat(name..tostring(i),...) + end + return r +end + + +function genl1matmul(NB, NK, RM, RN, V,prefetch) + + assert(isinteger(NB / (RN*V))) + assert(isinteger(NB / RM)) + + local VP = &vector(double,V) + local terra vecload(data : &double, idx : int) + var addr = &data[idx] + return @VP(addr) + end + local terra vecstore(data : &double, idx : int, v : vector(double,V)) + var addr = &data[idx] + @VP(addr) = v + end + + local A,B,C,mm,nn, alpha = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn"),symbol("alpha") + local lda,ldb,ldc = symbol("lda"),symbol("ldb"), symbol("ldc") + local a,b,c = symmat("a",NB/V,RM), symmat("b",NB,RN), symmat("c",RM,RN) + local kk = symbol("kk") + + local loadc,storec = terralib.newlist(),terralib.newlist() + + for m = 0, RM-1 do + for n = 0, RN-1 do + loadc:insert(quote + var [c[m][n]] = alpha * vecload(C,(mm+m)*ldc + nn + n*V) + end) + storec:insert(quote + vecstore(C,(mm+m)*ldc + nn + n*V,[c[m][n]]) + end) + end + end + + local calcc = terralib.newlist() + + for kb = 0, NK/V-1 do + local kbV = kb*V + for m = 0, RM-1 do + calcc:insert(quote + var [a[kb][m]] = vecload(A,(mm+m)*lda + kk + kbV) + end) + end + for v = 0, V-1 do + local k = kbV+v + if not prefetch or (v == 0 and kb == 0) then + for n = 0, RN-1 do + calcc:insert(quote + var [b[k][n]] = vecload(B,(kk + k)*ldb + nn + n*V) + end) + end + end + for m = 0, RM-1 do + for n = 0, RN-1 do + calcc:insert(quote + [c[m][n]] = [c[m][n]] + [a[kb][m]][v] * [b[k][n]] + end) + if prefetch and not (v == V-1 and kb == NK/V-1) and m == RM-1 then --prefetch the next b + calcc:insert(quote + var [b[k+1][n]] = vecload(B,(kk + k + 1)*ldb + nn + n*V) + end) + end + end + end + end + end + + return terra([A] : &double, [B] : &double, [C] : &double, [lda] : int, [ldb] : int, [ldc] : int, [alpha] : double) + for [mm] = 0, NB, RM do + for [nn] = 0, NB,RN*V do + [loadc]; + for [kk] = 0, NB, NK do + [calcc]; + end + [storec]; + end + end + end +end + + + +local NB2 = 8 * NB +local l1matmul = genl1matmul(NB,4, 3, 2, 4) + + + +terra min(a : int, b : int) + return terralib.select(a < b, a, b) +end + +terra my_dgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : double, A : &double, lda : int, B : &double, ldb : int, + beta : double, C : &double, ldc : int) + for mm = 0,M,NB2 do + for nn = 0,N,NB2 do + for kk = 0,K, NB2 do + for m = mm,min(mm+NB2,M),NB do + for n = nn,min(nn+NB2,N),NB do + for k = kk,min(kk+NB2,K),NB do + l1matmul(A + m*lda + k, + B + k*ldb + n, + C + m*ldc + n, + lda,ldb,ldc, terralib.select(k == 0,0,1)) + end + end + end + end + end + end +end + +terralib.saveobj("my_dgemm.o", {my_dgemm = my_dgemm}) \ No newline at end of file diff --git a/samples/Terra/dgemm2.t b/samples/Terra/dgemm2.t new file mode 100644 index 00000000..55ab3a92 --- /dev/null +++ b/samples/Terra/dgemm2.t @@ -0,0 +1,163 @@ + +function symmat(name,I,...) + if not I then return symbol(name) end + local r = {} + for i = 0,I-1 do + r[i] = symmat(name..tostring(i),...) + end + return r +end + + +function genkernel(NB, RM, RN, V,alpha) + + local terra vecload(data : &double, idx : int) + var addr = &data[idx] + return @addr:as(&vector(double,V)) + end + local terra vecstore(data : &double, idx : int, v : vector(double,V)) + var addr = &data[idx] + @addr:as(&vector(double,V)) = v + end + + local A,B,C,mm,nn = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn") + local lda,ldb,ldc = NB,NB,NB + local a,b,c,caddr = symmat("a",RM), symmat("b",RN), symmat("c",RM,RN), symmat("caddr",RM,RN) + local k = symbol("k") + + local loadc,storec = terralib.newlist(),terralib.newlist() + local VT = vector(double,V) + local VP = &VT + for m = 0, RM-1 do + for n = 0, RN-1 do + loadc:insert(quote + var [caddr[m][n]] = C + (mm+m)*ldc + nn + n*V + var [c[m][n]] = alpha * @VP([caddr[m][n]]) + end) + storec:insert(quote + @VP([caddr[m][n]]) = [c[m][n]] + end) + end + end + + local calcc = terralib.newlist() + + for n = 0, RN-1 do + calcc:insert(quote + var [b[n]] = @VP(&B[k*ldb + nn + n*V]) + end) + end + for m = 0, RM-1 do + calcc:insert(quote + var [a[m]] = VT(A[(mm+m)*lda + k]) + end) + end + for m = 0, RM-1 do + for n = 0, RN-1 do + calcc:insert(quote + [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] + end) + end + end + + + return terra([A] : &double, [B] : &double, [C] : &double) + for [mm] = 0, NB, RM do + for [nn] = 0, NB,RN*V do + [loadc]; + for [k] = 0, NB do + [calcc]; + end + [storec]; + end + end + end +end + +local NB = 48 +local NB2 = 8 * NB + +local V = 4 + +l1dgemm0 = genkernel(NB,2,4,V,0) +l1dgemm1 = genkernel(NB,2,4,V,1) + +terra min(a : int, b : int) + return terralib.select(a < b, a, b) +end + +local stdlib = terralib.includec("stdlib.h") +local IO = terralib.includec("stdio.h") +local VP = &vector(double,V) + +terra my_dgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : double, A : &double, lda : int, B : &double, ldb : int, + beta : double, C : &double, ldc : int) + + var AA = [&double](stdlib.malloc(sizeof(double)*M*K)) + var BB = [&double](stdlib.malloc(sizeof(double)*K*N)) + var CC = [&double](stdlib.malloc(sizeof(double)*M*N)) + + var i = 0 + for mm = 0,M,NB do + for kk = 0,K,NB do + for m = mm,mm+NB do + for k = kk,kk+NB,V do + @VP(&AA[i]) = @VP(&A[m*lda + k]) + i = i + V + end + end + end + end + i = 0 + for kk = 0,K,NB do + for nn = 0,N,NB do + for k = kk,kk+NB do + for n = nn,nn+NB,V do + @VP(&BB[i]) = @VP(&B[k*ldb + n]) + i = i + V + end + end + end + end + + for mm = 0,M,NB2 do + for nn = 0,N,NB2 do + for kk = 0,K, NB2 do + for m = mm,min(mm+NB2,M),NB do + for n = nn,min(nn+NB2,N),NB do + for k = kk,min(kk+NB2,K),NB do + --IO.printf("%d %d starting at %d\n",m,k,m*lda + NB*k) + if k == 0 then + l1dgemm0(AA + (m*lda + NB*k), + BB + (k*ldb + NB*n), + CC + (m*ldc + NB*n)) + else + l1dgemm1(AA + (m*lda + NB*k), + BB + (k*ldb + NB*n), + CC + (m*ldc + NB*n)) + end + end + end + end + end + end + end + + i = 0 + for mm = 0,M,NB do + for nn = 0,N,NB do + for m = mm,mm+NB do + for n = nn,nn+NB,V do + @VP(&C[m*ldc + n]) = @VP(&CC[i]) + i = i + V + end + end + end + end + + stdlib.free(AA) + stdlib.free(BB) + stdlib.free(CC) +end + +terralib.saveobj("my_dgemm.o", { my_dgemm = my_dgemm }) \ No newline at end of file diff --git a/samples/Terra/dgemm3.t b/samples/Terra/dgemm3.t new file mode 100644 index 00000000..29319e84 --- /dev/null +++ b/samples/Terra/dgemm3.t @@ -0,0 +1,213 @@ + +function symmat(name,I,...) + if not I then return symbol(name) end + local r = {} + for i = 0,I-1 do + r[i] = symmat(name..tostring(i),...) + end + return r +end + + +local function isinteger(x) return math.floor(x) == x end + +llvmprefetch = terralib.intrinsic("llvm.prefetch",{&opaque,int,int,int} -> {}) + +local function alignedload(addr) + return `terralib.attrload(addr, { align = 8 }) +end +local function alignedstore(addr,v) + return `terralib.attrstore(addr,v, { align = 8 }) +end +alignedload,alignedstore = macro(alignedload),macro(alignedstore) +function genkernel(NB, RM, RN, V,alpha,boundary) + + local M,N,K, boundaryargs + if boundary then + M,N,K = symbol(int64,"M"),symbol(int64,"N"),symbol(int64,"K") + boundaryargs = terralib.newlist({M,N,K}) + else + boundaryargs = terralib.newlist() + M,N,K = NB,NB,NB + end + + local A,B,C,mm,nn,ld = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn"),symbol("ld") + local lda,ldb,ldc = symbol("lda"),symbol("ldb"),symbol("ldc") + local a,b,c,caddr = symmat("a",RM), symmat("b",RN), symmat("c",RM,RN), symmat("caddr",RM,RN) + local k = symbol("k") + + local loadc,storec = terralib.newlist(),terralib.newlist() + local VT = vector(double,V) + local VP = &VT + for m = 0, RM-1 do + for n = 0, RN-1 do + loadc:insert(quote + var [caddr[m][n]] = C + m*ldc + n*V + var [c[m][n]] = alpha * alignedload(VP([caddr[m][n]])) + end) + storec:insert(quote + alignedstore(VP([caddr[m][n]]),[c[m][n]]) + end) + end + end + + local calcc = terralib.newlist() + + for n = 0, RN-1 do + calcc:insert(quote + var [b[n]] = alignedload(VP(&B[n*V])) + end) + end + for m = 0, RM-1 do + calcc:insert(quote + var [a[m]] = VT(A[m*lda]) + end) + end + for m = 0, RM-1 do + for n = 0, RN-1 do + calcc:insert(quote + [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] + end) + end + end + + + local result = terra([A] : &double, [B] : &double, [C] : &double, [lda] : int64,[ldb] : int64,[ldc] : int64,[boundaryargs]) + for [mm] = 0, M, RM do + for [nn] = 0, N,RN*V do + [loadc]; + for [k] = 0, K do + llvmprefetch(B + 4*ldb,0,3,1); + [calcc]; + B = B + ldb + A = A + 1 + end + [storec]; + A = A - K + B = B - ldb*K + RN*V + C = C + RN*V + end + C = C + RM * ldb - N + B = B - N + A = A + lda*RM + end + end + return result +end + + +local stdlib = terralib.includec("stdlib.h") +local IO = terralib.includec("stdio.h") + + +function generatedgemm(NB,NBF,RM,RN,V) + + if not isinteger(NB/(RN*V)) then + return false + end + if not isinteger(NB/RM) then + return false + end + + local NB2 = NBF * NB + local l1dgemm0 = genkernel(NB,RM,RN,V,0,false) + local l1dgemm1 = genkernel(NB,RM,RN,V,1,false) + + + local l1dgemm0b = genkernel(NB,1,1,1,0,true) + local l1dgemm1b = genkernel(NB,1,1,1,1,true) + + local terra min(a : int, b : int) + return terralib.select(a < b, a, b) + end + + return terra(gettime : {} -> double, M : int, N : int, K : int, alpha : double, A : &double, lda : int, B : &double, ldb : int, + beta : double, C : &double, ldc : int) + for mm = 0,M,NB2 do + for nn = 0,N,NB2 do + for kk = 0,K, NB2 do + for m = mm,min(mm+NB2,M),NB do + for n = nn,min(nn+NB2,N),NB do + for k = kk,min(kk+NB2,K),NB do + --IO.printf("%d %d starting at %d\n",m,k,m*lda + NB*k) + var MM,NN,KK = min(M-m,NB),min(N-n,NB),min(K-k,NB) + var isboundary = MM < NB or NN < NB or KK < NB + var AA,BB,CC = A + (m*lda + k),B + (k*ldb + n),C + (m*ldc + n) + if k == 0 then + if isboundary then + --IO.printf("b0 %d %d %d\n",MM,NN,KK) + l1dgemm0b(AA,BB,CC,lda,ldb,ldc,MM,NN,KK) + + --IO.printf("be %d %d %d\n",MM,NN,KK) + else + l1dgemm0(AA,BB,CC,lda,ldb,ldc) + end + else + if isboundary then + + --IO.printf("b %d %d %d\n",MM,NN,KK) + l1dgemm1b(AA,BB,CC,lda,ldb,ldc,MM,NN,KK) + + --IO.printf("be %d %d %d\n",MM,NN,KK) + else + l1dgemm1(AA,BB,CC,lda,ldb,ldc) + end + end + end + end + end + end + end + end + end +end + +-- + +local blocksizes = {16,24,32,40,48,56,64} +local regblocks = {1,2,4} +local vectors = {1,2,4,8} + +--local best = { gflops = 0, b = 56, rm = 4, rn = 1, v = 8 } +local best = { gflops = 0, b = 40, rm = 4, rn = 2, v = 4 } + + +if false then + local tunefor = 1024 + local harness = require("lib/matrixtestharness") + for _,b in ipairs(blocksizes) do + for _,rm in ipairs(regblocks) do + for _,rn in ipairs(regblocks) do + for _,v in ipairs(vectors) do + local my_dgemm = generatedgemm(b,5,rm,rn,v) + if my_dgemm then + print(b,rm,rn,v) + my_dgemm:compile() + local i = math.floor(tunefor / b) * b + local avg = 0 + local s, times = harness.timefunctions("double",i,i,i,function(M,K,N,A,B,C) + my_dgemm(nil,M,N,K,1.0,A,K,B,N,0.0,C,N) + end) + if not s then + print("") + break + end + print(i,unpack(times)) + local avg = times[1] + if best.gflops < avg then + best = { gflops = avg, b = b, rm = rm, rn = rn, v = v } + terralib.tree.printraw(best) + end + end + end + end + end + end +end + +terralib.tree.printraw(best) + +local my_dgemm = generatedgemm(best.b, 5, best.rm, best.rn, best.v) + +--my_dgemm:disas() +terralib.saveobj("my_dgemm.o", { my_dgemm = my_dgemm }) \ No newline at end of file diff --git a/samples/Terra/dgemmpaper.t b/samples/Terra/dgemmpaper.t new file mode 100644 index 00000000..e415236c --- /dev/null +++ b/samples/Terra/dgemmpaper.t @@ -0,0 +1,75 @@ + +function symmat(name,I,...) + if not I then return symbol(name) end + local r = {} + for i = 0,I-1 do + r[i] = symmat(name..tostring(i),...) + end + return r +end +prefetch = terralib.intrinsic("llvm.prefetch",{&opaque,int,int,int} -> {}) + + +function genkernel(NB, RM, RN, V,alpha) + local A,B,C = symbol("A"),symbol("B"),symbol("C") + local mm,nn = symbol("mn"),symbol("nn") + local lda,ldb,ldc = symbol("lda"),symbol("ldb"),symbol("ldc") + local a,b = symmat("a",RM), symmat("b",RN) + local c,caddr = symmat("c",RM,RN), symmat("caddr",RM,RN) + local k = symbol("k") + local loadc,storec = terralib.newlist(),terralib.newlist() + local VT = vector(double,V) + local VP = &VT + for m = 0, RM-1 do for n = 0, RN-1 do + loadc:insert(quote + var [caddr[m][n]] = C + m*ldc + n*V + var [c[m][n]] = + alpha * @VP([caddr[m][n]]) + end) + storec:insert(quote + @VP([caddr[m][n]]) = [c[m][n]] + end) + end end + local calcc = terralib.newlist() + for n = 0, RN-1 do + calcc:insert(quote + var [b[n]] = @VP(&B[n*V]) + end) + end + for m = 0, RM-1 do + calcc:insert(quote + var [a[m]] = VT(A[m*lda]) + end) + end + for m = 0, RM-1 do for n = 0, RN-1 do + calcc:insert(quote + [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] + end) + end end + return terra([A] : &double, [B] : &double, [C] : &double, + [lda] : int64,[ldb] : int64,[ldc] : int64) + for [mm] = 0, NB, RM do + for [nn] = 0, NB, RN*V do + [loadc]; + for [k] = 0, NB do + prefetch(B + 4*ldb,0,3,1); + [calcc]; + B,A = B + ldb,A + 1 + end + [storec]; + A,B,C = A - NB,B - ldb*NB + RN*V,C + RN*V + end + A,B,C = A + lda*RM, B - NB, C + RM * ldb - NB + end + end +end + +local a = genkernel(40,4,2,8,1) +a:compile() +a:printpretty() + +terra short_saxpy(a : float, + x : vector(float,4), y : vector(float,4)) + return a*x + y +end +short_saxpy:printpretty() \ No newline at end of file diff --git a/samples/Terra/diffuse.t b/samples/Terra/diffuse.t new file mode 100644 index 00000000..ddf33dbe --- /dev/null +++ b/samples/Terra/diffuse.t @@ -0,0 +1,237 @@ + +local C = terralib.includecstring [[ +#include +#include +#ifndef _WIN32 +#include +static double CurrentTimeInSeconds() { + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec / 1000000.0; +} +#else +#include +static double CurrentTimeInSeconds() { + return time(NULL); +} +#endif + +int CalcTime(int * times, double * start) { + if(*times == 0) { + *start = CurrentTimeInSeconds(); + } else { + double elapsed = CurrentTimeInSeconds() - *start; + if(elapsed > 0.1f && *times >= 1) { + *start = elapsed / *times; + return 0; + } + } + (*times)++; + return 1; +} +]] + +alignedloads = global(0) +loads = global(0) +NI,NJ = 1,1 +V = 4 +local VP = &vector(float,V) +terra uload(d : &float) + --if d:as(uint64) % 16 == 0 then + -- alignedloads = alignedloads + 1 + --end + --loads = loads + 1 + return terralib.attrload(VP(d),{ align = 4 }) +end +terra ustore(d : &float, v : vector(float,V)) + terralib.attrstore(VP(d),v, { align = 4 }) +end + +terra diffuse_reference(output : &float, N : int, M : int, stride : int, x : &float, x0 : &float, a : float) + var invD = 1.f / (1 + 4.f*a) + var nextline = stride - N + for i = 0, M do + for j = 0,N do + var r = + (x0[0] + + (x[ - stride] + + x[stride] + + x[ - 1] + + x[1] )*a) * invD + output[0] = r + x0 = x0 + 1 + x = x + 1 + output = output + 1 + end + x0 = x0 + nextline --- stride + x = x + nextline --- stride + output = output + nextline --- stride + end + +end + +terra diffuse(output : &float, N : int, M : int, stride : int, x : &float, x0 : &float, a : float) + var invD = 1.f / (1 + 4.f*a) + var nextline = stride - N + for i = 0, M do + + for j = 0,N,V do + var r = + (uload(x0) + + (uload(x - stride) + + uload(x + stride) + + uload(x - 1) + + uload(x + 1) )*a) * invD + --C.printf("%d %d\n",i,j) + --llvmprefetch(x + 4 * stride,0,3,1) + --llvmprefetch(x0 + 3 * stride,0,3,1) + + ustore(output,r) + x0 = x0 + V + x = x + V + output = output + V + end + + x0 = x0 + nextline --- stride + x = x + nextline --- stride + output = output + nextline --- stride + end + +end + +llvmprefetch = terralib.intrinsic("llvm.prefetch",{&uint8,int,int,int} -> {}) + +terra diffuse2(output : &float, N : int, M : int, stride : int, x : &float, x0 : &float, a : float,xi : &float) + var invD = 1.f / (1 + 4.f*a) + var nextline = stride - N + var xi0,xi1,xi2 = xi - stride, xi, xi + stride + var x02 = x0 + for i = 0, M + 1 do + + if i < M then + for j = 0,N,V do + var r = + (uload(x0) + + (uload(x - stride) + + uload(x + stride) + + uload(x - 1) + + uload(x + 1) )*a) * invD + --C.printf("%d %d\n",i,j) + --llvmprefetch(x + 2 * stride,0,3,1) + ustore(xi,r) + x0 = x0 + V + x = x + V + xi = xi + V + end + + x0 = x0 + nextline --- stride + x = x + nextline --- stride + xi = xi + nextline --- stride + if i % 3 == 1 then + xi = xi - stride*3 + end + end + + if i >= 1 then + for j = 0,N,V do + var r = + (uload(x02) + + (uload(xi0) + + uload(xi2) + + uload(xi1 - 1) + + uload(xi1 + 1) )*a) * invD + --C.printf("%d %d\n",i,j) + ustore(output,r) + x02 = x02 + V + xi0 = xi0 + V + xi1 = xi1 + V + xi2 = xi2 + V + output = output + V + end + + x02 = x02 + nextline --- stride + xi0,xi1,xi2 = xi1 - N,xi2 - N, xi0 - N + output = output + nextline --- stride + end + end + +end + + +terra doit(thea : float) + var enlarge = 1 + var N = 1024/8 + var M = 1024*8 + var N1 = (N + 2*enlarge) + var M1 = (M + 2*enlarge) + + var NA = N1 + var x = [&float](C.malloc(NA*M1*sizeof(float))) + var x0 = [&float](C.malloc(NA*M1*sizeof(float))) + + var ro1 = [&float](C.malloc(NA*M1*sizeof(float))) + var ro2 = [&float](C.malloc(NA*M1*sizeof(float))) + + var to1 = [&float](C.malloc(NA*M1*sizeof(float))) + var to2 = [&float](C.malloc(NA*M1*sizeof(float))) + + + for i = 0, N1 do + for j = 0, N1 do + x[i*N1+j] = C.rand() % 10 + x0[i*N1+j] = C.rand() % 10 + ro1[i*N1+j] = -42 + ro2[i*N1+j] = -43 + to1[i*N1+j] = -44 + to2[i*N1+j] = -45 + end + end + var stride = N1 + var start = enlarge*stride + enlarge + + diffuse_reference(ro1 + start,N,M,stride,x + start,x0 + start,thea) + diffuse_reference(ro2 + start,N,M,stride,ro1 + start,x0 + start,thea) + + + + var times = 0 + var mytime : double + + var fuse = true + while C.CalcTime(×,&mytime) ~= 0 do + if not fuse then + diffuse(to1 + start,N,M,stride,x + start,x0 + start,thea) + diffuse(to2 + start,N,M,stride,to1 + start,x0 + start,thea) + else + diffuse2(to2 + start,N,M,stride,x + start,x0 + start,thea,to1 + start) + end + end + + C.printf("times = %d\n",times) + for i = enlarge+1, M1-enlarge-1 do + for j = enlarge+1,N1-enlarge-1 do + if ro2[i*stride+j] ~= to2[i*stride+j] then + C.printf("wrong! %d %d %f %f\n",i,j,ro2[i*stride+j],to2[i*stride+j]) + goto out + else + --C.printf("right! %d %d %f %f\n",i,j,ro1[i*N1+j],to1[i*N1+j]) + end + end + end + ::out:: + var togiga = 1.0/(1024*1024*1024) + var pixels = N*M + C.printf("%f %f %f\n", mytime, 2*pixels*4*3 *togiga / mytime, 2*6*pixels * togiga / mytime) + +end + +terra getloads() + return alignedloads,loads +end + +doit(1) +diffuse:disas() +doit(1) + +local al,loads = terralib.unpackstruct(getloads()) +print(al/loads) \ No newline at end of file diff --git a/samples/Terra/dynlib.t b/samples/Terra/dynlib.t new file mode 100644 index 00000000..2d67bbab --- /dev/null +++ b/samples/Terra/dynlib.t @@ -0,0 +1,47 @@ +local ffi = require 'ffi' +-- test that the dynamic library for terra was built correctly +-- by compiling a new program that links against it and running it +terralib.includepath = terralib.terrahome.."/include/terra" +C = terralib.includecstring [[ +#include +#include "terra.h" +]] + +local libpath = terralib.terrahome.."/lib" + +terra doerror(L : &C.lua_State) + C.printf("%s\n",C.luaL_checklstring(L,-1,nil)) +end + +local thecode = "terra foo() return 1 end print(foo())" + +terra main(argc : int, argv : &rawstring) + var L = C.luaL_newstate(); + C.luaL_openlibs(L); + if C.terra_init(L) ~= 0 then + doerror(L) + end + if C.terra_loadstring(L,thecode) ~= 0 or C.lua_pcall(L, 0, -1, 0) ~= 0 then + doerror(L) + end + return 0; +end + +if ffi.os ~= "Windows" then + print(libpath) + local flags = terralib.newlist {"-L", libpath,"-Wl,-rpath,"..libpath,"-lterra_dynamic"} + if require("ffi").os == "OSX" then + flags:insertall {"-pagezero_size","10000", "-image_base", "100000000"} + end + + terralib.saveobj("dynlib",{main = main},flags) + + assert(0 == os.execute("./dynlib")) + +else + local putenv = terralib.externfunction("_putenv", rawstring -> int) + local flags = {libpath.."\\terra.lib",libpath.."\\lua51.lib"} + terralib.saveobj("dynlib.exe",{main = main},flags) + putenv("Path="..os.getenv("Path")..";"..terralib.terrahome.."\\bin") --make dll search happy + assert(0 == os.execute(".\\dynlib.exe")) +end \ No newline at end of file diff --git a/samples/Terra/eager.t b/samples/Terra/eager.t new file mode 100644 index 00000000..7218d811 --- /dev/null +++ b/samples/Terra/eager.t @@ -0,0 +1,10 @@ + + +local fn = terra() return 0 end + +for i = 1,10 do + fn = terra() return fn() + 1 end +end + +local test = require("test") +test.eq(fn(),10) \ No newline at end of file diff --git a/samples/Terra/empty.t b/samples/Terra/empty.t new file mode 100644 index 00000000..e69de29b diff --git a/samples/Terra/emptycalls.t b/samples/Terra/emptycalls.t new file mode 100644 index 00000000..2c7f8b34 --- /dev/null +++ b/samples/Terra/emptycalls.t @@ -0,0 +1,31 @@ +terra f(x : {}) + return x +end + + +print(f({})) + +terra f2(x : {}) + return x,x +end + +print(f2({})._0) + +terra f3(x : {}, a : int) + return a + 1 +end + +assert(f3({},3) == 4) + +terra f4(x : {}) + return x,4 +end + +a = f4({}) +assert(a._1 == 4) + +terra f5() + return f({}) +end + +f5() \ No newline at end of file diff --git a/samples/Terra/emptyname.t b/samples/Terra/emptyname.t new file mode 100644 index 00000000..b6f200aa --- /dev/null +++ b/samples/Terra/emptyname.t @@ -0,0 +1,5 @@ +struct A {} +A.metamethods.__typename = function() return "" end +struct B {} +B.metamethods.__typename = function() return "" end +print(A:cstring(),B:cstring()) \ No newline at end of file diff --git a/samples/Terra/emptystruct.t b/samples/Terra/emptystruct.t new file mode 100644 index 00000000..5dc75028 --- /dev/null +++ b/samples/Terra/emptystruct.t @@ -0,0 +1,30 @@ +terra f(x : {}) + return x +end + +print(f({})) + +terra f2(x : {}) + return x,x +end + +print(f2({})) + +terra f3(x : {}, a : int) + return a + 1 +end + +assert(f3({},3) == 4) + +terra f4(x : {}) + return x,4 +end + +a = f4({}) +assert(a._1 == 4) + +terra f5() + return f({}) +end + +f5() \ No newline at end of file diff --git a/samples/Terra/enumc.t b/samples/Terra/enumc.t new file mode 100644 index 00000000..575e8c13 --- /dev/null +++ b/samples/Terra/enumc.t @@ -0,0 +1,14 @@ +C = terralib.includecstring [[ + enum Foo { + A_VALUE = -1, + B_VALUE = 4, + C_VALUE = 2 << 1, + D_VALUE = (1 << 31) - 1, + E_VALUE = (1 << 44) + }; +]] +assert(C.A_VALUE == -1) +assert(C.B_VALUE == 4) +assert(C.C_VALUE == 4) +assert(C.D_VALUE == 2147483647) +assert(C.E_VALUE == -2147483648) \ No newline at end of file diff --git a/samples/Terra/evenodd.t b/samples/Terra/evenodd.t new file mode 100644 index 00000000..f226c17a --- /dev/null +++ b/samples/Terra/evenodd.t @@ -0,0 +1,20 @@ +terra iseven(a : uint) : bool + if a == 0 then + return true + else + return isodd(a - 1) + end +end and +terra isodd(a : uint) : bool + if a == 0 then + return false + else + return iseven(a - 1) + end +end + +local test = require("test") +test.eq(iseven(3),false) +test.eq(iseven(2),true) +test.eq(isodd(3),true) +test.eq(isodd(2),false) diff --git a/samples/Terra/examplecompiler1.t b/samples/Terra/examplecompiler1.t new file mode 100755 index 00000000..e98d3dcc --- /dev/null +++ b/samples/Terra/examplecompiler1.t @@ -0,0 +1,41 @@ +import "lib/examplecompiler" +foo = {} + + +local def foo2(b : eg.number) : eg.number return 2 + b end + + +assert(foo2(3) == 5) + +def foo.bar(a : eg.number) : eg.number + return 1 + -2 * 3 + 1 + a - foo2(a) +end + +assert(-6 == foo.bar(4)) + +local c = def(c : eg.number) : eg.number return 4 end + +assert(4 == c(1)) + +def sign(a : eg.number) : eg.number + if a < 0 then + return -1 + else + return 1 + end +end + +def usev(a : eg.number) : eg.number + var b = 1 + return a + b +end + +def what(a : eg.number) : eg.number + var c = usev + return c(a) +end + +assert(usev(4) == 5) +assert(sign(4) == 1) +assert(sign(-3) == -1) +assert(what(4) == 5) \ No newline at end of file diff --git a/samples/Terra/examplelanguage1.t b/samples/Terra/examplelanguage1.t new file mode 100755 index 00000000..f9f46373 --- /dev/null +++ b/samples/Terra/examplelanguage1.t @@ -0,0 +1,7 @@ +import "lib/examplelanguage" + +local a,b = 1,2 +c = 3 +local d = sum a,b,c done + +print(d) \ No newline at end of file diff --git a/samples/Terra/exampleparser1.t b/samples/Terra/exampleparser1.t new file mode 100644 index 00000000..98882fbb --- /dev/null +++ b/samples/Terra/exampleparser1.t @@ -0,0 +1,22 @@ +import "lib.exampleparser" + +P exp -1 + 1 * (2 - 3) +P exp not true or false and 3 +P exp a.b.c[d]()(a,b,c) +P exp (a + 3)(4) +P exp {a,3,4, d = 4, [1+3] = 3} +P exp [ 3 + 4 ] +P statement var a,b,c:int = 3 +P statement do + if a then b else c end + if a then b end + if a then b elseif c then d end + while 3 + 3 do end + repeat + until a + b + for a,b,c:int = 1,3 do end + for a,b,c:int in 1,3 do end + a = b + a + a,c = d,e +end \ No newline at end of file diff --git a/samples/Terra/exittest.t b/samples/Terra/exittest.t new file mode 100644 index 00000000..0f24e5ce --- /dev/null +++ b/samples/Terra/exittest.t @@ -0,0 +1,9 @@ + +C = { exit = terralib.externfunction("exit", int -> {}) } + + +terra moo() + C.exit(0) +end + +moo() \ No newline at end of file diff --git a/samples/Terra/explicitcast.t b/samples/Terra/explicitcast.t new file mode 100644 index 00000000..15d7aab2 --- /dev/null +++ b/samples/Terra/explicitcast.t @@ -0,0 +1,11 @@ + +terra foo() + var a : int64 = 256+3 + var c = intptr(&a) + var d = [&int64](c) + var fi = int(true) + var what = @[&int8](&a) + return @d,fi,what +end +local test = require("test") +test.meq({256+3,1,3},foo()) \ No newline at end of file diff --git a/samples/Terra/exportdynamic.t b/samples/Terra/exportdynamic.t new file mode 100644 index 00000000..3bbd63b3 --- /dev/null +++ b/samples/Terra/exportdynamic.t @@ -0,0 +1,9 @@ +terralib.includepath = terralib.terrahome.."/include/terra" +C = terralib.includecstring [[ + #include "lua.h" + #include "lauxlib.h" +]] + +local s = C.luaL_newstate() +assert(C.lua_gettop(s) == 0) + diff --git a/samples/Terra/expvec.t b/samples/Terra/expvec.t new file mode 100644 index 00000000..94154777 --- /dev/null +++ b/samples/Terra/expvec.t @@ -0,0 +1,34 @@ + +if require("ffi").os == "Windows" then + print("Not consistent on windows") + return +end +local C = terralib.includecstring[[ + #include + void dostuff(__m128 what) {} + void dostuff2() { __m128 a; dostuff(a); } +]] + +local V = 1 +local exp = terralib.intrinsic(("llvm.exp.v%df32"):format(V),vector(float,V) -> vector(float,V)) + +terra foo(N : int) + + var d = vector(0.f,1.f,3.f,4.f) + + C.dostuff(d) + + --var v = vector(0.f,1.f,2.f,3.f,4.f,5.f,6.f,7.f) + var v = vector(0.f) + for i = 0, N do + v = exp(v) + end + return v[0],v[1],v[2],v[3] +end + +C.dostuff:printpretty() + +local begin = terralib.currenttimeinseconds() +print(foo(100000000)) +local endd = terralib.currenttimeinseconds() +print(endd - begin) \ No newline at end of file diff --git a/samples/Terra/f2.t b/samples/Terra/f2.t new file mode 100644 index 00000000..a7507f08 --- /dev/null +++ b/samples/Terra/f2.t @@ -0,0 +1,17 @@ +local C = terralib.includecstring [[ + typedef struct { + int a; + int b; + } Foo; +]] +for i,e in ipairs(C.Foo.entries) do + print(e.field,e.type) +end + +terra useFoo() + var f : C.Foo + f.a = 1 + f.b = 2 +end + +useFoo() \ No newline at end of file diff --git a/samples/Terra/fact.t b/samples/Terra/fact.t new file mode 100644 index 00000000..284bb512 --- /dev/null +++ b/samples/Terra/fact.t @@ -0,0 +1,16 @@ +local test = require("test") + +local Num = int +local terra fact(a : Num) : Num + var c,i = 1,1 + while i <= a do + c = c * i + i = i + 1 + end + return c +end + + +test.eq(fact(1),1) +test.eq(fact(2),2) +test.eq(fact(3),6) \ No newline at end of file diff --git a/samples/Terra/fakeasm.t b/samples/Terra/fakeasm.t new file mode 100644 index 00000000..09998825 --- /dev/null +++ b/samples/Terra/fakeasm.t @@ -0,0 +1,31 @@ + + +local op = setmetatable({},{ __index = function(self,idx) + return idx +end }) +C = terralib.includec("stdio.h") +local function emit(buf,...) + local str = "" + local operands = {} + for i = 1,select("#",...) do + local v = select(i,...) + local cv,e = v:asvalue() + str = str .. (e and "%d" or tostring(cv)) .. " " + if e then table.insert(operands,v) end + end + str = str.."\n" + return `C.sprintf(buf,str,operands) +end +emit = macro(emit) + +local c = "as28" +terra what(buf : rawstring) + var b = 3 + emit(buf,1,3,4,3+3,op.what,b + 3) +end + +local buf = terralib.new(int8[128]) +what(buf) +local ffi = require("ffi") +local s = ffi.string(buf) +assert("1 3 4 6 what 6 \n" == s) diff --git a/samples/Terra/falsespec.t b/samples/Terra/falsespec.t new file mode 100644 index 00000000..970a9695 --- /dev/null +++ b/samples/Terra/falsespec.t @@ -0,0 +1,8 @@ + + +terra derp() + var a = [false] + return a +end + +assert(derp() == false) \ No newline at end of file diff --git a/samples/Terra/fastcall.t b/samples/Terra/fastcall.t new file mode 100644 index 00000000..1cef49bb --- /dev/null +++ b/samples/Terra/fastcall.t @@ -0,0 +1,24 @@ + +terra foo() + return 1 +end + + +assert(1 == foo()) +assert(rawget(foo,"fastcall") == foo:getdefinitions()[1].ffiwrapper) +assert(1 == foo()) + + +terra foo2() + return 1,2 +end +local a,b = terralib.unpackstruct(foo2()) +assert(a == 1 and b == 2) +assert(rawget(foo2,"fastcall") == foo2:getpointer()) +local a,b = unpackstruct(foo2()) +assert(a == 1 and b == 2) + +terra foo(a : int) +end + +assert(rawget(foo,"fastcall") == nil) \ No newline at end of file diff --git a/samples/Terra/fib.t b/samples/Terra/fib.t new file mode 100644 index 00000000..c2fb5fe2 --- /dev/null +++ b/samples/Terra/fib.t @@ -0,0 +1,26 @@ +local test = require("test") + +local Num = int + +local base = {} +terra base.fib(a : Num) : Num + var i,c,p = 0,1,1 + while i < a do + c,p = c + p,c + i = i + 1 + end + return c +end + +function fib2(a) + local i,c,p = 0,1,1 + while i < a do + c,p = c + p,c + i = i + 1 + end + return c +end +for i = 0,10 do + print(base.fib(i)) + test.eq(base.fib(i),fib2(i)) +end \ No newline at end of file diff --git a/samples/Terra/fib2.t b/samples/Terra/fib2.t new file mode 100644 index 00000000..29d8127e --- /dev/null +++ b/samples/Terra/fib2.t @@ -0,0 +1,27 @@ +local test = require("test") + +local Num = int + +terra fib(a : Num) : Num + if a == 0 then + return 1 + elseif a == 1 then + return 1 + else + return fib(a - 1) + fib(a - 2) + end +end + +function fib2(a) + if a == 0 then + return 1 + elseif a == 1 then + return 1 + else + return fib2(a - 1) + fib2(a - 2) + end +end +for i = 0,10 do + print(fib(i)) + test.eq(fib(i),fib2(i)) +end diff --git a/samples/Terra/fnames.t b/samples/Terra/fnames.t new file mode 100644 index 00000000..befb5e4d --- /dev/null +++ b/samples/Terra/fnames.t @@ -0,0 +1,5 @@ +foo = terra(a : int) end +foo:setname("bar") + +assert(foo:getname() == "bar") +foo:disas() \ No newline at end of file diff --git a/samples/Terra/fncalltest.t b/samples/Terra/fncalltest.t new file mode 100644 index 00000000..dcf18907 --- /dev/null +++ b/samples/Terra/fncalltest.t @@ -0,0 +1,16 @@ + + + +terra foo() + +end + + +terra bar() + foo() + var what = foo + --what() +end + +bar:compile() + diff --git a/samples/Terra/fnpointer.t b/samples/Terra/fnpointer.t new file mode 100644 index 00000000..042af355 --- /dev/null +++ b/samples/Terra/fnpointer.t @@ -0,0 +1,24 @@ + +terra foo() + return 4LL +end + +terra bar() + return 5LL +end + +terra bar3(fn: {} -> int64) + return fn() +end + +terra baz(a : int64) + var afn = foo + if a > 2 then + afn = bar + end + return bar3(afn) +end + +local test = require("test") +test.eq(baz(1),4) +test.eq(baz(3),5) \ No newline at end of file diff --git a/samples/Terra/fnptr.t b/samples/Terra/fnptr.t new file mode 100644 index 00000000..baaad41a --- /dev/null +++ b/samples/Terra/fnptr.t @@ -0,0 +1,7 @@ +terra baz() return 1 end +bp = baz:getpointer() +terra foo() + return bp() +end + +assert(foo() == 1) \ No newline at end of file diff --git a/samples/Terra/fnptrc.t b/samples/Terra/fnptrc.t new file mode 100644 index 00000000..935c3341 --- /dev/null +++ b/samples/Terra/fnptrc.t @@ -0,0 +1,25 @@ + +C = terralib.includecstring [[ + struct Foo { + int (*bar)(int); + }; + int runptr(int (*bar)(int), int a) { + return bar(a); + } +]] + +terra add1(a : int) return a + 1 end + +terra what0() + return C.runptr(add1,1) +end + +assert(what0() == 2) + +terra what() + var c : C.Foo + c.bar = add1 + return c.bar(1) +end + +assert(what() == 2) \ No newline at end of file diff --git a/samples/Terra/foo.t b/samples/Terra/foo.t new file mode 100644 index 00000000..0aa5252f --- /dev/null +++ b/samples/Terra/foo.t @@ -0,0 +1 @@ +a = global( struct { real : float, imag : float }) \ No newline at end of file diff --git a/samples/Terra/for.t b/samples/Terra/for.t new file mode 100644 index 00000000..41e4d893 --- /dev/null +++ b/samples/Terra/for.t @@ -0,0 +1,31 @@ + +terra foo(a : int, s : int) + var r = 0 + for i = 0,a,s do + r = r + i + end + return r +end + +terra foo2(a : int) + var r = 0 + for i = 0,a do + r = r + i + end + return r +end + +terra foo3(a : int) + var r = 0 + for i = a,0,-1 do + r = r + i + end + return r +end + +local test = require("test") +test.eq(foo(10,1),45) +test.eq(foo(10,2),20) +test.eq(foo(0,1),0) +test.eq(foo2(10),45) +test.eq(foo3(10),55) \ No newline at end of file diff --git a/samples/Terra/for2.t b/samples/Terra/for2.t new file mode 100644 index 00000000..3bd8f374 --- /dev/null +++ b/samples/Terra/for2.t @@ -0,0 +1,31 @@ + +terra foo(a : uint64, s : uint64) + var r = 0 + for i : uint64 = 0,a,s do + r = r + i + end + return r +end + +terra foo2(a : int) + var r = 0 + for i : int = 0.f,a do + r = r + i + end + return r +end +terra foo3(a : int) + var r = 0 + for i = a,0,-1 do + r = r + i + end + return r +end + + +local test = require("test") +test.eq(foo(10,1),45) +test.eq(foo(10,2),20) +test.eq(foo(0,1),0) +test.eq(foo2(10),45) +test.eq(foo3(10),55) diff --git a/samples/Terra/forbreak.t b/samples/Terra/forbreak.t new file mode 100644 index 00000000..d14b056f --- /dev/null +++ b/samples/Terra/forbreak.t @@ -0,0 +1,17 @@ + +terra foo(a : int, s : int) + var r = 0 + for i = 0,a,s do + if i == 8 then + break + end + r = r + i + + end + return r +end + +local test = require("test") +test.eq(foo(10,1),28) +test.eq(foo(10,2),12) +test.eq(foo(0,1),0) \ No newline at end of file diff --git a/samples/Terra/forlist.t b/samples/Terra/forlist.t new file mode 100644 index 00000000..da427475 --- /dev/null +++ b/samples/Terra/forlist.t @@ -0,0 +1,24 @@ + + +struct Range { + a : int; + b : int; +} +Range.metamethods.__for = function(syms,iter,body) + return syms, quote + var it = iter + for [syms[1]] = it.a,it.b do + body + end + end +end + +terra foo() + var a = 0 + for i in Range {0,10} do + a = a + i + end + return a +end + +assert(foo() == 10*9/2) \ No newline at end of file diff --git a/samples/Terra/forlist2.t b/samples/Terra/forlist2.t new file mode 100644 index 00000000..a09b6d73 --- /dev/null +++ b/samples/Terra/forlist2.t @@ -0,0 +1,37 @@ + + +struct Array { + data : int[3]; +} +Array.metamethods.__for = function(syms,iter,body) + local pe = symbol() + local e = `@pe + return {e}, quote + var it = &iter + for i = 0,3 do + var [pe] = &it.data[i] + body + end + end +end + +terra foo() + var a = Array{ array(1,2,3) } + for i in a do + i = i + 1 + end + return a.data[0] + a.data[1] + a.data[2] +end + +terra foo2() + var a = Array{ array(1,2,3) } + var s = 0 + for i : double in a do + s = s + i + end + return s +end + +assert(foo() == 9) + +assert(foo2() == 6) \ No newline at end of file diff --git a/samples/Terra/forp.t b/samples/Terra/forp.t new file mode 100644 index 00000000..2db2c3e9 --- /dev/null +++ b/samples/Terra/forp.t @@ -0,0 +1,21 @@ +struct Range { + a : int; + b : int; +} +Range.metamethods.__for = function(syms,iter,body) + return syms, quote + var it = iter + for [syms[1]] = it.a,it.b do + body + end + end +end + +terra foo() + var v = Range { 0, 3 } + var vp = &v + var i = 0 + for e in vp do i = i + e end + return i +end +assert(3 == foo()) \ No newline at end of file diff --git a/samples/Terra/forsym.t b/samples/Terra/forsym.t new file mode 100644 index 00000000..10857a48 --- /dev/null +++ b/samples/Terra/forsym.t @@ -0,0 +1,24 @@ + +terra foo(a : int, s : int) + var r = 0 + for i = 0,a,s do + r = r + i + end + return r +end + +local i = symbol() + +terra foo2(a : int) + var r = 0 + for [i] = 0,a do + r = r + [i] + end + return r +end + +local test = require("test") +test.eq(foo(10,1),45) +test.eq(foo(10,2),20) +test.eq(foo(0,1),0) +test.eq(foo2(10),45) \ No newline at end of file diff --git a/samples/Terra/forwardtodef.t b/samples/Terra/forwardtodef.t new file mode 100644 index 00000000..228ad86a --- /dev/null +++ b/samples/Terra/forwardtodef.t @@ -0,0 +1,7 @@ + + +terra foo() + return 1 +end +foo:setinlined(true) +foo:disas() \ No newline at end of file diff --git a/samples/Terra/functionnoproto.t b/samples/Terra/functionnoproto.t new file mode 100644 index 00000000..1ce9bad8 --- /dev/null +++ b/samples/Terra/functionnoproto.t @@ -0,0 +1,6 @@ +C = terralib.includecstring [[ + typedef int (*PROC)(); + PROC what() { return 0; } +]] + +assert(C.what() == nil) \ No newline at end of file diff --git a/samples/Terra/gctest.t b/samples/Terra/gctest.t new file mode 100644 index 00000000..12342798 --- /dev/null +++ b/samples/Terra/gctest.t @@ -0,0 +1,18 @@ + + + + +local terra foo() +end + +local terra bar() +end + +foo:compile() +bar:compile() +foo = nil + +collectgarbage() +collectgarbage() + +print("HERE") \ No newline at end of file diff --git a/samples/Terra/gemm.t b/samples/Terra/gemm.t new file mode 100644 index 00000000..5993ae22 --- /dev/null +++ b/samples/Terra/gemm.t @@ -0,0 +1,207 @@ +local number = double +local alignment = 8 +local dotune = false + +function symmat(name,I,...) + if not I then return symbol(name) end + local r = {} + for i = 0,I-1 do + r[i] = symmat(name..tostring(i),...) + end + return r +end + +local function isinteger(x) return math.floor(x) == x end + +llvmprefetch = terralib.intrinsic("llvm.prefetch",{&opaque,int,int,int} -> {}) +local function unalignedload(addr) + return `terralib.attrload(addr, { align = alignment }) +end +local function unalignedstore(addr,v) + return `terralib.attrstore(addr,v, { align = alignment }) +end + +unalignedload,unalignedstore = macro(unalignedload),macro(unalignedstore) + +function genkernel(NB, RM, RN, V,alpha,boundary) + + local M,N,K, boundaryargs + if boundary then + M,N,K = symbol(int64,"M"),symbol(int64,"N"),symbol(int64,"K") + boundaryargs = terralib.newlist({M,N,K}) + else + boundaryargs = terralib.newlist() + M,N,K = NB,NB,NB + end + + local A,B,C,mm,nn,ld = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn"),symbol("ld") + local lda,ldb,ldc = symbol("lda"),symbol("ldb"),symbol("ldc") + local a,b,c,caddr = symmat("a",RM), symmat("b",RN), symmat("c",RM,RN), symmat("caddr",RM,RN) + local k = symbol("k") + + local loadc,storec = terralib.newlist(),terralib.newlist() + local VT = vector(number,V) + local VP = &VT + for m = 0, RM-1 do + for n = 0, RN-1 do + loadc:insert(quote + var [caddr[m][n]] = C + m*ldc + n*V + var [c[m][n]] = alpha * unalignedload(VP([caddr[m][n]])) + end) + storec:insert(quote + unalignedstore(VP([caddr[m][n]]),[c[m][n]]) + end) + end + end + + local calcc = terralib.newlist() + + for n = 0, RN-1 do + calcc:insert(quote + var [b[n]] = unalignedload(VP(&B[n*V])) + end) + end + for m = 0, RM-1 do + calcc:insert(quote + var [a[m]] = VT(A[m*lda]) + end) + end + for m = 0, RM-1 do + for n = 0, RN-1 do + calcc:insert(quote + [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] + end) + end + end + + local result = terra([A] : &number, [B] : &number, [C] : &number, [lda] : int64,[ldb] : int64,[ldc] : int64,[boundaryargs]) + for [mm] = 0, M, RM do + for [nn] = 0, N,RN*V do + [loadc]; + for [k] = 0, K do + llvmprefetch(B + 4*ldb,0,3,1); + [calcc]; + B = B + ldb + A = A + 1 + end + [storec]; + A = A - K + B = B - ldb*K + RN*V + C = C + RN*V + end + C = C + RM * ldb - N + B = B - N + A = A + lda*RM + end + end + return result +end + +local stdlib = terralib.includec("stdlib.h") +local IO = terralib.includec("stdio.h") + +local terra min(a : int, b : int) + return terralib.select(a < b, a, b) +end +function blockedloop(N,M,K,blocksizes,bodyfn) + local function generatelevel(n,ii,jj,kk,bb0,bb1,bb2) + if n > #blocksizes then + return bodyfn(ii,jj,kk) + end + local blocksize = blocksizes[n] + return quote for i = ii,min(ii+bb0,N),blocksize do + for j = jj,min(jj+bb1,M),blocksize do + for k = kk,min(kk+bb2,K),blocksize do + [ generatelevel(n+1,i,j,k,blocksize,blocksize,blocksize) ] + end end end end + end + return generatelevel(1,0,0,0,N,M,K) +end + +function generatedgemm(NB,NBF,RM,RN,V) + if not isinteger(NB/(RN*V)) or not isinteger(NB/RM) then + return false + end + + local NB2 = NBF * NB + local l1dgemm0 = genkernel(NB,RM,RN,V,0,false) + local l1dgemm1 = genkernel(NB,RM,RN,V,1,false) + local l1dgemm0b = genkernel(NB,1,1,1,0,true) + local l1dgemm1b = genkernel(NB,1,1,1,1,true) + + return terra(gettime : {} -> double, M : int, N : int, K : int, alpha : number, A : &number, lda : int, B : &number, ldb : int, + beta : number, C : &number, ldc : int) + [ blockedloop(N,M,K,{NB2,NB},function(m,n,k) return quote + var MM,NN,KK = min(M-m,NB),min(N-n,NB),min(K-k,NB) + var isboundary = MM < NB or NN < NB or KK < NB + var AA,BB,CC = A + (m*lda + k),B + (k*ldb + n),C + (m*ldc + n) + if k == 0 then + if isboundary then + --IO.printf("b0 %d %d %d\n",MM,NN,KK) + l1dgemm0b(AA,BB,CC,lda,ldb,ldc,MM,NN,KK) + + --IO.printf("be %d %d %d\n",MM,NN,KK) + else + l1dgemm0(AA,BB,CC,lda,ldb,ldc) + end + else + if isboundary then + + --IO.printf("b %d %d %d\n",MM,NN,KK) + l1dgemm1b(AA,BB,CC,lda,ldb,ldc,MM,NN,KK) + + --IO.printf("be %d %d %d\n",MM,NN,KK) + else + l1dgemm1(AA,BB,CC,lda,ldb,ldc) + end + end + end end) ] + end +end + +local blocksizes = {16,24,32,40,48,56,64} +local regblocks = {1,2,4} +local vectors = {1,2,4,8,16} +--local best = { gflops = 0, b = 56, rm = 4, rn = 1, v = 8 } +local best = { gflops = 0, b = 40, rm = 4, rn = 2, v = 4 } +--local best = { gflops = 0, b = 40, rm = 1, rn = 1, v = 1 } + +if dotune then + local tunefor = 1024 + local harness = require("lib/matrixtestharness") + for _,b in ipairs(blocksizes) do + for _,rm in ipairs(regblocks) do + for _,rn in ipairs(regblocks) do + for _,v in ipairs(vectors) do + local my_dgemm = generatedgemm(b,5,rm,rn,v) + if my_dgemm then + print(b,rm,rn,v) + my_dgemm:compile() + local i = math.floor(tunefor / b) * b + local avg = 0 + local ctyp + local s, times = harness.timefunctions(tostring(number),i,i,i,function(M,K,N,A,B,C) + my_dgemm(nil,M,N,K,1.0,A,K,B,N,0.0,C,N) + end) + if not s then + print("") + break + end + print(i,unpack(times)) + local avg = times[1] + if best.gflops < avg then + best = { gflops = avg, b = b, rm = rm, rn = rn, v = v } + terralib.tree.printraw(best) + end + end + end + end + end + end +end +local my_dgemm = generatedgemm(best.b, 5, best.rm, best.rn, best.v) +if number == double then + terralib.saveobj("my_dgemm.o", { my_dgemm = my_dgemm }) +else + terralib.saveobj("my_sgemm.o", { my_sgemm = my_dgemm }) +end \ No newline at end of file diff --git a/samples/Terra/getmethod.t b/samples/Terra/getmethod.t new file mode 100644 index 00000000..5d93531a --- /dev/null +++ b/samples/Terra/getmethod.t @@ -0,0 +1,19 @@ + + +struct A {} + + +A.metamethods.__getmethod = function(self,methodname) + local c = methodname:sub(1,1):byte() + return terra(a : &A) + return c + end +end + + +terra foo() + var a : A + return a:a() + a:b() +end + +assert(foo() == ("a"):byte() + ("b"):byte()) \ No newline at end of file diff --git a/samples/Terra/gettype.t b/samples/Terra/gettype.t new file mode 100644 index 00000000..dacd2b39 --- /dev/null +++ b/samples/Terra/gettype.t @@ -0,0 +1,18 @@ + + + +function makestuff(a) + local T = a:gettype() + local struct ST { + a : T + } + return `ST { a } +end + +makestuff = macro(makestuff) + +terra useit() + return makestuff(true).a,makestuff(3.0).a +end +local test = require("test") +test.meq({true,3},useit()) \ No newline at end of file diff --git a/samples/Terra/globals.t b/samples/Terra/globals.t new file mode 100644 index 00000000..9dc6d6ba --- /dev/null +++ b/samples/Terra/globals.t @@ -0,0 +1,26 @@ + +struct A { a : int } +local a = terralib.global(A) +a:set({3}) +local b = terralib.global(true) +local c = terralib.global(int[3]) +local d = terralib.global(3.5) + +terra foobar() + c[0] = 3 + return a.a + d +end + +e = global(int) +terra doihaveaname() + e = 10 + return e +end + +assert(doihaveaname() == 10) +assert(6.5 == foobar()) +print("HERE") +assert(true == b:get()) +assert(3 == c:get()[0]) + +print("TODO - fix handling of initializers for array-like things and literal strings") \ No newline at end of file diff --git a/samples/Terra/goto.t b/samples/Terra/goto.t new file mode 100644 index 00000000..241adf0c --- /dev/null +++ b/samples/Terra/goto.t @@ -0,0 +1,16 @@ + + +terra foo() + var a = 0 + ::begin:: + if a >= 10 then + goto theend + end + a = a + 1 + goto begin + ::theend:: + return a +end + +test = require("test") +test.eq(foo(),10) \ No newline at end of file diff --git a/samples/Terra/goto2.t b/samples/Terra/goto2.t new file mode 100644 index 00000000..f8f430da --- /dev/null +++ b/samples/Terra/goto2.t @@ -0,0 +1,18 @@ + +local begin = symbol() +local theend = symbol() + +terra foo() + var a = 0 + ::[begin]:: + if a >= 10 then + goto [theend] + end + a = a + 1 + goto [begin] + ::[theend]:: + return a +end + +test = require("test") +test.eq(foo(),10) \ No newline at end of file diff --git a/samples/Terra/gvarfault.t b/samples/Terra/gvarfault.t new file mode 100644 index 00000000..6702563b --- /dev/null +++ b/samples/Terra/gvarfault.t @@ -0,0 +1,24 @@ +if require("ffi").os == "Windows" then + print("Disabled on windows (uses unistd.h)") + return +end +local C = terralib.includecstring( +[[ +#include +#include +#include +#include +#include +]] +) + +local gstr = global(&int8, "some text") + +terra fun1() + C.printf("gstr: %s \n", gstr) + return 0 +end + +fun1:printpretty() + +fun1() \ No newline at end of file diff --git a/samples/Terra/hasbeenfrozen.t b/samples/Terra/hasbeenfrozen.t new file mode 100644 index 00000000..c1c40866 --- /dev/null +++ b/samples/Terra/hasbeenfrozen.t @@ -0,0 +1,33 @@ +struct A { + a : int; + b : int; + c : &B +} and struct B { + a : &A +} + +local a = global(A) + + +terra foo() + var b : B + return a.a + a.b +end + +function A.metamethods.__staticinitialize(self) + print("A") + assert(A:iscomplete()) + a:get().a = 4 +end + +function B.metamethods.__staticinitialize(self) + print("B") + assert(B:iscomplete()) + a:get().b = 3 + foo:gettype(function() + assert(foo() == 7) + a:get().a = a:get().a + 1 + end) +end + +assert(foo() == 8) \ No newline at end of file diff --git a/samples/Terra/hello.t b/samples/Terra/hello.t new file mode 100644 index 00000000..81af8917 --- /dev/null +++ b/samples/Terra/hello.t @@ -0,0 +1,8 @@ +local c = terralib.includec("stdio.h") + +terra hello() + c.printf("hello, world\n") +end + +terralib.saveobj("hello",{main = hello}) +hello() diff --git a/samples/Terra/hello2.t b/samples/Terra/hello2.t new file mode 100644 index 00000000..638b5e15 --- /dev/null +++ b/samples/Terra/hello2.t @@ -0,0 +1,10 @@ + +local c = terralib.includec("stdio.h") + +terralib.tree.printraw(getmetatable(c).errors) + +terra main() + c.printf("hello, world\n") +end + +main() \ No newline at end of file diff --git a/samples/Terra/hexf.t b/samples/Terra/hexf.t new file mode 100644 index 00000000..6b767b49 --- /dev/null +++ b/samples/Terra/hexf.t @@ -0,0 +1,9 @@ + + +assert(0xf == 15) + +terra foo() + return 0xf +end + +assert(foo() == 15) \ No newline at end of file diff --git a/samples/Terra/huge.t b/samples/Terra/huge.t new file mode 100644 index 00000000..e52733db --- /dev/null +++ b/samples/Terra/huge.t @@ -0,0 +1,7 @@ + + +terra returnhuge() + return math.huge +end + +assert(returnhuge() == math.huge) \ No newline at end of file diff --git a/samples/Terra/ifelse.t b/samples/Terra/ifelse.t new file mode 100644 index 00000000..2f3d83a0 --- /dev/null +++ b/samples/Terra/ifelse.t @@ -0,0 +1,17 @@ + +terra foo(a : int) + return terralib.select(a > 0, 1,-1) +end + + +terra foo2(a : int) + var c = vector(a > 0, a > 1, a > 2) + var d = terralib.select(c,vector(1,2,3),vector(4,5,6)) + return d[0], d[1], d[2] +end +local test = require("test") + +test.eq(foo(1),1) +test.eq(foo(-1),-1) + +test.meq({1,5,6},foo2(1)) \ No newline at end of file diff --git a/samples/Terra/includec.t b/samples/Terra/includec.t new file mode 100644 index 00000000..3ebb9f4d --- /dev/null +++ b/samples/Terra/includec.t @@ -0,0 +1,42 @@ + +local c = terralib.includec("mytest.h") + +terra foo() + var a : int = 3 + return c.myfoobarthing(1,2,3.5,&a) + a +end + +terra bar() + return c.myotherthing(4,5) +end + +terra bar2() + return c.myfnptr(bar) +end + +terra bar3() + var a : c.size_t = 3 + return a +end + +terra bar4() + var opaquething : c.MyStruct2 + var my = c.MyStruct { 3, 4} + return my.a + my.b +end + +terra writefile() + c.printf("%f %f %f\n",3.0,4.0,5.0) + var f = c.fopen("afile.txt","w") + c.fputs("a string\n",f) + c.fclose(f) +end + +local test = require("test") + +test.eq(foo(),15) +test.eq(c.myotherthing(1,2),3) +test.eq(bar2(),9) +test.eq(bar3(),3) +test.eq(bar4(),7) +writefile() diff --git a/samples/Terra/includetwice.t b/samples/Terra/includetwice.t new file mode 100644 index 00000000..eeba70d4 --- /dev/null +++ b/samples/Terra/includetwice.t @@ -0,0 +1,21 @@ + + +local C1 = terralib.includecstring [[ + typedef struct { int a; } A; + int geta(A* a) { return a->a; } +]] +local C2 = terralib.includecstring [[ + typedef struct { int a; } A; + void seta(A* a, int v) { a->a = v; } +]] + +assert(C1.A == C2.A) + + +terra usethem() + var a = C1.A { 1 } + C2.seta(&a,C1.geta(&a) + 3) + return a.a +end + +assert(usethem() == 4) \ No newline at end of file diff --git a/samples/Terra/incomplete.t b/samples/Terra/incomplete.t new file mode 100644 index 00000000..8b1d4662 --- /dev/null +++ b/samples/Terra/incomplete.t @@ -0,0 +1,32 @@ + + +struct A + +terra foo(a : &A) + return a +end + +assert(nil == foo(nil)) +assert(false == A:iscomplete()) + + +struct A { + b : int +} + +terra foo2(a : &A) + a.b = 6 + return @a +end + +foo2:compile() +assert(true == A:iscomplete()) + +local ptr = terralib.new(A) + +ptr.b = 4 + +local r = foo2(ptr) + +assert(r.b == 6) +assert(ptr.b == 6) \ No newline at end of file diff --git a/samples/Terra/incomplete2.t b/samples/Terra/incomplete2.t new file mode 100644 index 00000000..17223680 --- /dev/null +++ b/samples/Terra/incomplete2.t @@ -0,0 +1,25 @@ + +struct A { + b : &B +} and +struct B + + +terra foo() + var a : A + a.b = nil + return a +end + +local a = foo() + + +struct B { + a : int +} + +terra foo2(a : &A) + a.b = a.b + 1 +end + +foo2(a) diff --git a/samples/Terra/incomplete3.t b/samples/Terra/incomplete3.t new file mode 100644 index 00000000..c23bb9be --- /dev/null +++ b/samples/Terra/incomplete3.t @@ -0,0 +1,29 @@ + +struct A { + b : B -> C +} and +struct B and struct C + + +terra foo() + var a : A + a.b = nil + return a +end + +local a = foo() + + +struct B { + a : int +} +struct C { + b : int +} + +terra foo2(a : &A) + var ptrb : &B + var c = a.b(@ptrb) +end + +foo2:compile() \ No newline at end of file diff --git a/samples/Terra/incomplete4.t b/samples/Terra/incomplete4.t new file mode 100644 index 00000000..765eadc1 --- /dev/null +++ b/samples/Terra/incomplete4.t @@ -0,0 +1,22 @@ + + +struct A + +terra foo(a : &A) + return a +end + +assert(nil == foo(nil)) +assert(false == A:iscomplete()) + + +struct A { + b : int +} + +terra foo2(a : &A) + return a.b +end + +foo2:compile() +assert(true == A:iscomplete()) diff --git a/samples/Terra/incomplete5.t b/samples/Terra/incomplete5.t new file mode 100644 index 00000000..444b451e --- /dev/null +++ b/samples/Terra/incomplete5.t @@ -0,0 +1,65 @@ + + + +--terra things that should complete the type +local ct = {} + +--terra things that should not complete the type +local dct = {} + + + +function ct.a(A) + return terra(a : A) return a end +end + +function ct.b(A) + return terra() var a : A end +end + +function ct.c(A) + return terra(a : &A) return a + 1 end +end +function ct.d(A) + local at = A[3] + return terra(a : A[3]) return a[0] end +end +function ct.e(A) + local struct B { a : A } + return terra(a : B) end +end + +function dct.c(A) + local at = A[3] + return terra(a : &A[3]) return a end +end + +function dct.b(A) + return terra(a : &A) return a end +end + +function dct.d(A) + local struct B { + a : &A; + b : int + } + return terra(a : &B) return a.b end +end + + +local function testthem(stuff,completestype) + for k,v in pairs(stuff) do + local struct A + if completestype then + struct A { + a : int + } + end + local result = v(A) + result:compile() + assert(A:iscomplete() == completestype) + end +end + +testthem(ct,true) +testthem(dct,false) \ No newline at end of file diff --git a/samples/Terra/incompletetypetest.t b/samples/Terra/incompletetypetest.t new file mode 100644 index 00000000..e35cfd90 --- /dev/null +++ b/samples/Terra/incompletetypetest.t @@ -0,0 +1,13 @@ + + +struct A { + a : int +} + + +terra what() + var a : &A = nil + return &a[4] +end + +what:compile() \ No newline at end of file diff --git a/samples/Terra/incompletetypetest2.t b/samples/Terra/incompletetypetest2.t new file mode 100644 index 00000000..9f48c53e --- /dev/null +++ b/samples/Terra/incompletetypetest2.t @@ -0,0 +1,13 @@ + + +struct A { + a : int +} + + +terra what() + var a : &A = nil + return a + 4 +end + +what:compile() \ No newline at end of file diff --git a/samples/Terra/incompletetypetest3.t b/samples/Terra/incompletetypetest3.t new file mode 100644 index 00000000..bae8aa2f --- /dev/null +++ b/samples/Terra/incompletetypetest3.t @@ -0,0 +1,13 @@ + + +struct A { + a : int +} + + +terra what() + var a : &A = nil + return a - a +end + +what:compile() \ No newline at end of file diff --git a/samples/Terra/indexing64.t b/samples/Terra/indexing64.t new file mode 100644 index 00000000..4c87ff73 --- /dev/null +++ b/samples/Terra/indexing64.t @@ -0,0 +1,10 @@ + + +terra foo() + var a : int[5] + a[2] = 2 + var b = [int64](2) + return a[b] +end + +assert(foo() == 2) \ No newline at end of file diff --git a/samples/Terra/indexingbug.t b/samples/Terra/indexingbug.t new file mode 100644 index 00000000..0f9cee13 --- /dev/null +++ b/samples/Terra/indexingbug.t @@ -0,0 +1,31 @@ +arr = terralib.new(int[256]) + +arr[252] = 12 + +terra foo(arr : &int) + var idx = [uint8](252) + return arr[idx] +end + +terra foo2(arr : &int) + var idx = [uint8](252) + return @(arr + idx) +end + +terra foo3(arr : &int) + var idx = [int8](-3) + arr = arr + 255 + return @(arr + idx) +end + + +terra foo4(arr : &int) + var idx = [int8](-3) + arr = arr + 255 + return arr[idx] +end + +assert(foo2(arr) == 12) +assert(foo(arr) == 12) +assert(foo3(arr) == 12) +assert(foo4(arr) == 12) \ No newline at end of file diff --git a/samples/Terra/interface.t b/samples/Terra/interface.t new file mode 100644 index 00000000..d837aa60 --- /dev/null +++ b/samples/Terra/interface.t @@ -0,0 +1,33 @@ + +IO = terralib.includec("stdio.h") +local Class = require("lib/javalike") + +struct A { + a : int +} + +terra A:foo(a : int) : int + return self.a + a +end + +local m = A.methods.foo:getdefinitions()[1] + +HasFoo = Class.interface({ foo = int -> int }) + +Class.implements(A,HasFoo) + +terra hasfoo(a : &HasFoo) + return a:foo(3) +end + +terra testit() + var a = A.alloc() + a.a = 4 + return hasfoo(a) + a:foo(5) +end + +print(m:getpointer()) +testit:compile() +print("DONE") + +assert(testit() == 16) \ No newline at end of file diff --git a/samples/Terra/interface2.t b/samples/Terra/interface2.t new file mode 100644 index 00000000..bdb9a02d --- /dev/null +++ b/samples/Terra/interface2.t @@ -0,0 +1,38 @@ + +IO = terralib.includec("stdio.h") +local Class = require("lib/javalike") + +HasFoo = Class.interface({ foo = int -> int }) + +struct A { + a : int +} + +terra A:foo(a : int) : int + return 1 +end +Class.implements(A,HasFoo) + +struct B {} +Class.extends(B,A) + + +struct C {} +Class.extends(C,B) + +terra C:foo(a : int) : int + return 3 +end + +terra hasfoo(a : &HasFoo) + return a:foo(3) +end + +terra testit() + var a = A.alloc() + var b = B.alloc() + var c = C.alloc() + return hasfoo(a) + hasfoo(b) + hasfoo(c) +end + +assert(testit() == 5) \ No newline at end of file diff --git a/samples/Terra/intrinsic.t b/samples/Terra/intrinsic.t new file mode 100644 index 00000000..8617ce5c --- /dev/null +++ b/samples/Terra/intrinsic.t @@ -0,0 +1,21 @@ +local sqrt = terralib.intrinsic("llvm.sqrt.f32",float -> float) +local sqrt2 = terralib.intrinsic("llvm.sqrt.v4f32",vector(float,4) -> vector(float,4)) + +local sqrt3 = terralib.intrinsic(function(types) + if #types == 1 and types[1]:isvector() and types[1].type == float then + local N = types[1].N + return ("llvm.sqrt.v%df32"):format(N), vector(float,N) -> vector(float,N) + elseif #types == 1 and types[1] == float then + return "llvm.sqrt.f32",float -> float + end +end) + +terra foo() + var v = vector(1.f,2.f,3.f,4.f) + var c = sqrt2(vector(1,2,3,4)) + return sqrt(4) + c[3] + sqrt3(v)[3] + sqrt3(4.f) +end + +local test = require("test") + +test.eq(foo(),8) \ No newline at end of file diff --git a/samples/Terra/isvolatile.t b/samples/Terra/isvolatile.t new file mode 100644 index 00000000..f293fb96 --- /dev/null +++ b/samples/Terra/isvolatile.t @@ -0,0 +1,7 @@ + + +terra foobar(a : &vector(float,4),b : vector(int,4)) + terralib.attrstore(a,b,{ isvolatile = true }) +end + +foobar:disas() diff --git a/samples/Terra/labelbug.t b/samples/Terra/labelbug.t new file mode 100644 index 00000000..4d996e4f --- /dev/null +++ b/samples/Terra/labelbug.t @@ -0,0 +1,5 @@ + +terra foo() + ::alabel:: ;; + return 0 +end \ No newline at end of file diff --git a/samples/Terra/latelink.t b/samples/Terra/latelink.t new file mode 100644 index 00000000..43a64765 --- /dev/null +++ b/samples/Terra/latelink.t @@ -0,0 +1,24 @@ +C = terralib.includecstring [[ + typedef struct { + int a; + } S; + typedef struct { + S a; + } A; +]] +C2 = terralib.includecstring [[ + typedef struct { + int a; + } S; + typedef struct { + S a; + } B; +]] + +terra second() + var a : C2.B + var b : C.A + + a.a = b.a +end +second:disas() \ No newline at end of file diff --git a/samples/Terra/lazycstring.t b/samples/Terra/lazycstring.t new file mode 100644 index 00000000..3b3270a1 --- /dev/null +++ b/samples/Terra/lazycstring.t @@ -0,0 +1,21 @@ + +struct A { + a : int +} + + +print(A:cstring()) + +terra foo() + return A { 1 } +end + +struct B { + a : int +} + +terra foo2() + return B { 1 } +end + +assert(foo().a == foo2().a) \ No newline at end of file diff --git a/samples/Terra/lazylog.t b/samples/Terra/lazylog.t new file mode 100644 index 00000000..84bba0fa --- /dev/null +++ b/samples/Terra/lazylog.t @@ -0,0 +1,61 @@ +local function gentrees(depth) + local function treetostring(tree) + if type(tree) == "string" then return tree + elseif tree.rhs then return "(" .. treetostring(tree.lhs) .. " " .. tree.op .. " " .. treetostring(tree.rhs) .. ")" + else return "(" .. tree.op .. " " .. treetostring(tree.lhs) .. ")" end + end + local function gendepth(depth) + local trees = {} + table.insert(trees, "%s") + if depth == 0 then return trees end + local subtrees = gendepth(depth - 1) + for _,t0 in ipairs(subtrees) do + table.insert(trees, { lhs = t0, op = "not" }) + for _,t1 in ipairs(subtrees) do + table.insert(trees, { lhs = t0, rhs = t1, op = "and" }) + table.insert(trees, { lhs = t0, rhs = t1, op = "or" }) + end + end + return trees + end + local trees = gendepth(depth) + local nargs = 2 ^ depth + local argassign = "local i0" + local targs = "return terra(i0 : bool" + local args = {"i0"} + for i = 1, nargs - 1 do + local arg = "i"..tostring(i) + table.insert(args,arg) + argassign = argassign .. ", " .. arg + targs = targs .. ", " .. arg .. " : bool" + end + argassign = argassign .. " = ..." + targs = targs .. ")" + + argassign = argassign .. "\nreturn " + targs = targs .. "\nreturn " + for treeno,t in ipairs(trees) do + local line = string.format(treetostring(t),unpack(args)) + io.write(string.format("\r%3d%% %s",treeno/#trees * 100,line)) + local lcode = argassign .. line + local tcode = targs .. line .. " end" + local lfn = assert(loadstring(lcode)) + local tfn = assert(terralib.loadstring(tcode))() + tfn:compile() + local states = 2 ^ nargs + local actuals = {} + local band = bit.band + local blshift = bit.lshift + for i = 0, states - 1 do + for s = 1, nargs do + actuals[s] = 0 ~= band(i,blshift(1,s-1)) + end + local result = lfn(unpack(actuals)) + local result2 = tfn(unpack(actuals)) + assert(result == result2) + end + end + io.write("\n") +end + +gentrees(2) \ No newline at end of file diff --git a/samples/Terra/leaktest.t b/samples/Terra/leaktest.t new file mode 100644 index 00000000..d49ff6bb --- /dev/null +++ b/samples/Terra/leaktest.t @@ -0,0 +1,27 @@ +local leak = require "lib.leak" + +function make() + local terra a(x:int) + return x+1 + end + + local terra b(x:int) + return a(x) + end + + return b(12),leak.track(b) +end +nan = 0/0 +res,t=make() +assert(res == 13) +local gcd, path = leak.find(t) +if gcd then + print(path) + assert(false) +end + +l = leak.track(leak) +foo = 0/0 +local f,p = leak.find(l) +assert(f) +assert(p == "$locals.leak") \ No newline at end of file diff --git a/samples/Terra/let1.t b/samples/Terra/let1.t new file mode 100644 index 00000000..2363cc7f --- /dev/null +++ b/samples/Terra/let1.t @@ -0,0 +1,15 @@ + + +terra foo() + return (1),(2) +end + +terra bar() + var c = [quote var a = 3 in a end] + var d = 5 + c = c + 10 + return [quote var a = 3 in [quote var b = 4 in a + b + c + d end] end] +end +local test = require("test") +test.meq({1,2},foo()) +assert(25 == bar()) diff --git a/samples/Terra/let2.t b/samples/Terra/let2.t new file mode 100644 index 00000000..273984a2 --- /dev/null +++ b/samples/Terra/let2.t @@ -0,0 +1,64 @@ + + +local a = +quote + var b = 1 +in + b + 0, b + 1 +end + +terra f0() + return (a) +end +terra f1() + return a +end +terra f2() + a +end +local test = require("test") +test.meq({1,2},f0()) +test.meq({1,2},f1()) + +local c = symbol() +local b = +quote + var [c] = 3 +in + c,c+1 +end + +terra f3() + b + return ([c]) +end +assert(f3() == 3) + +a = global(1) +local emptyexp = quote + a = a + 1 +end + +local emptystmts = {4,3} + +local both = quote +in 4,[quote a = a + 1 in 3 end] +end + +terra bar(a : int, b : int) + return a + b +end +terra bar2(a : int, b : int, c : {}) + return a + b +end +terra f4() + return bar(emptystmts) + bar2(1,2,emptyexp) + a +end + +assert(f4() == 12) + +terra f5() + return bar(both._0,both._0) + a +end + +assert(f5() == 12) \ No newline at end of file diff --git a/samples/Terra/linkllvm.t b/samples/Terra/linkllvm.t new file mode 100644 index 00000000..852f503f --- /dev/null +++ b/samples/Terra/linkllvm.t @@ -0,0 +1,13 @@ + + +terra add(a : int, b : int) + return a + b +end + + +terralib.saveobj("add.bc",{ add = add }) + +local addlib = terralib.linkllvm("add.bc") +add2 = addlib:extern("add", {int,int} -> int) + +assert(add2(3,4) == 7) \ No newline at end of file diff --git a/samples/Terra/localenv.t b/samples/Terra/localenv.t new file mode 100644 index 00000000..da37d91a --- /dev/null +++ b/samples/Terra/localenv.t @@ -0,0 +1,46 @@ + +local a = 4 +b = 3 +local terra foo() + return a + b +end +local terra bar() + return foo() +end +local test = require("test") + +test.eq(foo(),7) +test.eq(bar(),7) + +terra nested() + return [ (function(a) return a + b end)(8) ] +end +terra nested2() + return [ a + b ] +end +local c = {} +local d = {} +local vv = {} +local b = 3 +local e = 8 +g = 1 +local dd = 8 + aa = global(10) +terra nested3() + var luav = 8 + return [ (function() + local b = 5 + function c.b() return 7 end + local f = 7 + vv.bb = global(aa:get()) + terra d.c() return e + f + g + vv.bb + [ `dd ] end + return b + a + end)() ] +end + +test.eq(nested(),11) + +test.eq(nested2(),7) +test.eq(nested3(),9) +test.eq(c.b(),7) +test.eq(d.c(),34) \ No newline at end of file diff --git a/samples/Terra/localenv2.t b/samples/Terra/localenv2.t new file mode 100644 index 00000000..355602ba --- /dev/null +++ b/samples/Terra/localenv2.t @@ -0,0 +1,7 @@ + +local dd = 8 +terra nested3() + return [ `dd ] +end +local test = require("test") +test.eq(nested3(),8) \ No newline at end of file diff --git a/samples/Terra/logical.t b/samples/Terra/logical.t new file mode 100644 index 00000000..7e4f7523 --- /dev/null +++ b/samples/Terra/logical.t @@ -0,0 +1,33 @@ + + +local T = true +local F = false + +terra check() + var a = true + return not true == false +end + +assert(check() == true) + +terra check2() + return not T == F +end + +assert(check2() == true) + +terra check3() + return not T == not not T +end + +assert(check3() == false) + +terra check4() + return not not T == T and not not F == F and true == T and false == F +end + +assert(check4() == true) + +terra foo() return not false end + +assert(foo() == true) \ No newline at end of file diff --git a/samples/Terra/luabridge.t b/samples/Terra/luabridge.t new file mode 100644 index 00000000..d7fcb285 --- /dev/null +++ b/samples/Terra/luabridge.t @@ -0,0 +1,18 @@ +struct A { a : int, b : double } + +terra foo(a : A) + return a.a + a.b +end + + +terra foo2(a : A) + return a.a + a.b,a.a +end + +local test = require("test") + +test.eq( foo( {a = 1,b = 2.3} ), 3.3 ) +test.eq( foo( {1,2.3} ), 3.3 ) +test.eq( foo( {b = 1, a = 2.3} ),3 ) + +test.meq({3.3,1},foo2( { a = 1, b = 2.3} )) \ No newline at end of file diff --git a/samples/Terra/luabridge2.t b/samples/Terra/luabridge2.t new file mode 100644 index 00000000..f4d86412 --- /dev/null +++ b/samples/Terra/luabridge2.t @@ -0,0 +1,92 @@ +struct A { a : int, b : double } + +terra returnstruct() + var a = A { 1, 2.5} + return a +end +terra returnstruct2() + var a = A { 1, 2.5} + var b = A { 2, 3.5} + return a,b +end + +terra returnarray() + var a : int[4] = array(1,2,3,4) + return a +end +terra returnarray2() + var a : int[4] = array(1,2,3,4) + var b : int[4] = array(5,6,7,8) + return a,b +end + +terra returnaos() + var a : A[2] = arrayof(A, {1,2.5}, {2,3.5} ) + return a +end +struct B { a : int[4] } +terra returnsoa() + var a = B { array(1,2,3,4) } + return a +end + +global_a = global(A) +global_a:set( {3, 4.5}) + +terra retstructptr() + return &global_a +end +terra structptr(a : &A) + return a.a + a.b +end + +global_arr = global(int[2]) +global_arr:set({3,4}) + +terra retarrptr() + return &global_arr +end +terra arrptr(a : &int[2]) + return (@a)[0] + a[0][1] +end + +local test = require("test") +local a0 = returnstruct() +test.eq(a0.a,1) +test.eq(a0.b,2.5) +local a1,b1 = terralib.unpackstruct(returnstruct2()) +test.eq(a1.a,1) +test.eq(a1.b,2.5) +test.eq(b1.a,2) +test.eq(b1.b,3.5) +--[[ C doesn't actually allow you to return arrays directly +local arr = returnarray() +test.eq(arr[0],1) +test.eq(arr[1],2) +test.eq(arr[2],3) +test.eq(arr[3],4) +local arr2,arr3 = returnarray2() +test.eq(arr2[0],1) +test.eq(arr2[1],2) +test.eq(arr2[2],3) +test.eq(arr2[3],4) +test.eq(arr3[0],5) +test.eq(arr3[1],6) +test.eq(arr3[2],7) +test.eq(arr3[3],8) +local arr4 = returnaos() +test.eq(arr4[0].a,1) +test.eq(arr4[1].b,3.5) +]] + +local arr5 = returnsoa() +test.eq(arr5.a[0],1) +test.eq(arr5.a[3],4) +local ptrret = retstructptr() +test.eq(ptrret[0].a,3) +test.eq(ptrret[0].b,4.5) +test.eq(structptr(ptrret),7.5) +local ptrarr = retarrptr() +test.eq(ptrarr[0][0],3) +test.eq(ptrarr[0][1],4) +test.eq(arrptr(ptrarr),7) \ No newline at end of file diff --git a/samples/Terra/luabridgefn.t b/samples/Terra/luabridgefn.t new file mode 100644 index 00000000..488e4f9e --- /dev/null +++ b/samples/Terra/luabridgefn.t @@ -0,0 +1,23 @@ + +terra plus1(a : int) + return a + int(1) +end + +terra afn() : int -> int + return plus1 +end + +terra doit(a : int, b : int -> int) + return b(a) +end + +local test = require("test") + +local foobar = afn() +test.eq(foobar(3),4) +test.eq(doit(4,foobar),5) +local function whatwhat(a) + print("I GOT A ", a) + return a + 3 +end +test.eq(doit(5,whatwhat),8) diff --git a/samples/Terra/luabridgerec.t b/samples/Terra/luabridgerec.t new file mode 100644 index 00000000..b5a5ad23 --- /dev/null +++ b/samples/Terra/luabridgerec.t @@ -0,0 +1,10 @@ + +struct A { a : &A, b : int } + +terra foo(a : A) + return a.b +end + +local test = require("test") + +test.eq(foo({b = 5}),5) diff --git a/samples/Terra/luabridgeunion.t b/samples/Terra/luabridgeunion.t new file mode 100644 index 00000000..8866866f --- /dev/null +++ b/samples/Terra/luabridgeunion.t @@ -0,0 +1,14 @@ +struct A { union {a : int, b : double}, c : int } + +terra foo(a : A) + return a.a + a.c +end +terra foo2(a : A) + return a.b + a.c +end + + +local test = require("test") + +test.eq( foo({a = 4, c = 6}), 10) +test.eq( foo2({b = 4.4, c = 6}), 10.4) \ No newline at end of file diff --git a/samples/Terra/luaterramethod.t b/samples/Terra/luaterramethod.t new file mode 100644 index 00000000..8cad2f52 --- /dev/null +++ b/samples/Terra/luaterramethod.t @@ -0,0 +1,40 @@ + + +struct Foo { + a : int; + b : int; +} + +terra Foo:bar() + self.a = self.a + 1 + return self.a + self.b +end + +Foo.methods.baz = function(self) print(self.a,self.b) end +Foo.methods.mac = macro(function() return `1 end) + +terra usemethod() + var a = Foo { 3, 4} + a:baz() + return a:bar() +end +assert(8 == usemethod()) + +obj = terralib.new(Foo[1], {{3,4}}) + +assert(8 == obj[0]:bar()) +assert(9 == obj[0]:bar()) +obj[0]:baz() + +local a,b = pcall(function() +obj[0]:mac() +end) +assert(not a) +assert(string.match(b,"not supported")) + +local a,b = pcall(function() +obj[0]:maz() +end) + +assert(not a) +assert(string.match(b,"attempt to call method")) \ No newline at end of file diff --git a/samples/Terra/lvaluepointer.t b/samples/Terra/lvaluepointer.t new file mode 100644 index 00000000..1e3855ba --- /dev/null +++ b/samples/Terra/lvaluepointer.t @@ -0,0 +1,10 @@ + + +terra foo() + var a : int = 5 + var pa = &a + @pa = 4 + @[&float](pa) = 5 +end + +foo() \ No newline at end of file diff --git a/samples/Terra/lvaluequote.t b/samples/Terra/lvaluequote.t new file mode 100644 index 00000000..56f4536e --- /dev/null +++ b/samples/Terra/lvaluequote.t @@ -0,0 +1,22 @@ + + +checkl = macro(function(a) + assert(a:islvalue()) + return a +end) + +checkr = macro(function(a) + assert(not a:islvalue()) + return a +end) + + +terra testit() + + var a = checkr(4) + var b = checkr(checkl(a) + 3) + var c = checkl([quote var d = 5 in d end]) + return a + b + c +end + +assert(4+7+5 == testit()) diff --git a/samples/Terra/lvaluetreelist.t b/samples/Terra/lvaluetreelist.t new file mode 100644 index 00000000..cfc01a57 --- /dev/null +++ b/samples/Terra/lvaluetreelist.t @@ -0,0 +1,9 @@ + + +terra foobar() + var a = 4 + @&[quote in a end] = 5 + return a +end + +assert(foobar() == 5) \ No newline at end of file diff --git a/samples/Terra/macro.t b/samples/Terra/macro.t new file mode 100644 index 00000000..3c8afcf5 --- /dev/null +++ b/samples/Terra/macro.t @@ -0,0 +1,50 @@ + +local bar = terralib.internalmacro(function(ctx,tree,typ) + return terralib.newtree(typ.tree, { kind = terralib.kinds.literal, type = double, value = 4.0 }) + +end) + +local bar2 = macro(function(typ) + return typ + +end) + + +local bar3 = macro(function(a,b) + return {a.tree,b.tree} +end) + +terra up(v : &int) + @v = @v + 1 +end + +local bar4 = macro(function() + local terra myfn() + return 42 + end + return myfn +end) + +moo = global(int,3) + +local bar4 = macro(function() + local terra myfn() + return 42 + end + return myfn +end) + +local bar5 = macro(function() + return moo +end) + +terra foo() : int + var a : int = bar(int,int16,int32) + bar2(a) = bar2(a) + 5 + bar3(up(&a),up(&a)) + bar5() = bar5() + 1 + return a + bar4()() + moo +end + +local test = require("test") +test.eq(57,foo()) diff --git a/samples/Terra/macro2.t b/samples/Terra/macro2.t new file mode 100644 index 00000000..c910bb14 --- /dev/null +++ b/samples/Terra/macro2.t @@ -0,0 +1,14 @@ + +local bar2 = macro(function(typ) + return typ + +end) + +terra foo() : int + var a = 3 + bar2(a) = bar2(a) + 5 + return a +end + +local test = require("test") +test.eq(8,foo()) diff --git a/samples/Terra/macro3.t b/samples/Terra/macro3.t new file mode 100644 index 00000000..9b1015c8 --- /dev/null +++ b/samples/Terra/macro3.t @@ -0,0 +1,14 @@ + + +foo = macro(function() + local terra bar() + return 3 + end + return bar +end) + +terra baz() + return foo()() +end + +assert(baz() == 3) \ No newline at end of file diff --git a/samples/Terra/macrokey.t b/samples/Terra/macrokey.t new file mode 100644 index 00000000..329b92aa --- /dev/null +++ b/samples/Terra/macrokey.t @@ -0,0 +1,9 @@ + +what = function() return "abcd" end + +terra foo() + var a = { [what()] = 4 } + return a.abcd +end +local test = require("test") +test.eq(foo(),4) \ No newline at end of file diff --git a/samples/Terra/macrolet.t b/samples/Terra/macrolet.t new file mode 100644 index 00000000..f6343823 --- /dev/null +++ b/samples/Terra/macrolet.t @@ -0,0 +1,17 @@ + + +twice = macro(function(a) + return quote + var v = a + in + v + v + end +end) + + +terra foobar() + var what = 1 + return twice([quote what = what + 1 in what end]) + what +end + +assert(6 == foobar()) \ No newline at end of file diff --git a/samples/Terra/macroselect.t b/samples/Terra/macroselect.t new file mode 100644 index 00000000..31c18f6c --- /dev/null +++ b/samples/Terra/macroselect.t @@ -0,0 +1,11 @@ + +struct A { a : int, b : int } + +local c = "b" +terra foo() + var a = A {1,2} + return a.[c] +end + +local test = require("test") +test.eq(foo(),2) \ No newline at end of file diff --git a/samples/Terra/macrotest.t b/samples/Terra/macrotest.t new file mode 100644 index 00000000..707e6b6e --- /dev/null +++ b/samples/Terra/macrotest.t @@ -0,0 +1,9 @@ +C = terralib.includecstring [[ +#define foo 1 +#define foo2 -3.4 +#undef foo +#define foo 3 +]] + +assert(C.foo == 3) +assert(C.foo2 == -3.4) \ No newline at end of file diff --git a/samples/Terra/malloc.t b/samples/Terra/malloc.t new file mode 100644 index 00000000..6672bfdd --- /dev/null +++ b/samples/Terra/malloc.t @@ -0,0 +1,23 @@ +local c = terralib.includecstring [[ + #include + #include +]] + +local N = 10 +terra foo() + c.printf("size = %d\n",int(sizeof(int))) + var list = [&int](c.malloc(sizeof(int)*N)) + for i = 0,N do + list[i] = i + 1 + end + var result = 0 + for i = 0,N do + c.printf("%d = %d\n",int(i),list[i]) + result = result + list[i] + end + c.free([&uint8](list)) + return result +end + +local test = require("test") +test.eq(foo(),N*(1 + N)/2) diff --git a/samples/Terra/mathlib.t b/samples/Terra/mathlib.t new file mode 100644 index 00000000..26af6cc8 --- /dev/null +++ b/samples/Terra/mathlib.t @@ -0,0 +1,9 @@ +local c = terralib.includec("math.h") + +terra mysqrt(a : float) + return c.sqrtf(a) +end + +local test = require("test") +test.eq(mysqrt(4),2) +test.eq(mysqrt(9),3) \ No newline at end of file diff --git a/samples/Terra/metatype.t b/samples/Terra/metatype.t new file mode 100644 index 00000000..bd8cdd64 --- /dev/null +++ b/samples/Terra/metatype.t @@ -0,0 +1,16 @@ +local function foo(T) + terra T:what() + return self.a + self.b + end +end +struct A(foo) { + a : int; + b : int; +} + +terra test() + var a = A {1,2} + return a:what() +end + +assert(test() == 3) \ No newline at end of file diff --git a/samples/Terra/method.t b/samples/Terra/method.t new file mode 100644 index 00000000..7e38fa45 --- /dev/null +++ b/samples/Terra/method.t @@ -0,0 +1,42 @@ +--the zero line +struct A { b : B } and +struct B {a : int, b : int} + +B.methods.foo = terra(b : B) + return b.a +end +terra bar() + var b = B { 1,2 } + return b:foo() +end + + +B.methods.foo2 = terra(b : &B) + b.a = 6 +end + +terra bar2() + var b = B { 1,2 } + b:foo2() + return b.a +end + +B.methods.foo3 = terra(b : B) + return b.a +end + +terra bar3() + var b = B { 1,2 } + return (&b):foo3() +end +terra bar4() + var b = B { 1,2 } + (&b):foo2() + return b.a +end + +test = require("test") +test.eq(bar(),1) +test.eq(bar2(),6) +test.eq(bar3(),1) +test.eq(bar4(),6) \ No newline at end of file diff --git a/samples/Terra/methodantiquote.t b/samples/Terra/methodantiquote.t new file mode 100644 index 00000000..6fbb79ad --- /dev/null +++ b/samples/Terra/methodantiquote.t @@ -0,0 +1,18 @@ +--the zero line +M = {} +struct M.B {a : int, b : int} + +terra M.B:foo(a : int) + return self.a + a +end + + +local avar = "foo" + +terra bar() + var b = M.B { 1,2 } + return b:[avar](3) +end + +test = require("test") +test.eq(bar(),4) diff --git a/samples/Terra/methodmissing.t b/samples/Terra/methodmissing.t new file mode 100644 index 00000000..b60cd5cf --- /dev/null +++ b/samples/Terra/methodmissing.t @@ -0,0 +1,17 @@ + + +struct A { + a : int +} + +A.metamethods.__methodmissing = macro(function(methodname,obj,anarg) + print(methodname) + return `anarg + [string.byte(methodname,1,1)] +end) + +terra foobar() + var a : A + return a:a(3) + a:b(4) +end + +assert(foobar() == 202) \ No newline at end of file diff --git a/samples/Terra/methodrvalue.t b/samples/Terra/methodrvalue.t new file mode 100644 index 00000000..13513b98 --- /dev/null +++ b/samples/Terra/methodrvalue.t @@ -0,0 +1,18 @@ +--the zero line +M = {} +struct M.B {a : int, b : int} + +terra M.B:foo(a : int) + return self.a + a +end + +terra rify() + var a = M.B { 1,2} + return a +end +terra bar() + return (rify()):foo(3) +end + +test = require("test") +test.eq(bar(),4) diff --git a/samples/Terra/methodsugar.t b/samples/Terra/methodsugar.t new file mode 100644 index 00000000..473f9521 --- /dev/null +++ b/samples/Terra/methodsugar.t @@ -0,0 +1,15 @@ +--the zero line +M = {} +struct M.B {a : int, b : int} + +terra M.B:foo(a : int) + return self.a + a +end + +terra bar() + var b = M.B { 1,2 } + return b:foo(3) +end + +test = require("test") +test.eq(bar(),4) diff --git a/samples/Terra/missingfields.t b/samples/Terra/missingfields.t new file mode 100644 index 00000000..acd09f2d --- /dev/null +++ b/samples/Terra/missingfields.t @@ -0,0 +1,14 @@ +test = terralib.includecstring([[ + typedef struct {} emptyanon; + typedef struct foo foobar; + void test(struct foo * f); + struct foo { int x; }; + union ufoo; + typedef union { int a; int b; } anonunion; +]]) +terra main() + var s : test.foo + s.x = 1 +end + +main() \ No newline at end of file diff --git a/samples/Terra/mixed.t b/samples/Terra/mixed.t new file mode 100644 index 00000000..267bf814 --- /dev/null +++ b/samples/Terra/mixed.t @@ -0,0 +1,13 @@ +a = terra() return 4 end +local d = {} +do + struct A{} + and local terra a() return 5 end + and terra d.d(a : B) end + and terra B:a() end + and struct B {} + and terra c() end + and struct C {} + assert(a() == 5) +end +assert(a() == 4) \ No newline at end of file diff --git a/samples/Terra/multiconstructor.t b/samples/Terra/multiconstructor.t new file mode 100644 index 00000000..b9bdd6d1 --- /dev/null +++ b/samples/Terra/multiconstructor.t @@ -0,0 +1,17 @@ + +terra foo() : {double, double} + return 1.0,3.0 +end + +struct A {c : int, a : int, b : double } + +terra bar() + var r = foo() + var a = A {1,unpackstruct(r)} + var b = A {1,2,(foo())._0} + var c = A {c = 1,a = 2,b = foo()._0} + return a.c + a.a + a.b + b.c + c.c +end + +local test = require("test") +test.eq(7,bar()) \ No newline at end of file diff --git a/samples/Terra/multimacro.t b/samples/Terra/multimacro.t new file mode 100644 index 00000000..b0d72374 --- /dev/null +++ b/samples/Terra/multimacro.t @@ -0,0 +1,17 @@ + +local bar = terralib.internalmacro(function(ctx,tree,typ,x) + return {terralib.newtree(typ.tree, { kind = terralib.kinds.literal, type = double, value = 4.0 }), x } +end) + +local x,y,z = 1,2,3 + +terra foo() : int + var a,b = bar(int,x + y + z) + var c = bar(int,0)._0 + 1 + --bar2(int) = bar2(int) + 5 + --bar3(up(&a),up(&a)) + return a + b + c +end + +local test = require("test") +test.eq(15,foo()) diff --git a/samples/Terra/multiterra.t b/samples/Terra/multiterra.t new file mode 100644 index 00000000..28a97b42 --- /dev/null +++ b/samples/Terra/multiterra.t @@ -0,0 +1,79 @@ +local ffi = require("ffi") + +C = terralib.includecstring [[ +#ifndef _WIN32 +#include +#endif +#include +typedef struct lua_State lua_State; +lua_State * luaL_newstate(); +int terra_init(lua_State * L); +int luaL_openlibs(lua_State * L); +int luaL_loadstring(lua_State * L, const char *); +int lua_close(lua_State * L); +void lua_call(lua_State * L, int,int); +int lua_pushnumber(lua_State * L, double); +int terra_loadstring(lua_State *L, const char *s); +double luaL_checknumber(lua_State * L,int); +]] + +if ffi.os == "Windows" then + -- fake it on windows + C.pthread_t = int + C.pthread_create = terra(t : &int, stuff : &opaque,fn : &opaque -> &opaque, data : &opaque) + return fn(data) + end + C.pthread_join = terra(t : int, stuff : &opaque) + end +end + + +N = 4 + +local acc = global(int[N]) + +terra forkedFn(args : &opaque) : &opaque + var threadid = @[&int](args) + C.printf("threadid %d\n",threadid) + + var L = C.luaL_newstate(); + if L == nil then + C.printf("can't initialize luajit\n") + end + + C.luaL_openlibs(L) + C.terra_init(L) + + C.terra_loadstring(L, [[ a = ...; C = terralib.includec("stdio.h"); terra foo () C.printf("new terra %d\n",a) return a end; return foo() ]]) + C.lua_pushnumber(L,threadid) + C.lua_call(L,1,1) + acc[threadid] = C.luaL_checknumber(L,-1) + C.lua_close(L) + + return nil +end + +terra foo() + var thread : C.pthread_t[N] + for i = 0,N do + acc[i] = -1 + end + + var args : int[N] + for i = 0,N do + args[i] = i + C.pthread_create(&thread[i],nil,forkedFn,&args[i]) + end + + for i = 0,N do + C.pthread_join(thread[i],nil) + end + var sum = 0 + for i = 0,N do + sum = sum + acc[i] + end + return sum +end + +print(foo()) +assert(foo() == N * (N - 1) / 2) \ No newline at end of file diff --git a/samples/Terra/names.t b/samples/Terra/names.t new file mode 100644 index 00000000..3bfd6187 --- /dev/null +++ b/samples/Terra/names.t @@ -0,0 +1,16 @@ +struct A { +} + +local B = (function() + local struct A {} + return A +end)() +C = terralib.types.newstruct("A$1") +D = terralib.types.newstruct("A$1") + +local names = {} +for i,t in ipairs {A,B,C,D} do + local n = tostring(t) + assert(not names[n]) + names[n] = true +end \ No newline at end of file diff --git a/samples/Terra/nestedcalls.t b/samples/Terra/nestedcalls.t new file mode 100644 index 00000000..d9410798 --- /dev/null +++ b/samples/Terra/nestedcalls.t @@ -0,0 +1,11 @@ + +terra foo3(a : &int) : &int + return a +end + +terra bar2(a : int) + return @(foo3(&a)) +end + +local test = require("test") +test.eq(bar2(42),42) \ No newline at end of file diff --git a/samples/Terra/nestextract.t b/samples/Terra/nestextract.t new file mode 100644 index 00000000..13a15db3 --- /dev/null +++ b/samples/Terra/nestextract.t @@ -0,0 +1,40 @@ + + +struct A { + a : int +} + +count = global(int,0) + +terra twoAs(a : int) + return A {a}, A { a } +end + +function A.metamethods.__cast(fromt,tot,exp) + if tot == A and fromt == int then + return `twoAs(exp)._0 + end + error("what") +end + +terra twoInts() + count = count + 1 + return count,2 +end + +terra takesAnA(a : A) + return a.a +end + +dotwice = macro(function(exp) + return {exp,exp} +end) + +terra doit() + return dotwice(takesAnA((twoInts()._0))) +end + + +doit:printpretty() +local test = require("test") +test.meq({1,2},doit()) diff --git a/samples/Terra/nestnoerror.t b/samples/Terra/nestnoerror.t new file mode 100644 index 00000000..c0a41500 --- /dev/null +++ b/samples/Terra/nestnoerror.t @@ -0,0 +1,17 @@ + + +terra haserror() + return (1):foo() +end + +local m = macro(function() + local success = pcall(function() haserror:compile() end) + assert(not success) + return 1 +end) + +terra noerror() + return m() +end + +assert(1 == noerror()) \ No newline at end of file diff --git a/samples/Terra/new.t b/samples/Terra/new.t new file mode 100644 index 00000000..0029c19d --- /dev/null +++ b/samples/Terra/new.t @@ -0,0 +1,14 @@ +local c = terralib.includec("stdlib.h") + +new = macro(function(typquote) + local typ = typquote:astype() + return `[&typ](c.malloc(sizeof(typ))) +end) + +local typ = int +terra doit() + var a : &int = new(int) + return a +end + +doit() \ No newline at end of file diff --git a/samples/Terra/nillocal.t b/samples/Terra/nillocal.t new file mode 100644 index 00000000..93c415c0 --- /dev/null +++ b/samples/Terra/nillocal.t @@ -0,0 +1,6 @@ + +a = 4 +local a = nil + +terra foo() return [assert(not a)] end +assert(foo() == true) \ No newline at end of file diff --git a/samples/Terra/niltype.t b/samples/Terra/niltype.t new file mode 100644 index 00000000..b8b0000d --- /dev/null +++ b/samples/Terra/niltype.t @@ -0,0 +1,9 @@ + +terra foo() + var a : &int = nil + var b = nil + return a == b +end + +local test = require("test") +test.eq(foo(),true) \ No newline at end of file diff --git a/samples/Terra/nojit.t b/samples/Terra/nojit.t new file mode 100644 index 00000000..46b66331 --- /dev/null +++ b/samples/Terra/nojit.t @@ -0,0 +1,20 @@ + + +--var a = 4 + 5 +a = global(4 + 5) +terra foo() + return a +end + + +foo:gettype() +--we currently don't track what initializers need to be run after a nojit compile +--hopefully we can just remove the need to have nojit entirely +--otherwise we need to seperate the calling of variable initializers from the compilation process +--so that they can be called when jit is invoked +a:gettype() + +local test = require("test") +test.eq(foo(),9) + + diff --git a/samples/Terra/nolengthop.t b/samples/Terra/nolengthop.t new file mode 100644 index 00000000..ceac4581 --- /dev/null +++ b/samples/Terra/nolengthop.t @@ -0,0 +1,2 @@ +local a,b = terralib.loadstring([[terra g() return #a]]) +assert(b:find("operator not supported")) \ No newline at end of file diff --git a/samples/Terra/nonprototypec.t b/samples/Terra/nonprototypec.t new file mode 100644 index 00000000..36256bb6 --- /dev/null +++ b/samples/Terra/nonprototypec.t @@ -0,0 +1,12 @@ +C = terralib.includecstring [[ + int foobar() { + return 3; + } +]] + + +terra doit() + return C.foobar() +end + +print(doit()) \ No newline at end of file diff --git a/samples/Terra/nontemporal.t b/samples/Terra/nontemporal.t new file mode 100644 index 00000000..2e634783 --- /dev/null +++ b/samples/Terra/nontemporal.t @@ -0,0 +1,7 @@ + + +terra foobar(a : &vector(float,4),b : vector(int,4)) + terralib.attrstore(a,b,{ nontemporal = true }) +end + +foobar:disas() diff --git a/samples/Terra/numliteral.t b/samples/Terra/numliteral.t new file mode 100644 index 00000000..9d5183ec --- /dev/null +++ b/samples/Terra/numliteral.t @@ -0,0 +1,14 @@ + +terra thetest() + var a,b,c,d,e = 3,3.0,3.f,3LL, 3ULL + return a,b,c,d,e +end + +local exp = { "int32", "double", "float", "int64", "uint64" } + +local test = require("test") +thetest:compile() +local typ = thetest.definitions[1]:gettype() +for i,e in ipairs(typ.returntype:getentries()) do + test.eq(tostring(e.type),exp[i]) +end \ No newline at end of file diff --git a/samples/Terra/objc.t b/samples/Terra/objc.t new file mode 100644 index 00000000..134f5a48 --- /dev/null +++ b/samples/Terra/objc.t @@ -0,0 +1,25 @@ +local f = assert(io.popen("uname", 'r')) +local s = assert(f:read('*a')) +f:close() + +if s~="Darwin\n" then + print("Warning, not running test b/c this isn't a mac") +else + +local OC = require("lib/objc") + +terra main() + OC.NSAutoreleasePool:new() + var str = OC.NSString:stringWithUTF8String("the number of hacks is overwhelming...") + var err = OC.NSError:errorWithDomain_code_userInfo(str,12,nil) + var alert = OC.NSAlert:alertWithError(err) + + var imgname = OC.NSString:stringWithUTF8String("foo.png") + var img = OC.NSImage:alloc():initByReferencingFile(imgname) + alert:setIcon(img) + alert:runModal() +end + +terralib.saveobj("objc",{main = main}, { "-framework", "Foundation", "-framework", "Cocoa" }) + +end \ No newline at end of file diff --git a/samples/Terra/objc2.t b/samples/Terra/objc2.t new file mode 100644 index 00000000..d92e1bde --- /dev/null +++ b/samples/Terra/objc2.t @@ -0,0 +1,42 @@ +local f = assert(io.popen("uname", 'r')) +local s = assert(f:read('*a')) +f:close() + +if s~="Darwin\n" then + print("Warning, not running test b/c this isn't a mac") +else + + +local OC = require("lib/objc") +local IO = terralib.includec("stdio.h") + +struct Rect { + a : double, + b : double, + c : double, + d : double +} + +terra str(data : &uint8) + return OC.NSString:stringWithUTF8String(data) +end + +terra main() + OC.NSAutoreleasePool:new() + var app = OC.NSApplication:sharedApplication() + var rec = Rect {0,0,200,200} + var window = OC.NSWindow:alloc():initWithContentRect_styleMask_backing_defer(rec,1,2,false) + window:makeKeyAndOrderFront(nil) + --[[var img = OC.NSImage:alloc():initByReferencingFile(str("objc2.jpg")) + var imgView = OC.NSImageView:alloc():initWithFrame(rec) + imgView:setImage(img) + window:setContentView(imgView) + IO.printf("entering run loop\n")--]] + app:run() +end + +terralib.saveobj("objc2", {main = main}, {"-framework","Cocoa"}) + +--os.execute("./objc2") + +end \ No newline at end of file diff --git a/samples/Terra/objtest.t b/samples/Terra/objtest.t new file mode 100644 index 00000000..f429f0fe --- /dev/null +++ b/samples/Terra/objtest.t @@ -0,0 +1,45 @@ +C = terralib.includec("stdio.h") +--the zero line +struct A { a : int } + +terra A:foo1() + self.a = self.a + 1 + return self.a +end + +terra A.methods.foo2(self : &A) + self.a = self.a + 1 + return self.a +end + +terra A.methods.foo3(self : A) + self.a = self.a + 1 + return self.a +end + +terra bar() + var a = A { 0 } + var ptra = &a + + var v0 = a.a + var v1 = a:foo1() + var v2 = a.a + var v3 = a:foo2() + var v4 = a.a + var v5 = a:foo3() + var v6 = a.a + + ptra.a = 0 + var p0 = ptra.a + var p1 = ptra:foo1() + var p2 = ptra.a + var p3 = ptra:foo2() + var p4 = ptra.a + var p5 = ptra:foo3() + var p6 = ptra.a + + return v0,v1,v2,v3,v4,v5,v6,p0,p1,p2,p3,p4,p5,p6 +end + +test = require("test") +test.meq({0,1,1,2,2,3,2,0,1,1,2,2,3,2},bar()) \ No newline at end of file diff --git a/samples/Terra/offsetcalc.t b/samples/Terra/offsetcalc.t new file mode 100644 index 00000000..ec6b0c9b --- /dev/null +++ b/samples/Terra/offsetcalc.t @@ -0,0 +1,33 @@ +local offsetinbytescache = {} +function offsetinbytes(structtype,key) + local typetable = offsetinbytescache[structtype] or {} + local value = typetable[key] + if value then + return value + end + offsetinbytescache[structtype] = typetable + + local terra offsetcalc() : int + var a : &structtype = [&structtype](0) + return [&int8](&a.[key]) - [&int8](a) + end + + local result = offsetcalc() + + typetable[key] = result + return result +end + + +struct A { a : int8, c : int8, b : int } + + +terra foo() + return 4LL +end + +local test = require("test") + +test.eq(offsetinbytes(A,"b"),4) + + diff --git a/samples/Terra/opaquealloc.t b/samples/Terra/opaquealloc.t new file mode 100644 index 00000000..91f07604 --- /dev/null +++ b/samples/Terra/opaquealloc.t @@ -0,0 +1,19 @@ + + + +local r,e = pcall(function() + local struct A { + a : opaque + } + local v = terralib.new(A) +end) + +assert(not r and e:match("Errors reported during")) + + +local r,e = pcall(function() + local v = terralib.new(opaque) +end) + + +assert(not r and e:match("attempting to use an opaque type")) \ No newline at end of file diff --git a/samples/Terra/or.t b/samples/Terra/or.t new file mode 100644 index 00000000..98a95761 --- /dev/null +++ b/samples/Terra/or.t @@ -0,0 +1,9 @@ +local test = require("test") + +terra foo(a : double, b : double, c : double) : bool + return a < b or b < c +end + +test.eq(foo(1,2,1),true) +test.eq(foo(2,1,2),true) +test.eq(foo(3,2,1),false) \ No newline at end of file diff --git a/samples/Terra/ordercomplete.t b/samples/Terra/ordercomplete.t new file mode 100644 index 00000000..eb451822 --- /dev/null +++ b/samples/Terra/ordercomplete.t @@ -0,0 +1,25 @@ + + +struct A { + a : int +} + +struct B { + a : A +} + +function A.metamethods.__staticinitialize() + print("STATIC INIT A") + local terra what(b : B) + end + what:gettype(true) +end + +function B.metamethods.__staticinitialize() + print("STATIC INIT B") +end + +terra foo(b : B) +end + +foo:compile() \ No newline at end of file diff --git a/samples/Terra/output.t b/samples/Terra/output.t new file mode 100644 index 00000000..bb2b17b8 --- /dev/null +++ b/samples/Terra/output.t @@ -0,0 +1,16 @@ +C = terralib.includec("stdio.h") +terra main() + C.printf("hello world\n") +end +local m = { main = main } +terralib.saveobj("output.o",m) +local a = terralib.saveobj(nil,"object",m) +terralib.saveobj("output2.bc",m) +local b = terralib.saveobj(nil,"bitcode",m) +terralib.saveobj("output.ll",m) +local c = terralib.saveobj(nil,"llvmir",m) +terralib.saveobj("output",m) +terralib.saveobj("output2","executable",m) + +assert(a:match("hello world")) +assert(c:match("hello world")) \ No newline at end of file diff --git a/samples/Terra/overload.t b/samples/Terra/overload.t new file mode 100644 index 00000000..57483413 --- /dev/null +++ b/samples/Terra/overload.t @@ -0,0 +1,17 @@ + +terra foo(a : int) + return 1 +end + +terra foo(a : &int8) + return 2 +end + +print(#foo.definitions) + +terra doit() + return foo(1) + foo("what") +end + +local test = require("test") +test.eq(doit(),3) \ No newline at end of file diff --git a/samples/Terra/overload2.t b/samples/Terra/overload2.t new file mode 100644 index 00000000..417d5aab --- /dev/null +++ b/samples/Terra/overload2.t @@ -0,0 +1,15 @@ + +terra foo(a : int) + return 1 +end + +terra foo(a : double) + return 2 +end + +terra doit() + return foo(2.5) +end + +local test = require("test") +test.eq(doit(),2) \ No newline at end of file diff --git a/samples/Terra/overload3.t b/samples/Terra/overload3.t new file mode 100644 index 00000000..93a516c6 --- /dev/null +++ b/samples/Terra/overload3.t @@ -0,0 +1,15 @@ + +terra foo(a : {int} ) + return 1 +end + +terra foo(a : {int,int} ) + return 2 +end + +terra doit() + return foo({1,2}) + foo({1,2}) +end + +local test = require("test") +test.eq(doit(),4) \ No newline at end of file diff --git a/samples/Terra/overloadcall.t b/samples/Terra/overloadcall.t new file mode 100644 index 00000000..343deb84 --- /dev/null +++ b/samples/Terra/overloadcall.t @@ -0,0 +1,12 @@ + + +terra foo(a : int) + return a +end + +terra foo(a : int, b : int) + return a + b +end + +local test = require("test") +test.eq(foo(1) + foo(3,4), 8) \ No newline at end of file diff --git a/samples/Terra/overloadmethod.t b/samples/Terra/overloadmethod.t new file mode 100644 index 00000000..226842b8 --- /dev/null +++ b/samples/Terra/overloadmethod.t @@ -0,0 +1,24 @@ + +struct A { a : int } +terra A:foo(a : int) + return self.a + a +end + +terra A:foo(a : &int8) + return self.a +end + + +terra doit() + var a = A { 3 } + return a:foo(1) + a:foo("what") +end +terra doit2() + var a = A { 3 } + var pa = &a + return pa:foo(1) + pa:foo("what") +end + +local test = require("test") +test.eq(doit(),7) +test.eq(doit2(),7) \ No newline at end of file diff --git a/samples/Terra/overloadmethod2.t b/samples/Terra/overloadmethod2.t new file mode 100644 index 00000000..f3c411ec --- /dev/null +++ b/samples/Terra/overloadmethod2.t @@ -0,0 +1,17 @@ + +struct A { a : int } +A.methods.foo = terra(self : A, a : int) + return self.a + a +end + +terra A:foo() + return self.a +end + + +terra doit() + var a = A { 3 } + return a:foo() + a:foo(1) +end +local test = require("test") +test.eq(doit(),7) \ No newline at end of file diff --git a/samples/Terra/overloadmethod3.t b/samples/Terra/overloadmethod3.t new file mode 100644 index 00000000..87290ade --- /dev/null +++ b/samples/Terra/overloadmethod3.t @@ -0,0 +1,18 @@ + +struct A { a : int } +A.methods.foo = terra(self : A) + return 2 +end + +terra A:foo() + return 1 +end + + +terra doit() + var a = A { 3 } + var pa = &a + return a:foo() + pa:foo() +end +local test = require("test") +test.eq(doit(),4) \ No newline at end of file diff --git a/samples/Terra/overloadproduct.t b/samples/Terra/overloadproduct.t new file mode 100644 index 00000000..85230e29 --- /dev/null +++ b/samples/Terra/overloadproduct.t @@ -0,0 +1,65 @@ + +local ans = { +{1,1,1,1}; +{2,2,2,2}; +{1,2,1,2}; +{3,3,3,3}; +{1,1,3,3}; +{0,2,3,0}; +{1,2,3,0}; +{4,4,4,4}; +{1,0,0,4}; +{2,2,4,4}; +{1,2,0,4}; +{3,4,3,4}; +{1,0,3,4}; +{0,2,3,4}; +{1,2,3,4}; +} +function create(foo,a,b,c,d) + if a then + terra foo(a : int, b : int) + return 1 + end + end + if b then + terra foo(a : int, b : double) + return 2 + end + end + if c then + terra foo(a : double, b : int) + return 3 + end + end + if d then + terra foo(a : double, b : double) + return 4 + end + end +end + +local function bitset(i,b) + return bit.band(bit.rshift(i,b),1) == 1 +end + +for i = 1,15 do + local terra foo + local a,b,c,d = bitset(i,0),bitset(i,1),bitset(i,2),bitset(i,3) + create(foo, a,b,c,d) + local function trycall(arg1,arg2) + local r = 0 + pcall(function() + local terra testit() + var a : arg1, b : arg2 = 0,0 + return foo(a,b) + end + r = testit() + end) + return r + end + local r = {trycall(int,int),trycall(int,double),trycall(double,int),trycall(double,double)} + for j,rr in ipairs(r) do + assert(rr == ans[i][j]) + end +end \ No newline at end of file diff --git a/samples/Terra/overloadrecv.t b/samples/Terra/overloadrecv.t new file mode 100644 index 00000000..a07a8bbf --- /dev/null +++ b/samples/Terra/overloadrecv.t @@ -0,0 +1,20 @@ + + +struct A { + a : int +} + +terra A:foo(a : int, b : uint8) + return 1 +end +terra A:foo(a : double, b : uint8) + return 2 +end + +terra useit() + var a = A { 3 } + var pa = &a + return a:foo(1,1) + a:foo(1.1,1) + pa:foo(1,1) + pa:foo(1.1,1) +end + +assert(6 == useit()) \ No newline at end of file diff --git a/samples/Terra/painfulrecstruct.t b/samples/Terra/painfulrecstruct.t new file mode 100644 index 00000000..1b2026b6 --- /dev/null +++ b/samples/Terra/painfulrecstruct.t @@ -0,0 +1,22 @@ + + +struct A { + a : A -> int; + b : int +} + +terra foo(a : A) + return a.b +end + +terra callit(a : A) + return a.a(a) +end + +terra bar() + var a = A { foo, 3 } + return callit(a) +end + +local test = require("test") +test.eq(bar(),3) \ No newline at end of file diff --git a/samples/Terra/paren.t b/samples/Terra/paren.t new file mode 100644 index 00000000..bcd40960 --- /dev/null +++ b/samples/Terra/paren.t @@ -0,0 +1,5 @@ +terra foo(a : int) + return a + (a) +end + +foo(3) \ No newline at end of file diff --git a/samples/Terra/parsecrash.t b/samples/Terra/parsecrash.t new file mode 100644 index 00000000..1ce8c06d --- /dev/null +++ b/samples/Terra/parsecrash.t @@ -0,0 +1,7 @@ +local result,err = terralib.loadstring [[ +terra result() + [startXNeeded] = a + strip*L.stripWidth + [endXNeeded] = 1 +end +]] +assert(result ~= nil) \ No newline at end of file diff --git a/samples/Terra/parsefail.t b/samples/Terra/parsefail.t new file mode 100644 index 00000000..491ce0f2 --- /dev/null +++ b/samples/Terra/parsefail.t @@ -0,0 +1,35 @@ + +local self = 1 +local Rt = 1 +local i = 1 +local j = 1 +terra bar() +var a = Rt.MatrixDouble{[&double](self.ptr) , i,j} +end + +local r,e = terralib.loadstring[[ + + terra foo() + var a = { [&double](4) = 3 } + end +]] + +assert(r == nil and e:match("unexpected symbol near '='")) + +terra foo() + var a = { [""] = 3 } +end + +local s = symbol() + +local function getsym() + return s +end +terra foo2() + var [getsym()] = 3 + var a = { [getsym()] = 4, _1 = [getsym()] } + return a.[getsym()] + a._1 +end + +assert(7 == foo2()) + diff --git a/samples/Terra/parsefail2.t b/samples/Terra/parsefail2.t new file mode 100644 index 00000000..74119074 --- /dev/null +++ b/samples/Terra/parsefail2.t @@ -0,0 +1,5 @@ +terra foo() + var a : int[4] @&a[0] = 3 + return a[0] +end +assert(3 == foo()) \ No newline at end of file diff --git a/samples/Terra/pattern.t b/samples/Terra/pattern.t new file mode 100644 index 00000000..dfb23037 --- /dev/null +++ b/samples/Terra/pattern.t @@ -0,0 +1,43 @@ + +terra foobar() + return 1,2 +end + +terra what() + var _,a,b = 1,foobar() + a,b = foobar() + return a + b +end +terra what2() + var a = foobar() + var b,c = unpackstruct(a) + return b+c +end + +assert(what() == 3) +assert(what2() == 3) + + +struct A { + a : int + b : int +} + +terra what3() : A + var a = A {1,2} + return unpacktuple(a) +end +assert(what3().b == 2) + +terra what4() + var a = A {1,2} + var c,d = unpackstruct(a) + return c+d +end +assert(what4() == 3) + +local terra ra() return A {1,2} end +local a,b = unpackstruct(foobar()) +assert(a == 1 and b == 2) +assert(unpacktuple(ra()).a == 1) +assert(unpackstruct(ra()) == 1) \ No newline at end of file diff --git a/samples/Terra/point.t b/samples/Terra/point.t new file mode 100644 index 00000000..088e3702 --- /dev/null +++ b/samples/Terra/point.t @@ -0,0 +1,13 @@ + +terra bar(a : &int) + @a = @a + 1 +end +terra foo(a : int) : int + var b : int + b = a + bar(&b) + return b +end + +local test = require("test") +test.eq(foo(4),5) \ No newline at end of file diff --git a/samples/Terra/pointerarith.t b/samples/Terra/pointerarith.t new file mode 100644 index 00000000..d59c9b59 --- /dev/null +++ b/samples/Terra/pointerarith.t @@ -0,0 +1,31 @@ +terra foo(a : &int) : ptrdiff + var b : &int b = a + 10 + return b-a +end + +terra bar() + var b:int = 10; + return foo(&b) +end + +terra foo2(a : &int) : &int + a = a + 6 + a = 3 + a + a = a + 10 + return a +end + +terra foo3(a : &int) : &int + a = a - 11 + a = 2 + a + a = a - 10 + return a +end + +terra bar2(a : int) + return @(foo3(foo2(&a))) +end + +local test = require("test") +test.eq(bar(),10) +test.eq(bar2(42),42) diff --git a/samples/Terra/pointerlike.t b/samples/Terra/pointerlike.t new file mode 100644 index 00000000..2d3d8542 --- /dev/null +++ b/samples/Terra/pointerlike.t @@ -0,0 +1,7 @@ + +terra foo() + var a : int[4] + var b : &int = a + return a + 1, a - a, b - a, a - b, 1 + a +end +foo() \ No newline at end of file diff --git a/samples/Terra/pow.t b/samples/Terra/pow.t new file mode 100644 index 00000000..701c8247 --- /dev/null +++ b/samples/Terra/pow.t @@ -0,0 +1,28 @@ +local N = 4 -- N is a Lua variable +terra powN(a : double) + var r = 1 + for i = 0, N do + r = r * a + end + return r +end + + + + +local math = {} +for N = 1,10 do + math["pow"..tostring(N)] = terra(a : double) + var r = 1 + for i = 0, N do + r = r * a + end + return r + end +end + +local test = require("test") +test.eq(powN(3),81) +test.eq(math.pow1(2),2) +test.eq(math.pow2(2),4) +test.eq(math.pow3(2),8) \ No newline at end of file diff --git a/samples/Terra/ppltalk.t b/samples/Terra/ppltalk.t new file mode 100644 index 00000000..d9e29868 --- /dev/null +++ b/samples/Terra/ppltalk.t @@ -0,0 +1,18 @@ + +--this is a comment. +--top level is Lua code: +function min(a,b) + if a < b then return a + else return b end +end + +print(min(3,4)) --3 + +terra mint(a : int, b : int) : int +if a < b then return a +else return b end +end + +print(mint(3,4)) --3 + +mint:disas() \ No newline at end of file diff --git a/samples/Terra/ppnil.t b/samples/Terra/ppnil.t new file mode 100644 index 00000000..93e6e561 --- /dev/null +++ b/samples/Terra/ppnil.t @@ -0,0 +1,4 @@ +terra foo() + return nil +end +foo:printpretty() \ No newline at end of file diff --git a/samples/Terra/pratttest1.t b/samples/Terra/pratttest1.t new file mode 100755 index 00000000..95b9f739 --- /dev/null +++ b/samples/Terra/pratttest1.t @@ -0,0 +1,4 @@ +import "lib/pratttest" +local a = goexp 1 + 3 * 4 ^ 5 ^ 6/(2 - 4 + -a) + -b(c) + +terralib.tree.printraw(a) diff --git a/samples/Terra/prec.t b/samples/Terra/prec.t new file mode 100644 index 00000000..b6afe988 --- /dev/null +++ b/samples/Terra/prec.t @@ -0,0 +1,4 @@ +local a = &double -> double +assert(a:ispointer()) +assert(a.type:isfunction()) +assert(a.type.parameters[1]:ispointer()) \ No newline at end of file diff --git a/samples/Terra/prec2.t b/samples/Terra/prec2.t new file mode 100644 index 00000000..99a8974b --- /dev/null +++ b/samples/Terra/prec2.t @@ -0,0 +1,2 @@ +terra foo(a : float, b : float, c : float, d : float) return a * (b - c) end +foo:printpretty() \ No newline at end of file diff --git a/samples/Terra/pretty.t b/samples/Terra/pretty.t new file mode 100644 index 00000000..3953c97a --- /dev/null +++ b/samples/Terra/pretty.t @@ -0,0 +1,69 @@ + + +terra bar(a : int) + return 4,5 +end +terra takebar(a : double, b : int) + return 1 +end +terra baz() +end +function whatwhat() +end +struct A { data : int } +terra A:moo() end +Aptr = terralib.new(A) +terra foo() + var aa : A + + baz() + whatwhat() + do + end + ::what:: + goto what + while 4 < 3 do + break + terralib.attrload(&aa,{}) + var d = terralib.attrstore(&aa,aa,{}) + return 3,4,4,bar(aa.data) + end + var a = 0.0 + if a < 3 then + a = -(a + 1) + end + + if a < 3 then + a = -a + 1 + elseif a > 4 then + a = a - 1 + end + repeat + a = a + 1 + until a > 55 + var b,c = 4,5 + a,b = 5,c + var d = array(1,2,3) + b = (&a)[1] + var e : int = a + var g = terralib.select(true,0,1) + var ee = sizeof(int) + var more = { a = 5, c = 4, _2 = 3} + baz() + var bbb = bar(1) + var bb = takebar(bbb._0,bbb._1) + var vv = vector(3,4) + var vvv = Aptr + var vvvv = Aptr:moo() + return 3,4,ee,bar(1) +end + +foo:compile() +foo:printpretty(false) --before compilation +foo:printpretty() --after compilation + +local a = `1 + 2 +local b = quote var c = a + a in a + 1 end + +a:printpretty() +b:printpretty() \ No newline at end of file diff --git a/samples/Terra/printd.t b/samples/Terra/printd.t new file mode 100644 index 00000000..d9a9f85d --- /dev/null +++ b/samples/Terra/printd.t @@ -0,0 +1,5 @@ +a = .4 + +terra foo() return a end + +foo:printpretty(false) \ No newline at end of file diff --git a/samples/Terra/printfarray.t b/samples/Terra/printfarray.t new file mode 100644 index 00000000..98c21bef --- /dev/null +++ b/samples/Terra/printfarray.t @@ -0,0 +1,12 @@ + + +C = terralib.includec("stdio.h") + +terra char(a : &int8) : int8 + return a[0] +end +terra foobar() + var a = arrayof(int8,char("a"),0) + C.printf("%s\n",a) +end +foobar() \ No newline at end of file diff --git a/samples/Terra/printfloat.t b/samples/Terra/printfloat.t new file mode 100644 index 00000000..37927f54 --- /dev/null +++ b/samples/Terra/printfloat.t @@ -0,0 +1,7 @@ +local IO = terralib.includec("stdio.h") + +terra foobar() + IO.printf("%f\n",3.3f) +end + +foobar() \ No newline at end of file diff --git a/samples/Terra/proxystruct.t b/samples/Terra/proxystruct.t new file mode 100644 index 00000000..bde53457 --- /dev/null +++ b/samples/Terra/proxystruct.t @@ -0,0 +1,19 @@ +local c = terralib.includecstring [[ + #include + #include +]] + + +struct Node { + next : &Node; + v : int; +} + +terra foo() + var cur : &Node = [&Node](c.malloc(sizeof(Node))) + cur.v = 3 + return cur.v +end + +local test = require("test") +test.eq(foo(),3) diff --git a/samples/Terra/pt.t b/samples/Terra/pt.t new file mode 100644 index 00000000..6212d290 --- /dev/null +++ b/samples/Terra/pt.t @@ -0,0 +1,18 @@ + + +local a = global(double) + +terra getptr() + return &a +end + +local b = getptr() +local c = terralib.pointertolightuserdata(b) +print(b,c,a) + +terra foo(a : &&int) + +end + +foo(c) +print("DONE") \ No newline at end of file diff --git a/samples/Terra/pthreads.t b/samples/Terra/pthreads.t new file mode 100644 index 00000000..b903dcdb --- /dev/null +++ b/samples/Terra/pthreads.t @@ -0,0 +1,47 @@ +local ffi = require("ffi") +if ffi.os == "Windows" then + return +end + +C = terralib.includecstring [[ +#include +#include +]] + +acc = global(int[4]) + +terra forkedFn(args : &opaque) : &opaque + var threadid = @[&int](args) + C.printf("threadid %d\n",threadid) + acc[threadid] = threadid + return nil +end + +terra foo() + var thread0 : C.pthread_t + var thread1 : C.pthread_t + var thread2 : C.pthread_t + var thread3 : C.pthread_t + + acc[0]=-42 + acc[1]=-42 + acc[2]=-42 + acc[3]=-42 + + var args = arrayof(int,0,1,2,3) + + C.pthread_create(&thread0,nil,forkedFn,&args[0]) + C.pthread_create(&thread1,nil,forkedFn,&args[1]) + C.pthread_create(&thread2,nil,forkedFn,&args[2]) + C.pthread_create(&thread3,nil,forkedFn,&args[3]) + + C.pthread_join(thread0,nil) + C.pthread_join(thread1,nil) + C.pthread_join(thread2,nil) + C.pthread_join(thread3,nil) + + return acc[0]+acc[1]+acc[2]+acc[3] +end + +local test = require("test") +test.eq(foo(),0+1+2+3) \ No newline at end of file diff --git a/samples/Terra/quote.t b/samples/Terra/quote.t new file mode 100644 index 00000000..6110380e --- /dev/null +++ b/samples/Terra/quote.t @@ -0,0 +1,10 @@ + +local c = `10 +local a = `4 + c +terra doit() + var c = 3 + return a + a +end + +local test = require("test") +test.eq(doit(),28) \ No newline at end of file diff --git a/samples/Terra/quote10.t b/samples/Terra/quote10.t new file mode 100644 index 00000000..f32e9e22 --- /dev/null +++ b/samples/Terra/quote10.t @@ -0,0 +1,13 @@ + +terra foo() + return 1,2 +end + +local q = `foo() + +terra bar() + return q +end + +local test = require("test") +test.meq({1,2},bar()) \ No newline at end of file diff --git a/samples/Terra/quote2.t b/samples/Terra/quote2.t new file mode 100644 index 00000000..378510a3 --- /dev/null +++ b/samples/Terra/quote2.t @@ -0,0 +1,9 @@ + +local c = `10 +local a = `4 + c +terra doit() + return a +end + +local test = require("test") +test.eq(doit(),14) \ No newline at end of file diff --git a/samples/Terra/quote3.t b/samples/Terra/quote3.t new file mode 100644 index 00000000..9f24b51f --- /dev/null +++ b/samples/Terra/quote3.t @@ -0,0 +1,13 @@ +c = global(0) +terra count() + c = c + 1 + return c +end +foo = macro(function(a,b) return `a + a + a + b + count() end) +terra doit() + var a = -100 + return foo(count(),4) +end + +local test = require("test") +test.eq(doit(),14) \ No newline at end of file diff --git a/samples/Terra/quote4.t b/samples/Terra/quote4.t new file mode 100644 index 00000000..29f5150f --- /dev/null +++ b/samples/Terra/quote4.t @@ -0,0 +1,9 @@ + +local str2 = `{a = 4} +local str = `str2 +terra doit() + return str.a +end + +local test = require("test") +test.eq(doit(),4) \ No newline at end of file diff --git a/samples/Terra/quote5.t b/samples/Terra/quote5.t new file mode 100644 index 00000000..23539bc4 --- /dev/null +++ b/samples/Terra/quote5.t @@ -0,0 +1,20 @@ + +c = global(0) +terra foo(a : int) + c = c + a +end + +local stmts = quote + foo(5) + foo(6) + foo(7) +end + +local stmts2 = {stmts,stmts} +terra doit() + stmts + stmts2 + return c +end +local test = require("test") +test.eq(doit(),54) \ No newline at end of file diff --git a/samples/Terra/quote6.t b/samples/Terra/quote6.t new file mode 100644 index 00000000..59a2b83f --- /dev/null +++ b/samples/Terra/quote6.t @@ -0,0 +1,12 @@ +function mymacro() + return {`4,`5} +end +mymacro = macro(mymacro) + +local exps = {`2,`3, `mymacro()} + +terra doit() + return exps +end +local test = require("test") +test.meq({2,3,4,5},doit()) \ No newline at end of file diff --git a/samples/Terra/quote7.t b/samples/Terra/quote7.t new file mode 100644 index 00000000..cbd4cb3b --- /dev/null +++ b/samples/Terra/quote7.t @@ -0,0 +1,23 @@ +a = {} + +local c = terralib.includec("stdio.h") + + +a.c = quote + c.printf("hello\n") +end + +a.b = quote + var d = 4 + a.c + return d +end + + +terra foo() + a.c + a.b +end + +local test = require("test") +test.eq(foo(),4) \ No newline at end of file diff --git a/samples/Terra/quote8.t b/samples/Terra/quote8.t new file mode 100644 index 00000000..afec0869 --- /dev/null +++ b/samples/Terra/quote8.t @@ -0,0 +1,19 @@ +a = {} + +local c = terralib.includec("stdio.h") + + +a.c = {`1,`2,`3} + +a.b = quote + return a.c,a.c +end + + +terra foo() + a.b +end + + +local test = require("test") +test.meq({1,2,3,1,2,3},foo()) diff --git a/samples/Terra/quote9.t b/samples/Terra/quote9.t new file mode 100644 index 00000000..834a4afd --- /dev/null +++ b/samples/Terra/quote9.t @@ -0,0 +1,19 @@ +a = {} + +local c = terralib.includec("stdio.h") + + +a.c = {`1,`2,`3} + +a.b = quote + return a.c._0,(a.c)._0 +end + + +terra foo() + a.b +end + + +local test = require("test") +test.meq({1,1}, foo()) \ No newline at end of file diff --git a/samples/Terra/quoteblock.t b/samples/Terra/quoteblock.t new file mode 100644 index 00000000..3833dbbf --- /dev/null +++ b/samples/Terra/quoteblock.t @@ -0,0 +1,12 @@ + +local a = symbol() +local myquote = quote + var [a] = 3 +end + +terra bar() + [myquote]; + return [a] +end + +print(bar()) \ No newline at end of file diff --git a/samples/Terra/quoteenv.t b/samples/Terra/quoteenv.t new file mode 100644 index 00000000..607631a1 --- /dev/null +++ b/samples/Terra/quoteenv.t @@ -0,0 +1,25 @@ +--quotes, unlike functions bind symbols eagerly +--function have :compile() to bind their symbols, but no similar thing exists +--for quotes, making it hard to control +--furthermore there aren't many use cases for late-binding quotes, +--but a bunch exist for needing early-bound quotes, like below: + + +function times5(x) + local c = `0 + for i = 1,5 do + c = `c + x + end + return c +end +times5 = macro(times5) + +terra foo() + var a = 3 + return times5(a) +end + +foo:printpretty() +foo:disas() +local test = require("test") +test.eq(foo(),15) diff --git a/samples/Terra/quoteselect.t b/samples/Terra/quoteselect.t new file mode 100644 index 00000000..46864e34 --- /dev/null +++ b/samples/Terra/quoteselect.t @@ -0,0 +1,12 @@ + +local a = {} + +local c = terralib.includec("stdio.h") + +b = `c.printf("hello\n") + +terra foo() + return b +end + +foo() \ No newline at end of file diff --git a/samples/Terra/rd.t b/samples/Terra/rd.t new file mode 100644 index 00000000..c80487fc --- /dev/null +++ b/samples/Terra/rd.t @@ -0,0 +1 @@ +C = terralib.includec("stdarg.h") \ No newline at end of file diff --git a/samples/Terra/receivercasts.t b/samples/Terra/receivercasts.t new file mode 100644 index 00000000..384c7bce --- /dev/null +++ b/samples/Terra/receivercasts.t @@ -0,0 +1,22 @@ + +struct A { a : int } + +terra A.methods.foo(a : int) + return a + 1 +end + +function A.metamethods.__cast(from,to,exp) + if from == A and to == int then + return `exp.a + end + error("what") +end + + + +terra testit() + var a = A { 5 } + return a:foo() +end + +assert(6 == testit()) \ No newline at end of file diff --git a/samples/Terra/recfn.t b/samples/Terra/recfn.t new file mode 100644 index 00000000..3a0d757f --- /dev/null +++ b/samples/Terra/recfn.t @@ -0,0 +1,10 @@ +local terra foo() : {} + bar() +end and +local terra bar() : {} + foo() +end + +bar = nil + +foo:printpretty() \ No newline at end of file diff --git a/samples/Terra/recoverfromerror.t b/samples/Terra/recoverfromerror.t new file mode 100644 index 00000000..92ef01a5 --- /dev/null +++ b/samples/Terra/recoverfromerror.t @@ -0,0 +1,15 @@ + + +terra what() + return " " / 1 +end + +dostuff = macro(function() + pcall(what.compile,what) + return 4 +end) + +terra foobar() + return dostuff() +end +assert(4 == foobar()) \ No newline at end of file diff --git a/samples/Terra/recstruct.t b/samples/Terra/recstruct.t new file mode 100644 index 00000000..dff75679 --- /dev/null +++ b/samples/Terra/recstruct.t @@ -0,0 +1,33 @@ +local c = terralib.includecstring [[ + #include + #include +]] + + +struct Node { + next : &Node; + v : int; +} + +local N = 10 +terra foo() + var cur : &Node = nil + for i = 0, N do + var n = [&Node](c.malloc(sizeof(Node))) + n.v = i + n.next = cur + cur = n + end + var sum = 0 + while cur ~= nil do + c.printf("%d\n",cur.v) + sum = sum + cur.v + var old = cur + cur = cur.next + c.free(old) + end + return sum +end + +local test = require("test") +test.eq(foo(),N * (N - 1) / 2) \ No newline at end of file diff --git a/samples/Terra/recstruct2.t b/samples/Terra/recstruct2.t new file mode 100644 index 00000000..0c92d4d8 --- /dev/null +++ b/samples/Terra/recstruct2.t @@ -0,0 +1,17 @@ + + +local struct A { b : &B } + and struct B { a : &A } + +struct C { a : &A, b : &B, c : &C } + +local struct D {} + +terra foo() + var a : A, b : B, c : C + a.b = &b + b.a = &a + c.c = &c +end + +foo() \ No newline at end of file diff --git a/samples/Terra/rename.t b/samples/Terra/rename.t new file mode 100644 index 00000000..323c09d7 --- /dev/null +++ b/samples/Terra/rename.t @@ -0,0 +1,8 @@ +terralib.includecstring [[ + int foo() { return 3; } +]] + +terra what() return 4 end + + +terralib.saveobj("foo.o",{foo = what}) \ No newline at end of file diff --git a/samples/Terra/renaming.t b/samples/Terra/renaming.t new file mode 100644 index 00000000..c0674d6f --- /dev/null +++ b/samples/Terra/renaming.t @@ -0,0 +1,21 @@ + +C = terralib.includec("stdio.h") +terra main() + C.printf("what\n") +end +main:setinlined(false) + +terra realmain() + main() +end + +terra foo() +end +and terra foo(a : int) +end + +foo:compile() + +terralib.saveobj("renamed",{ main = realmain }) + +terralib.dumpmodule() \ No newline at end of file diff --git a/samples/Terra/requiretwice.t b/samples/Terra/requiretwice.t new file mode 100644 index 00000000..4999edc6 --- /dev/null +++ b/samples/Terra/requiretwice.t @@ -0,0 +1,3 @@ +A = require("lib.golike") +B = require("lib.golike") +assert(A == B) \ No newline at end of file diff --git a/samples/Terra/rvaluerecv.t b/samples/Terra/rvaluerecv.t new file mode 100644 index 00000000..5ccad573 --- /dev/null +++ b/samples/Terra/rvaluerecv.t @@ -0,0 +1,30 @@ +struct A { a : int } + +terra A:foo() + self.a = self.a + 1 + return self.a +end + +terra A.methods.foo2(self : A) + self.a = self.a + 1 + return self.a +end + + +mya = global(A) +mya:set({0}) + +terra geta() + return mya +end + +terra bar() + var v0 = mya.a + var v1 = geta():foo() + var v2 = mya.a + var v3 = geta():foo2() + var v4 = mya.a + return v0,v1,v2,v3,v4 +end +test = require("test") +test.meq({0,1,0,1,0},bar()) \ No newline at end of file diff --git a/samples/Terra/scope.t b/samples/Terra/scope.t new file mode 100644 index 00000000..866d7e26 --- /dev/null +++ b/samples/Terra/scope.t @@ -0,0 +1,13 @@ +terra scope() + var a = 4 + var b = 0 + b = b + a + do + var a = 5 + b = b + a + end + b = b + a + return b +end +local test = require('test') +test.eq(scope(),13) \ No newline at end of file diff --git a/samples/Terra/selectoverload.t b/samples/Terra/selectoverload.t new file mode 100644 index 00000000..b4b33d96 --- /dev/null +++ b/samples/Terra/selectoverload.t @@ -0,0 +1,25 @@ +struct Vec { data : float[3] } + + +local get = {} +get.x = terra(self : &Vec) + return self.data[0] +end +get.y = macro(function(self) + return `self.data[1] +end) + +Vec.metamethods.__entrymissing = macro(function(name,self) + return `[get[name]](&self) +end) + +terra bar() + var a = Vec { array(1.f,2.f,3.f) } + a.y = a.y + 1 + var pa = &a + return a.x + a.y + pa.x +end + +local test = require("test") +test.eq(bar(),5) + diff --git a/samples/Terra/setname.t b/samples/Terra/setname.t new file mode 100644 index 00000000..06c15855 --- /dev/null +++ b/samples/Terra/setname.t @@ -0,0 +1,7 @@ + +two = terra() + return 1 + 1 +end +two:setname("two") + +two:disas() \ No newline at end of file diff --git a/samples/Terra/setter.t b/samples/Terra/setter.t new file mode 100644 index 00000000..abd55acc --- /dev/null +++ b/samples/Terra/setter.t @@ -0,0 +1,39 @@ + +struct A { +a : int; +b : int; +} + +terra A.metamethods.__update(self : &A, a : int, b : int) + self.a = a + self.b = b +end +terra A.metamethods.__apply(self : &A, a : int) + return a + self.b +end + +struct B { + a : int +} + + +B.metamethods.__update = macro(function(me,arg,arg2,rhs) + return quote me.a = arg + arg2 + rhs end +end) + +B.metamethods.__setentry = macro(function(field,self,rhs) + field = field:sub(2) + return quote self.[field] = self.[field] + rhs end +end) + +terra foo() + var a : A + a(4) = 5 + var b : B + b(3,4) = 5 + b._a = 1 + return a.a + a.b + a(3) + b.a +end + +--foo:printpretty() +assert(foo() == 9+8+3+4+5+1) diff --git a/samples/Terra/sgemm-old.t b/samples/Terra/sgemm-old.t new file mode 100644 index 00000000..36d58007 --- /dev/null +++ b/samples/Terra/sgemm-old.t @@ -0,0 +1,205 @@ + +local IO = terralib.includec("stdio.h") +local stdlib = terralib.includec("stdlib.h") + + + +local NB = 64 +local V = 8 + +terra vecload(data : &float, idx : int) + var addr = &data[idx] + return @[&vector(float,V)](addr) +end + +haddavx = terralib.intrinsic("llvm.x86.avx.hadd.ps.256", { vector(float,8), vector(float,8) } -> vector(float,8)) +terra hadd(v : vector(float,8)) + var v1 = haddavx(v,v) + var v2 = haddavx(v1,v1) + return v2[0] + v2[4] +end + + +local AR = 2 +local BR = 2 +local KR = 2 +local NK = 64 + +local BLOCKB = true +local BLOCKA = true + +local function isinteger(x) return math.floor(x) == x end + +assert(isinteger(NK / (KR * V))) +assert(isinteger(NB / AR )) +assert(isinteger(NB / BR )) + + + +blockregisters = macro(function(C,A,B,K,lda,ldc,mm,nn,kk,m,n) + local function mkmatrix(nm,I,J) + local r = {} + for i = 0,I-1 do + r[i] = {} + for j = 0,J-1 do + r[i][j] = symbol(nm..tostring(i)..tostring(j)) + end + end + return r + end + local as,bs,cs = mkmatrix("a",AR,KR),mkmatrix("b",BR,KR),mkmatrix("c",AR,BR) + local stmts = terralib.newlist() + for i = 0, AR-1 do + for j = 0, BR-1 do + stmts:insert(quote var [cs[i][j]] : vector(float,V) = 0.f end) + end + end + + local k = symbol("k") + local kloopbody = terralib.newlist() + + local alreadyloaded = {} + local function get(vs,i,j,loadfn) + if not alreadyloaded[vs[i][j]] then + alreadyloaded[vs[i][j]] = true + kloopbody:insert(loadfn(vs[i][j])) + end + return vs[i][j] + end + + local function getA(i,j) + return get(as,i,j,function(sym) + local result + if BLOCKA then + result = quote + var [sym] = vecload(A, mm * K + NB*(kk + m - mm + i) + k - kk + j *V) + end + else + result = quote + var [sym] = vecload(A, (m + i) * lda + k + j * V) + end + end + return result + end) + end + + local function getB(i,j) + return get(bs,i,j,function(sym) + local result + if BLOCKB then + result = quote + var [sym] = vecload(B, nn * K + NB*(kk + n - nn + i) + k - kk + j * V) + end + else + result = quote + var [sym] = vecload(B, (n + i) * K + k + j * V) + end + end + return result + end) + end + + for l = 0, KR-1 do + for i = 0, AR-1 do + for j = 0, BR-1 do + local aa = getA(i,l) + local bb = getB(j,l) + kloopbody:insert(quote + [cs[i][j]] = [cs[i][j]] + aa * bb + end) + end + end + end + + stmts:insert(quote + for [k] = kk, kk + NK, V*KR do + kloopbody + end + end) + + for i = 0, AR-1 do + for j = 0, BR-1 do + local function getsum(b,e) + if b + 1 == e then + return `[cs[i][j]][b] + else + local mid = (e + b)/2 + assert(math.floor(mid) == mid) + local lhs = getsum(b,mid) + local rhs = getsum(mid,e) + return `lhs + rhs + end + end + local sum + if V == 8 and false then + sum = `hadd([cs[i][j]]) + else + sum = getsum(0,V) + end + stmts:insert(quote + var r = sum + if kk == 0 then + C[(m + i)*ldc + (n + j)] = r + else + C[(m + i)*ldc + (n + j)] = C[(m + i)*ldc + (n + j)] + r + end + end) + end + end + + return stmts +end) + +terra my_sgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : float, A : &float, lda : int, B : &float, ldb : int, + beta : float, C : &float, ldc : int) + + var TB = [&float](stdlib.malloc(K * N * sizeof(float))) + var TA = A + for kk = 0,K,NK do + for nn = 0,N,NB do + for k = kk,kk+NK do + for n = nn,nn+NB do + if BLOCKB then + TB[nn * K + NB*(kk + n - nn) + k - kk] = B[k*ldb + n] + else + TB[n*K + k] = B[k*ldb + n] + end + end + end + end + end + + if BLOCKA then + TA = [&float](stdlib.malloc(M * K * sizeof(float))) + for mm = 0,M,NB do + for kk = 0,K,NK do + for m = mm,mm+NB do + for k = kk,kk+NK do + TA[mm * K + NB*(kk + m - mm) + k - kk] = A[m*lda + k] + end + end + end + end + end + + for mm = 0,M,NB do + for nn = 0, N,NB do + for kk = 0, K, NK do + for m = mm,mm+NB,AR do + for n = nn,nn+NB,BR do + blockregisters(C,TA,TB,K,lda,ldc,mm,nn,kk,m,n) + end + end + end + end + end + stdlib.free(TB) + if BLOCKA then + stdlib.free(TA) + end +end + +my_sgemm:compile() +my_sgemm:printpretty() + +terralib.saveobj("my_sgemm.o", {my_sgemm = my_sgemm}) \ No newline at end of file diff --git a/samples/Terra/sgemm.t b/samples/Terra/sgemm.t new file mode 100644 index 00000000..c5121daa --- /dev/null +++ b/samples/Terra/sgemm.t @@ -0,0 +1,162 @@ + +local IO = terralib.includec("stdio.h") +local stdlib = terralib.includec("stdlib.h") + + + +local NB = 72 +local V = 8 + +terra vecload(data : &float, idx : int) + var addr = &data[idx] + return @[&vector(float,V)](addr) +end + +haddavx = terralib.intrinsic("llvm.x86.avx.hadd.ps.256", { vector(float,8), vector(float,8) } -> vector(float,8)) +terra hadd(v : vector(float,8)) + var v1 = haddavx(v,v) + var v2 = haddavx(v1,v1) + return v2[0] + v2[4] +end + + +local AR = 2 +local BR = 4 +local KR = 1 +local NK = 72 + + +local function isinteger(x) return math.floor(x) == x end + +assert(isinteger(NK / (KR * V))) +assert(isinteger(NB / AR )) +assert(isinteger(NB / BR )) + + + +blockregisters = macro(function(C,A,B,K,lda,ldc,m,n,kk) + local function mkmatrix(nm,I,J) + local r = {} + for i = 0,I-1 do + r[i] = {} + for j = 0,J-1 do + r[i][j] = symbol(nm..tostring(i)..tostring(j)) + end + end + return r + end + local as,bs,cs = mkmatrix("a",AR,KR),mkmatrix("b",BR,KR),mkmatrix("c",AR,BR) + local stmts = terralib.newlist() + for i = 0, AR-1 do + for j = 0, BR-1 do + stmts:insert(quote var [cs[i][j]] : vector(float,V) = 0.f end) + end + end + + local k = symbol("k") + local kloopbody = terralib.newlist() + + local alreadyloaded = {} + local function get(vs,i,j,loadfn) + if not alreadyloaded[vs[i][j]] then + alreadyloaded[vs[i][j]] = true + kloopbody:insert(loadfn(vs[i][j])) + end + return vs[i][j] + end + + local function getA(i,j) + return get(as,i,j,function(sym) + return quote + var [sym] = vecload(A, (m + i) * lda + k + j * V) + end + end) + end + + local function getB(i,j) + return get(bs,i,j,function(sym) + return quote + var [sym] = vecload(B, (n + i) * K + k + j * V) + end + end) + end + + for l = 0, KR-1 do + for i = 0, AR-1 do + for j = 0, BR-1 do + local aa = getA(i,l) + local bb = getB(j,l) + kloopbody:insert(quote + [cs[i][j]] = [cs[i][j]] + aa * bb + end) + end + end + end + + stmts:insert(quote + for [k] = kk, kk + NK, V*KR do + kloopbody + end + end) + + for i = 0, AR-1 do + for j = 0, BR-1 do + local function getsum(b,e) + if b + 1 == e then + return `[cs[i][j]][b] + else + local mid = (e + b)/2 + assert(math.floor(mid) == mid) + local lhs = getsum(b,mid) + local rhs = getsum(mid,e) + return `lhs + rhs + end + end + local sum + if V == 8 and terralib.llvmversion ~= 31 then + sum = `hadd([cs[i][j]]) + else + sum = getsum(0,V) + end + stmts:insert(quote + var r = sum + if kk == 0 then + C[(m + i)*ldc + (n + j)] = r + else + C[(m + i)*ldc + (n + j)] = C[(m + i)*ldc + (n + j)] + r + end + end) + end + end + + return stmts +end) + +terra my_sgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : float, A : &float, lda : int, B : &float, ldb : int, + beta : float, C : &float, ldc : int) + + var TB = [&float](stdlib.malloc(K * N * sizeof(float))) + for k = 0,K do + for n = 0,N do + TB[n*K + k] = B[k*ldb + n] + end + end + + for mm = 0,M,NB do + for nn = 0, N,NB do + for kk = 0, K, NK do + for m = mm,mm+NB,AR do + for n = nn,nn+NB,BR do + blockregisters(C,A,TB,K,lda,ldc,m,n,kk) + end + end + end + end + end + stdlib.free(TB) +end + +my_sgemm:compile() +my_sgemm:printpretty() + +terralib.saveobj("my_sgemm.o", {my_sgemm = my_sgemm}) diff --git a/samples/Terra/sgemm3.t b/samples/Terra/sgemm3.t new file mode 100644 index 00000000..4c625cb6 --- /dev/null +++ b/samples/Terra/sgemm3.t @@ -0,0 +1,124 @@ + +function symmat(name,I,...) + if not I then return symbol(name) end + local r = {} + for i = 0,I-1 do + r[i] = symmat(name..tostring(i),...) + end + return r +end + + +llvmprefetch = terralib.intrinsic("llvm.prefetch",{&opaque,int,int,int} -> {}) + + + +function genkernel(NB, RM, RN, V,alpha) + + local A,B,C,mm,nn,ld = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn"),symbol("ld") + local lda,ldb,ldc = ld,ld,ld + local a,b,c,caddr = symmat("a",RM), symmat("b",RN), symmat("c",RM,RN), symmat("caddr",RM,RN) + local k = symbol("k") + + local loadc,storec = terralib.newlist(),terralib.newlist() + local VT = vector(float,V) + local VP = &VT + for m = 0, RM-1 do + for n = 0, RN-1 do + loadc:insert(quote + var [caddr[m][n]] = C + m*ldc + n*V + var [c[m][n]] = alpha * @VP([caddr[m][n]]) + end) + storec:insert(quote + @VP([caddr[m][n]]) = [c[m][n]] + end) + end + end + + local calcc = terralib.newlist() + + for n = 0, RN-1 do + calcc:insert(quote + var [b[n]] = @VP(&B[n*V]) + end) + end + for m = 0, RM-1 do + calcc:insert(quote + var [a[m]] = VT(A[m*lda]) + end) + end + for m = 0, RM-1 do + for n = 0, RN-1 do + calcc:insert(quote + [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] + end) + end + end + + + return terra([A] : &float, [B] : &float, [C] : &float, [ld] : int64) + for [mm] = 0, NB, RM do + for [nn] = 0, NB,RN*V do + [loadc]; + for [k] = 0, NB do + llvmprefetch(B + 4*ldb,0,3,1); + [calcc]; + B = B + ldb + A = A + 1 + end + [storec]; + A = A - NB + C = C + RN*V + B = B - ldb*NB + RN*V + end + C = C + RM * ldb - NB + B = B - NB + A = A + lda*RM + end + end +end + +local NB = 48 +local NB2 = 5 * NB + +local V = 1 + +l1dgemm0 = genkernel(NB,1,1,V,0) +l1dgemm1 = genkernel(NB,1,1,V,1) + +terra min(a : int, b : int) + return terralib.select(a < b, a, b) +end + +local stdlib = terralib.includec("stdlib.h") +local IO = terralib.includec("stdio.h") + +terra my_sgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : float, A : &float, lda : int, B : &float, ldb : int, + beta : float, C : &float, ldc : int) + + + for mm = 0,M,NB2 do + for nn = 0,N,NB2 do + for kk = 0,K, NB2 do + for m = mm,min(mm+NB2,M),NB do + for n = nn,min(nn+NB2,N),NB do + for k = kk,min(kk+NB2,K),NB do + --IO.printf("%d %d starting at %d\n",m,k,m*lda + NB*k) + if k == 0 then + l1dgemm0(A + (m*lda + k), + B + (k*ldb + n), + C + (m*ldc + n),lda) + else + l1dgemm1(A + (m*lda + k), + B + (k*ldb + n), + C + (m*ldc + n),lda) + end + end + end + end + end + end + end +end + +terralib.saveobj("my_sgemm.o", { my_sgemm = my_sgemm }) \ No newline at end of file diff --git a/samples/Terra/sgemmkernel.t b/samples/Terra/sgemmkernel.t new file mode 100644 index 00000000..46c21454 --- /dev/null +++ b/samples/Terra/sgemmkernel.t @@ -0,0 +1,164 @@ + +function symmat(name,I,...) + if not I then return symbol(name) end + local r = {} + for i = 0,I-1 do + r[i] = symmat(name..tostring(i),...) + end + return r +end + + +function genkernel(NB, RM, RN, V,alpha) + + local terra vecload(data : &float, idx : int) + var addr = &data[idx] + return @[&vector(float,V)](addr) + end + local terra vecstore(data : &float, idx : int, v : vector(float,V)) + var addr = &data[idx] + @[&vector(float,V)](addr) = v + end + + local A,B,C,mm,nn = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn") + local lda,ldb,ldc = NB,NB,NB + local a,b,c,caddr = symmat("a",RM), symmat("b",RN), symmat("c",RM,RN), symmat("caddr",RM,RN) + local k = symbol("k") + + local loadc,storec = terralib.newlist(),terralib.newlist() + local VT = vector(float,V) + local VP = &VT + for m = 0, RM-1 do + for n = 0, RN-1 do + loadc:insert(quote + var [caddr[m][n]] = C + (mm+m)*ldc + nn + n*V + var [c[m][n]] = alpha * @VP([caddr[m][n]]) + end) + storec:insert(quote + @VP([caddr[m][n]]) = [c[m][n]] + end) + end + end + + local calcc = terralib.newlist() + + for n = 0, RN-1 do + calcc:insert(quote + var [b[n]] = @VP(&B[k*ldb + nn + n*V]) + end) + end + for m = 0, RM-1 do + calcc:insert(quote + var [a[m]] = VT(A[(mm+m)*lda + k]) + end) + end + for m = 0, RM-1 do + for n = 0, RN-1 do + calcc:insert(quote + [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] + end) + end + end + + + return terra([A] : &float, [B] : &float, [C] : &float) + for [mm] = 0, NB, RM do + for [nn] = 0, NB,RN*V do + [loadc]; + for [k] = 0, NB do + [calcc]; + end + [storec]; + end + end + end +end + +local NB = 32 +local NB2 = 8 * NB + +local V = 8 + +l1sgemm0 = genkernel(NB,2,4,V,0) +l1sgemm1 = genkernel(NB,2,4,V,1) + +terra min(a : int, b : int) + return terralib.select(a < b, a, b) +end + +local stdlib = terralib.includec("stdlib.h") +local IO = terralib.includec("stdio.h") + +local VT = vector(float,V) + +terra my_sgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : double, A : &float, lda : int, B : &float, ldb : int, + beta : float, C : &float, ldc : int) + + var AA = [&float](stdlib.malloc(sizeof(float)*M*K)) + var BB = [&float](stdlib.malloc(sizeof(float)*K*N)) + var CC = [&float](stdlib.malloc(sizeof(float)*M*N)) + + var i = 0 + for mm = 0,M,NB do + for kk = 0,K,NB do + for m = mm,mm+NB do + for k = kk,kk+NB,V do + @[&VT](&AA[i]) = @[&VT](&A[m*lda + k]) + i = i + V + end + end + end + end + i = 0 + for kk = 0,K,NB do + for nn = 0,N,NB do + for k = kk,kk+NB do + for n = nn,nn+NB,V do + @[&VT](&BB[i]) = @[&VT](&B[k*ldb + n]) + i = i + V + end + end + end + end + + for mm = 0,M,NB2 do + for nn = 0,N,NB2 do + for kk = 0,K, NB2 do + for m = mm,min(mm+NB2,M),NB do + for n = nn,min(nn+NB2,N),NB do + for k = kk,min(kk+NB2,K),NB do + --IO.printf("%d %d starting at %d\n",m,k,m*lda + NB*k) + if k == 0 then + l1sgemm0(AA + (m*lda + NB*k), + BB + (k*ldb + NB*n), + CC + (m*ldc + NB*n)) + else + l1sgemm1(AA + (m*lda + NB*k), + BB + (k*ldb + NB*n), + CC + (m*ldc + NB*n)) + end + end + end + end + end + end + end + + i = 0 + for mm = 0,M,NB do + for nn = 0,N,NB do + for m = mm,mm+NB do + for n = nn,nn+NB,V do + @[&VT](&C[m*ldc + n]) = @[&VT](&CC[i]) + i = i + V + end + end + end + end + + stdlib.free(AA) + stdlib.free(BB) + stdlib.free(CC) +end + +terralib.saveobj("my_sgemmkernel.o", { my_sgemm = my_sgemm }) \ No newline at end of file diff --git a/samples/Terra/shallowfreeze.t b/samples/Terra/shallowfreeze.t new file mode 100644 index 00000000..7d5b3d9e --- /dev/null +++ b/samples/Terra/shallowfreeze.t @@ -0,0 +1,24 @@ + + +struct B { + d : int +} +struct A { + b : &B; + c : int; + d : int; + e : int; +} + + +terra foo() : A + return A {nil} +end + +foo:disas() + +print(foo()) + + + +terralib.dumpmodule() \ No newline at end of file diff --git a/samples/Terra/sharedlib.t b/samples/Terra/sharedlib.t new file mode 100644 index 00000000..64a7afe9 --- /dev/null +++ b/samples/Terra/sharedlib.t @@ -0,0 +1,22 @@ + + +terra foo(a : int, b : int) + return a + b +end + +local ffi = require 'ffi' + +local name = (ffi.os == "Windows" and "foo.dll" or "foo.so") + +local args = {} + +if ffi.os == "Windows" then + args = {"/IMPLIB:foo.lib","/EXPORT:foo" } +end + +terralib.saveobj(name,{ foo = foo }, args) + +local foo2 = terralib.externfunction("foo", {int,int} -> int ) +terralib.linklibrary("./"..name) + +assert(4 == foo2(1,3)) diff --git a/samples/Terra/shift.t b/samples/Terra/shift.t new file mode 100644 index 00000000..67794ebd --- /dev/null +++ b/samples/Terra/shift.t @@ -0,0 +1,7 @@ +local test = require("test") + +terra foo(a : int) + return 1 << 2, a >> 1, -4 >> 1, uint32(-a) >> 1 +end + +test.meq({4,2,-2,2147483646},foo(4)) diff --git a/samples/Terra/signext.t b/samples/Terra/signext.t new file mode 100644 index 00000000..a9a17096 --- /dev/null +++ b/samples/Terra/signext.t @@ -0,0 +1,12 @@ + + +terra bar() + var a : uint8 = 255 + var b = foo(a) + return a == b +end and +terra foo(a : uint8) + return a +end + +print(bar()) \ No newline at end of file diff --git a/samples/Terra/simple.t b/samples/Terra/simple.t new file mode 100644 index 00000000..8d21c5eb --- /dev/null +++ b/samples/Terra/simple.t @@ -0,0 +1,6 @@ + +terra simple(a : int) + return a + a +end +local test = require("test") +test.eq(simple(2),4) \ No newline at end of file diff --git a/samples/Terra/simpleadd.t b/samples/Terra/simpleadd.t new file mode 100644 index 00000000..dd8e42cd --- /dev/null +++ b/samples/Terra/simpleadd.t @@ -0,0 +1,15 @@ +struct Complex { real : float, imag : float } + +terra Complex.metamethods.__add(a : Complex, b : Complex) + return Complex { a.real + b.real, a.imag + b.imag } +end + + +terra foo() + var a = Complex { 1, 2 } + var b = Complex { 3, 4 } + var c = a + b + return c.real,c.imag +end + +print(foo()) \ No newline at end of file diff --git a/samples/Terra/simpleapply.t b/samples/Terra/simpleapply.t new file mode 100644 index 00000000..e6a67034 --- /dev/null +++ b/samples/Terra/simpleapply.t @@ -0,0 +1,19 @@ +struct Vec { data : int[4] } +Vec.metamethods.__apply = terra(self : &Vec, i : int) + return self.data[i] +end + +struct Vec2 { data : int[4] } +Vec2.metamethods.__apply = macro(function(self,b) + return `self.data[b] +end) + +terra bar() + var a = Vec { array(1,2,3,4) } + var b = Vec2 { array(1,2,3,4) } + b(2) = b(2) + 1 + return b(2) + a(2) +end + +local test = require("test") +test.eq(bar(),7) \ No newline at end of file diff --git a/samples/Terra/simpleglobal.t b/samples/Terra/simpleglobal.t new file mode 100644 index 00000000..ff8964ce --- /dev/null +++ b/samples/Terra/simpleglobal.t @@ -0,0 +1,19 @@ + +local a = terralib.global(int) +local b = terralib.global(5) +local c = terralib.global(int,3) +terra foo() + a = 4 +end + + +terra bar() + return c + a + b +end + +foo() +assert(bar() == 12) + +b:set(4) + +assert(bar() == 11) \ No newline at end of file diff --git a/samples/Terra/simplerec.t b/samples/Terra/simplerec.t new file mode 100644 index 00000000..5d0b98ff --- /dev/null +++ b/samples/Terra/simplerec.t @@ -0,0 +1,25 @@ + + + +local terra bar() + return 1 +end +and struct A { + a : int +} +and local struct B { + a : int +} +and terra B:foo() + return self.a +end +and terra foo() + var b , a = B{4}, A{5} + return 1 + b:foo() +end +and local terra mydecl +and struct mystructdecl + +print(bar()) + +print(foo()) diff --git a/samples/Terra/simplestruct.t b/samples/Terra/simplestruct.t new file mode 100644 index 00000000..fc0b5ac8 --- /dev/null +++ b/samples/Terra/simplestruct.t @@ -0,0 +1,10 @@ + +struct A { + a : int +} + +terra foo(a : &A) + return a +end + +print(foo(terralib.new(A,{3}))) diff --git a/samples/Terra/simplevec.t b/samples/Terra/simplevec.t new file mode 100644 index 00000000..b75f3d1a --- /dev/null +++ b/samples/Terra/simplevec.t @@ -0,0 +1,12 @@ + +terra sum(input : &float, N : int) + var acc : vector(float,4) = vector(0.f,0.f,0.f,0.f) + for i = 0,N,4 do + --cast the floats to float4s and load + var entry = @[&vector(float,4)](input + i) + acc = acc + entry + end + return acc[0] + acc[1] + acc[2] + acc[3] +end + +sum:disas() diff --git a/samples/Terra/sintable.t b/samples/Terra/sintable.t new file mode 100644 index 00000000..c1606563 --- /dev/null +++ b/samples/Terra/sintable.t @@ -0,0 +1,17 @@ +local N = 32 +local tbl = terralib.new(float[N]) +for i = 1,N do + tbl[i-1] = math.sin( 2 * math.pi * (i-1)/N) +end + +local ctable = terralib.constant(tbl) + +terra sintable(a : float) : float + var idx = int(a / (2 * math.pi) * N) + return ctable[idx] +end + +sintable:disas() + +print(sintable(0)) +print(sintable(math.pi/4)) \ No newline at end of file diff --git a/samples/Terra/special.t b/samples/Terra/special.t new file mode 100644 index 00000000..218aa3a2 --- /dev/null +++ b/samples/Terra/special.t @@ -0,0 +1,61 @@ + +local test = require("test") + +function mkspecial(N) + local terra pow(a : double) + var i,r = 0,1.0 + while i < N do + r = r * a + i = i + 1 + end + return r + end + return pow +end + + +local pow2 = mkspecial(2) +local pow3 = mkspecial(3) + +test.eq(pow2(2),4) +test.eq(pow3(2),8) + + +function mkor(T) + local terra fn(a : T, b : T) : T + return a or b + end + return fn +end + +local lor = mkor(bool) +local aor = mkor(int) + +test.eq(lor(1,2),true) +test.eq(aor(1,2),3) + + +--[[ +function my_lua_fun() + + val my_list = new_list() + defer delete(my_list) + + + + return { ["a"] = 1, ["b"] = 2 } +end +--wess weimer PhD on controlling actions +a:my_method(b) + +a.my_method(a,b) + +var a : T +a:my_method(b) +T.my_method(a,b) + +Pair = typedef(struct { a = int, b = int}) + +var a : Pair = { 1, 3 } +var a : Pair = my_lua_fun() +]] \ No newline at end of file diff --git a/samples/Terra/speed.t b/samples/Terra/speed.t new file mode 100644 index 00000000..ceca0264 --- /dev/null +++ b/samples/Terra/speed.t @@ -0,0 +1,30 @@ +local c = terralib.includecstring [[ + #include + #include +]] + +terra doit(N : int64) + var cur,last = 1ULL,1ULL + for i = 0ULL, (N-2ULL) do + cur,last = cur+last,cur + end + return cur +end +terra main(argc : int, argv : &&int8) + var N = 4ULL + if argc == 2 then + N = c.atoi(argv[1]) + end + var result = doit(N) + c.printf("%lld\n",result) +end + +terra what() + return c.atoi("54") +end + +local test = require("test") +print(what()) +print(test.time( function() doit:compile() end)) +print(test.time( function() doit(100000000) end)) +print(test.time( function() terralib.saveobj("speed",{main = main}) end)) diff --git a/samples/Terra/splitprimary.t b/samples/Terra/splitprimary.t new file mode 100644 index 00000000..aed90417 --- /dev/null +++ b/samples/Terra/splitprimary.t @@ -0,0 +1,19 @@ +r = 1 +local function foo(a) + r = a + return r +end +local b = foo(1) +(foo)(3) +assert(b + r == 4) + +terra testescapes() + var a = [4] + [ quote + a = a + 1 + end + ] + return [ `&a ][0] +end + +assert(testescapes() == 5) \ No newline at end of file diff --git a/samples/Terra/ssimple.t b/samples/Terra/ssimple.t new file mode 100644 index 00000000..a50f90a8 --- /dev/null +++ b/samples/Terra/ssimple.t @@ -0,0 +1,477 @@ +function failit(fn) + local success,msg = pcall(fn) + if success then + error("failed to fail.",2) + elseif not string.match(msg,"Errors reported during") then + error("failed wrong: "..msg,2) + end +end + +terra foo() + return 1 +end + +a = 4 +terra foo2() + return a +end +b = 4.5 +terra foo3() + return b +end + +terra foo4() + var a = 3 + return a +end + + + +sa = symbol("myname") + +terra foo5() + var [sa] = 5 + return sa +end + +whatwhat = `3 + b + +terra foo6() + return whatwhat +end + +local whatwhat2 = {4,5} + +terra foo7() + return 3,4,5,whatwhat,whatwhat2 +end + +terra foo8() + return whatwhat2,4 +end + +local test = require("test") +assert(foo() == 1) +assert(foo2() == 4) +assert(foo3() == 4.5) +assert(foo4() == 3) +assert(foo5() == 5) +assert(foo6() == 7.5) +test.meq({3,4,5,7.5,4,5},foo7()) +test.meq({4,5,4},foo8()) + +local a = { b = {c = 4}} +terra foo9() + return a.["b"].c +end +print(foo9()) + +struct A { a : int } + +A.methods.what = terra() return 4 end + + +terra foo10() + return A.what() +end + +assert(foo10() == 4) + + +terra foo11() + var c = 3 + return [4 + 5 + a.b.c] + [c] +end + +assert(foo11() == 16) + +failit(function() + local terra missingvar() + return missing + end +end) +local b = coroutine.create(failit) +failit(function() + return `sa.foobar,`b.e +end) +failit(function() + return `a.d +end) +failit(function() + return `a.[1+"nope"] +end) +failit(function() + return `a.[1] +end) + +over = symbol() + +anint = symbol(int) + +terra foo13() + var [anint] + anint = 3 + return anint +end +assert(foo13() == 3) + +terra foo12() + goto [over] + while true do + end + ::[over]:: +end + +foo12() + + +terra foo14() : {int,double} + return 3.5,4.5 +end + +test.meq({3,4.5},foo14()) + +terra foo15() : int + return 3.5 +end +assert(foo15() == 3) + +failit(function() + local terra foo16() : 3 + end +end) + +terra foo16() + var r = 0 + for i = 0,10 do + r = r + 2 + end + return r +end + +assert(foo16() == 20) + +terra foo17() + var i = 0 + repeat + i = i + 1 + var b = i + 1 + until b == 10 + repeat + until true + return i +end +assert(foo17() == 9) + +local terra foo18() + var a : int, b : double = 2.5,2.5 + return a,b +end + +test.meq({2,2.5},foo18()) + +failit(function() + local function doit() + return 1 + {} + end + return `[doit()] +end) + +failit(function() +local terra foo19() + var a : 3, b : double = 2.5,2.5 + return a,b +end +foo19() +end) + +failit(function() +local terra foo20() + var a : int, a : double = 2.5,2.5 + return a,a +end +foo20() +end) + +foo21s = symbol() + +local terra foo21() + var [foo21s],b = 3,4 + return b + foo21s +end +assert(foo21() == 7) + +failit(function() +local terra foo20() + var ["a"] : int, ["b"] = 4,5 + return a +end +end) + +failit(function() + return quote var a end +end) + +astring = "astring" + +local terra foo22() + return astring[0] +end + +assert(foo22() == 97) + +local aquote = `7 +local atree = aquote.tree + +terra foo23() + return atree +end + +assert(foo23() == 7) + +terra foo24(a : int) + return 3,4 + a +end + +terra foo25() + var c,a,b = 4,foo24(3) + return a + b + c +end + + + +assert(foo25() == 14) + +local obfuscate = { foo24 } +terra foo26() + var c,a,b = 4,obfuscate(3) + return a + b + c +end + +local obfuscate2 = { `foo24(3) } +terra foo27() + obfuscate2 + foo24(3) +end +foo27() + +assert(foo26() == 14) + +failit(function() +local terra foo26a(a : int) + if a == 0 then + return a + else + return foo26a(a - 1) + 1 + end +end +foo26a(3) +end) + +local terra foo26b(a : int) : int + if a == 0 then + return a + else + var foo26bptr = foo26b + return foo26b(a - 1) + foo26bptr(0) + 1 + end +end + +assert(foo26b(3) == 3) + + +failit(function() + (terra() return (3)(4) end)() +end) + +failit(function() + local terra notdefined + local terra callnotdefined() + return notdefined(1) + end + callnotdefined() +end) + + + local terra norets() + end + local terra callnotdefined() + return (norets()) + end + callnotdefined() + +local terra returns2() return 1,2 end + +terra foo29(a : int) + if a > 1 then + return (returns2()._0) + else + return 5 + end +end + +assert(foo29(3) == 1 and foo29(0) == 5) + + +terra foo30() + print(4) +end + +foo30() + + +local terra notdefined +local terra definedtwice(a : int) return a end +terra definedtwice(a : int, b : int) return a + b end + +failit(function() +local terra foo31() + return (notdefined), (definedtwice) +end +foo31() +end) + +terra foo35() + return definedtwice(3) + definedtwice(3,4) +end + + +local terra foo36() + var r = returns2() + return definedtwice(unpackstruct(r)) +end +assert(3 == foo36()) + +assert(foo35() == 10) + +struct B { + a : int; + b : double; +} + +terra B:add() + return self.a + self.b +end + +terra B:inc(v : int) + self.a = self.a + v +end + +B.metamethods.__apply = terra(self : &B, v :int) + return v + v +end + +B.metamethods.__entrymissing = macro(function() return 8 end) + +struct C { + a : int; +} + +terra B.metamethods.__add(self : &B, a : int, b : int) + return self.a + a +end +terra B.metamethods.__add(self : &B, a : int, b : int, c : int) + return self.a + a +end + + +function myvoid() + print("CALLED") +end +terra testcallvoid() + myvoid() +end +print("BEFORE") +testcallvoid() +print("AFTER") + +terra C.metamethods.__add(b : &B, c : &C) + return b.a + c.a +end + +terra foo40() + var b = B { 5,6 } + var c = C { 3 } + var ptrb = &b + b:inc(3) + ptrb:inc(3) + return b:add() + ptrb:add() + b(3) + ptrb(3) + b.foo + ptrb.foo + (b + c) +end + +assert(foo40() == 8 + 8 + 6 + 6 + 6 + 11 + 6 + 11 + 3 + 11) +B.metamethods.__add = macro(function(b,c) return `b.a + c.a + 1 end) +terra foo41() + var b = B { 5,6 } + var c = C { 3 } + var ptrb = &b + b:inc(3) + ptrb:inc(3) + return b:add() + ptrb:add() + b(3) + ptrb(3) + b.foo + ptrb.foo + (b + c) +end + +assert(foo41() == 8 + 8 + 6 + 6 + 6 + 11 + 6 + 11 + 3 + 11 + 1) + +terra foo32() + var a = B { b = 3, a = 4 } + var ptra = &a + a.b = a.b + 1 + ptra.a = ptra.a + (@ptra).a + 1 + return a.a, a.b +end + +test.meq({9,4},foo32()) + +terra foo33() + return (vector(3,4,5) + vectorof(double,3,4,5))[0] + sizeof(double) +end + +local notinscope = symbol() + +failit(function() + local terra foo34() + return notinscope + end + foo34() +end) + +local gbl = global(int) + +terra foo37() + gbl = 4 +end +foo37() + +assert(gbl:get() == 4) +assert(foo33() == 14) + +local C = terralib.includec("stdio.h") + +terra foo38() + C.printf("hello, world %f\n", 3.5f) +end +foo38() +local twice = macro(function(exp,call) + return quote + exp = exp + 1 + call._0 + exp = exp + 1 + call._0 + end +end) +terra foo39() + var a = 4 + twice(a,returns2()) + return a +end + +assert(foo39() == 8) +--checkexp truncate and allowluaobjects behavior +--global variable resolution +--select/pointerselect/__get +--expression macro 1 return +--expression macro truncated +--expression macro expanded +--expression macro that returns a multi-ret function +--expression macro that returns a multi-ret function that was an argument +--function call, function call with multi-return, +--function call to overloaded function/undef function +--overloaded operator with mixed macro/function stuff +--reciever cast stuff \ No newline at end of file diff --git a/samples/Terra/staticmethod.t b/samples/Terra/staticmethod.t new file mode 100644 index 00000000..0ce91a4c --- /dev/null +++ b/samples/Terra/staticmethod.t @@ -0,0 +1,9 @@ +struct A { +} +A.metamethods.__getmethod = function(self,idx) + return tonumber(string.sub(idx,2,-1)) +end +terra foo() + return A.f33 + A.b34 +end +assert(67 == foo()) \ No newline at end of file diff --git a/samples/Terra/stattest.t b/samples/Terra/stattest.t new file mode 100644 index 00000000..71380d2d --- /dev/null +++ b/samples/Terra/stattest.t @@ -0,0 +1,13 @@ +local ffi = require("ffi") +if ffi.os == "Windows" then + return +end + +C,T = terralib.includec("sys/stat.h") +terra dostat() + var s : T.stat + C.stat("stattest.t",&s) + return s.st_size +end + +assert(dostat() == 210) diff --git a/samples/Terra/stencil.t b/samples/Terra/stencil.t new file mode 100644 index 00000000..1ce4d732 --- /dev/null +++ b/samples/Terra/stencil.t @@ -0,0 +1,134 @@ + +local C = terralib.includecstring [[ +#include +#include +#ifndef _WIN32 +#include +static double CurrentTimeInSeconds() { + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec / 1000000.0; +} +#else +#include +static double CurrentTimeInSeconds() { + return time(NULL); +} +#endif + +int CalcTime(int * times, double * start) { + if(*times == 0) { + *start = CurrentTimeInSeconds(); + } else { + double elapsed = CurrentTimeInSeconds() - *start; + if(elapsed > 0.1f && *times >= 3) { + *start = elapsed / *times; + return 0; + } + } + (*times)++; + return 1; +} +]] + + +function symmat(name,I,...) + if not I then return symbol(name) end + local r = {} + for i = 0,I-1 do + r[i] = symmat(name..tostring(i),...) + end + return r +end + + + +local IO = terralib.includec("stdio.h") + + + +NI,NJ = 1,4 +V = 8 +terra uload(d : &float) + return terralib.attrload([&vector(float,V)](d), { align = 4 }) +end +terra ustore(d : &float, v : vector(float,V)) + terralib.attrstore([&vector(float,V)](d), v, { align = 4 }) +end + +terra runit(N : int, input : &float, output : &float) + input = input + N*NI + V*NJ + output = output + N*NI + V*NJ + for i = NI, N-NI,NI do + for j = V*NJ, N-V*NJ,V*NJ do + [(function() + local C = symmat("C",NI,NJ) + local stmts = terralib.newlist() + for iii = 0,NI-1 do for jjj = 0,NJ-1 do + stmts:insert(quote + var [C[iii][jjj]] : vector(float,V) = 0 + end) + end end + + for ii = -1,1 do + for jj = -1,1 do + for iii = 0,NI-1 do for jjj = 0,NJ-1 do + if math.abs(ii) + math.abs(jj) ~= 2 then + stmts:insert(quote + var d = uload(input + N * (ii + iii) + jj + V*jjj); + [C[iii][jjj]] = [C[iii][jjj]] + d + end) + end + end end + end + end + for iii = 0,NI-1 do for jjj = 0,NJ-1 do + stmts:insert(quote + ustore(output + N * (iii) + V*jjj, [C[iii][jjj]]) + end) + end end + return stmts + end)()] + input = input + V*NJ + output = output + V*NJ + end + input = input + 2*V*NJ + output = output + 2*V*NJ + end +end + +terra doit() + var N = 2048 + var img = [&float](C.malloc(N*N*sizeof(float))) + var img2 = [&float](C.malloc(N*N*sizeof(float))) + + for i = 0, N do + for j = 0, N do + img[i*N+j] = 1 + end + end + + var times = 0 + var mytime : double + while C.CalcTime(×,&mytime) ~= 0 do + runit(N,img,img2) + end + + C.printf("times = %d\n",times) + for i = NI, N-NI do + for j = V*NJ, N-V*NJ do + if img2[i*N+j] ~= 5 then + C.printf("wrong! %d %d %f\n",i,j,img2[i*N+j]) + goto out + end + end + end + ::out:: + var togiga = 1.0/(1024*1024*1024) + var pixels = (N-NI)*(N-V*NJ) + C.printf("%f %f %f\n", mytime, pixels*4*2 *togiga / mytime, 5*pixels * togiga / mytime) + +end +doit() +runit:disas() +doit() diff --git a/samples/Terra/strerror.t b/samples/Terra/strerror.t new file mode 100644 index 00000000..6eb0b83f --- /dev/null +++ b/samples/Terra/strerror.t @@ -0,0 +1,9 @@ +string=terralib.includec("string.h") +buf=terralib.new(int8[1024]) +ffi = require "ffi" +if ffi.os == "Windows" then + string.strerror_s(buf,1024,1) +else + string.strerror_r(1,buf,1024) +end +print(ffi.string(buf)) diff --git a/samples/Terra/string.t b/samples/Terra/string.t new file mode 100644 index 00000000..d44388eb --- /dev/null +++ b/samples/Terra/string.t @@ -0,0 +1,15 @@ + +local c = terralib.includec("stdio.h") + +terra foo() + var a = "whatwhat\n" + return c.puts(a) +end + +local test = require("test") +local ffi = require("ffi") +if ffi.os == "Windows" then + test.eq(foo(),0) +else + test.eq(foo(),10) +end \ No newline at end of file diff --git a/samples/Terra/struct.t b/samples/Terra/struct.t new file mode 100644 index 00000000..5c3f96cd --- /dev/null +++ b/samples/Terra/struct.t @@ -0,0 +1,50 @@ +--the zero line +struct A { b : B } and +struct B {a : int, b : int} + +terra bar(a : B) + a.a = a.a + 1 + return a,3 +end + +terra foo() + var a : B + a.a = 4; + --(bar(a)).a = 3, TODO: why is the offset == 0 for this value? + var c,d = bar(a) + return c.a + a.a + d +end + + +terra baz(a : &B) + a.a = 1 + a.b = 2 + return a.a +end + + +terra foo2() + var a : B + var d = baz(&a) + return a.a + a.b + d +end +local test = require("test") + +test.eq(foo(),12) +test.eq(foo2(),4) + + +local C = tuple(int, int) + +local D = tuple(int, int) + +terra anon() + var c : C + c._0 = 3 + c._1 = 4 + var d : D = c + --var b : B = d + return d._0 + d._1 +end + +test.eq(anon(),7) \ No newline at end of file diff --git a/samples/Terra/structarg.t b/samples/Terra/structarg.t new file mode 100644 index 00000000..c3d1f4ed --- /dev/null +++ b/samples/Terra/structarg.t @@ -0,0 +1,9 @@ +terra foobar() + var a = { a=3,b=4} + var b = {a=5,b=6.0} + b = a + return a.a +end + +local test = require("test") +test.eq(foobar(),3) \ No newline at end of file diff --git a/samples/Terra/structcast.t b/samples/Terra/structcast.t new file mode 100644 index 00000000..9b84a258 --- /dev/null +++ b/samples/Terra/structcast.t @@ -0,0 +1,38 @@ +struct A { a : int } +struct B {a : int, b : A} + +local D = tuple(double, A) + +terra anon() + var b : B + b.a = 4 + b.b.a = 3 + + var d : D + d._0 = 1.0 + d._1.a = 2 + + b = B(d) + + return b.a + b.b.a +end + +terra anon2() + var b = B { b = A{ 2.0 }, a = 4 } + var b2 = B { a = 4, b = A{ 2.0 } } + var b3 = B{ 4, A{2.0} } + return b.a + b.b.a + b2.a + b2.b.a + b3.a + b3.b.a +end + +terra anon3() + return {5,A{6}} +end + +terra anon4() + var b = B(anon3()) + return b.a + b.b.a +end +test = require("test") +test.eq(anon(),3) +test.eq(anon2(),18) +test.eq(anon4(),11) \ No newline at end of file diff --git a/samples/Terra/structconstructor.t b/samples/Terra/structconstructor.t new file mode 100644 index 00000000..8a9bd5c9 --- /dev/null +++ b/samples/Terra/structconstructor.t @@ -0,0 +1,9 @@ +struct A { a : int, b : int} + +terra foobar() + var a = A { 3, 4} + return a.b +end + +local test = require("test") +test.eq(foobar(),4) \ No newline at end of file diff --git a/samples/Terra/structrvalue.t b/samples/Terra/structrvalue.t new file mode 100644 index 00000000..31c0f6eb --- /dev/null +++ b/samples/Terra/structrvalue.t @@ -0,0 +1,16 @@ +--the zero line +struct A { b : B } and +struct B {a : int, b : int} + + +terra foo() + var b = B {1,2} + return b +end + +terra bar() + return foo().b +end + +local test = require("test") +test.eq(bar(),2) \ No newline at end of file diff --git a/samples/Terra/structsyntax.t b/samples/Terra/structsyntax.t new file mode 100644 index 00000000..43d1b06a --- /dev/null +++ b/samples/Terra/structsyntax.t @@ -0,0 +1,14 @@ +struct A { + a : int + b : float + union { + c : int + d : float + } +} + +terra foo() + return A { a = 4, b = 5, c = 3} +end + +assert(foo().c == 3) \ No newline at end of file diff --git a/samples/Terra/sugar.t b/samples/Terra/sugar.t new file mode 100644 index 00000000..6870fde5 --- /dev/null +++ b/samples/Terra/sugar.t @@ -0,0 +1,15 @@ + +local foo = &int + + +local a = int -> {bool,int} + +print(a.name) + +terra foo2() + +end + + + +local test = require("test") diff --git a/samples/Terra/sumlanguage1.t b/samples/Terra/sumlanguage1.t new file mode 100755 index 00000000..84889622 --- /dev/null +++ b/samples/Terra/sumlanguage1.t @@ -0,0 +1,2 @@ +import "lib/sumlanguage" +assert((sum 1.0f,2LL,2ULL,3.0,1U,1 done)==10) \ No newline at end of file diff --git a/samples/Terra/sumlanguage2.t b/samples/Terra/sumlanguage2.t new file mode 100755 index 00000000..7c84b980 --- /dev/null +++ b/samples/Terra/sumlanguage2.t @@ -0,0 +1,4 @@ +import "lib/sumlanguage2" +a = 2 +local b = 3 +assert(sum 1,a,b done == 6) \ No newline at end of file diff --git a/samples/Terra/symbolmangling.t b/samples/Terra/symbolmangling.t new file mode 100644 index 00000000..70c5ad79 --- /dev/null +++ b/samples/Terra/symbolmangling.t @@ -0,0 +1,4 @@ +C = terralib.includecstring [[ + #include +]] +C.fopen("broken.t","r") diff --git a/samples/Terra/symbolvar.t b/samples/Terra/symbolvar.t new file mode 100644 index 00000000..4d4b0cbd --- /dev/null +++ b/samples/Terra/symbolvar.t @@ -0,0 +1,11 @@ + + +local a = symbol() + +terra foo() + var [a] = 3 + return [a] +end + +local test = require("test") +test.eq(3,foo()) \ No newline at end of file diff --git a/samples/Terra/symbolvar2.t b/samples/Terra/symbolvar2.t new file mode 100644 index 00000000..1195e539 --- /dev/null +++ b/samples/Terra/symbolvar2.t @@ -0,0 +1,16 @@ + + +local a = symbol() + +local q = quote + [a] = [a] + 1 +end + +terra foo() + var [a] = 2 + q + return [a] +end + +local test = require("test") +test.eq(3,foo()) \ No newline at end of file diff --git a/samples/Terra/symbolvar3.t b/samples/Terra/symbolvar3.t new file mode 100644 index 00000000..5eed2aaa --- /dev/null +++ b/samples/Terra/symbolvar3.t @@ -0,0 +1,16 @@ + + +local a = symbol() + +local q = quote + var [a] = 2 + [a] = [a] + 1 +end + +terra foo() + q + return [a] +end + +local test = require("test") +test.eq(3,foo()) \ No newline at end of file diff --git a/samples/Terra/symbolvar4.t b/samples/Terra/symbolvar4.t new file mode 100644 index 00000000..1db5c832 --- /dev/null +++ b/samples/Terra/symbolvar4.t @@ -0,0 +1,16 @@ +local a = symbol() +local b = symbol(int) + +local c = symbol(int) +local d = symbol() + + +terra foo() + var [a],[b] = 1.25,1.25 + var [c],[d] = 3.25,3.25 + return [a] + [b] + [c] + [d] +end + +local test = require("test") + +test.eq(foo(),8.50) \ No newline at end of file diff --git a/samples/Terra/symbolvar5.t b/samples/Terra/symbolvar5.t new file mode 100644 index 00000000..6028bb13 --- /dev/null +++ b/samples/Terra/symbolvar5.t @@ -0,0 +1,16 @@ +local a = symbol() +local b = { symbol(int), symbol(int) } + +local c = symbol(int) +local d = { symbol(), symbol() } + + +terra foo() + var [a],[b] = 1.25,1.25,1.25 + var [c],[d] = 3.25,3.25,3.25 + return [a] + [b[1]] + [b[2]] + [c] + [d[1]] + [d[2]] +end + +local test = require("test") + +test.eq(foo(),12.75) \ No newline at end of file diff --git a/samples/Terra/symbolvar6.t b/samples/Terra/symbolvar6.t new file mode 100644 index 00000000..efd07137 --- /dev/null +++ b/samples/Terra/symbolvar6.t @@ -0,0 +1,16 @@ +local a = symbol() +local b = {} + +local c = symbol(int) +local d = {} + + +terra foo() + var [a],[b] = 1.25 + var [c],[d] = 3.25 + return [a] + [c] +end + +local test = require("test") + +test.eq(foo(),4.25) \ No newline at end of file diff --git a/samples/Terra/symbolvar7.t b/samples/Terra/symbolvar7.t new file mode 100644 index 00000000..5c0bc621 --- /dev/null +++ b/samples/Terra/symbolvar7.t @@ -0,0 +1,15 @@ +local a = symbol() +local b = { symbol(int), symbol(int) } + +local c = symbol(int) +local d = symbol(double) + +terra foo() + var [a] : double,[b] = 1.25,1.25,1.25 + var [c] : double,[d] : int = 3.25,3.25 + return [a] + [b[1]] + [b[2]] + [c] + [d] +end + +local test = require("test") + +test.eq(foo(),9.50) \ No newline at end of file diff --git a/samples/Terra/symparam.t b/samples/Terra/symparam.t new file mode 100644 index 00000000..9aea4d3a --- /dev/null +++ b/samples/Terra/symparam.t @@ -0,0 +1,9 @@ + +local a = symbol() +terra foo([a] : int, b : int) + return [a] + b +end + +local test = require("test") + +test.eq(foo(1,2),3) \ No newline at end of file diff --git a/samples/Terra/symparam2.t b/samples/Terra/symparam2.t new file mode 100644 index 00000000..f6c7e393 --- /dev/null +++ b/samples/Terra/symparam2.t @@ -0,0 +1,9 @@ + +local a = symbol(int) +terra foo([a], [a], b : int) + return [a] + b +end + +local test = require("test") + +test.eq(foo(1,2,4),6) \ No newline at end of file diff --git a/samples/Terra/symparam3.t b/samples/Terra/symparam3.t new file mode 100644 index 00000000..35b3e40b --- /dev/null +++ b/samples/Terra/symparam3.t @@ -0,0 +1,15 @@ + +local a = symbol(int) +local c = {} +terra foo([a], b : int, [c]) + return [a] + b +end +local d = {symbol(int),symbol(int)} +terra foo2([a], b : int, [d]) + return [a] + b + [d[1]] + [d[2]] +end + +local test = require("test") + +test.eq(foo2(1,2,3,4),10) +test.eq(foo(1,2),3) \ No newline at end of file diff --git a/samples/Terra/template.t b/samples/Terra/template.t new file mode 100644 index 00000000..b305aeb9 --- /dev/null +++ b/samples/Terra/template.t @@ -0,0 +1,6 @@ + +terra foo() + +end + +local test = require("test") diff --git a/samples/Terra/terracast.t b/samples/Terra/terracast.t new file mode 100644 index 00000000..05df48f7 --- /dev/null +++ b/samples/Terra/terracast.t @@ -0,0 +1,15 @@ + + + +function addone(a) + return a + 1 +end + + +local a1 = terralib.cast(int -> int, addone) + +terra dofn(a : int -> int) + return a(3) +end +local test = require("test") +test.eq(dofn(a1),4) \ No newline at end of file diff --git a/samples/Terra/terralua.t b/samples/Terra/terralua.t new file mode 100644 index 00000000..8084f68c --- /dev/null +++ b/samples/Terra/terralua.t @@ -0,0 +1,32 @@ +function dog(...) + print("Hi. This is Dog.",...) +end + +terra foo() + dog() +end + +terra passanarg() + dog(3,4,5,nil) +end + +function takesastruct(a) + print(a.a,a.b) + a.a = a.a + 1 +end +struct A { a : int , b : double } +terra passastruct() + var a = A {1,3.4} + --takesastruct(a) luajit doesn't like having structs passed to its callbacks by value? + var b = a.a + takesastruct(&a) + var c = a.a + return b + c +end + +foo() +passanarg() + +local test = require("test") + +test.eq(passastruct(),3) diff --git a/samples/Terra/terraluamethod.t b/samples/Terra/terraluamethod.t new file mode 100644 index 00000000..09de7b2d --- /dev/null +++ b/samples/Terra/terraluamethod.t @@ -0,0 +1,16 @@ +struct A { a : int } + +A.methods.up = function(self,b) + self.a = self.a + 1 + (b or 0) +end + +terra foo() + var a = A { 1 } + a:up() + var b = &a + b:up(4) + return a.a +end + +local test = require("test") +test.eq(foo(),7) \ No newline at end of file diff --git a/samples/Terra/terranew.t b/samples/Terra/terranew.t new file mode 100644 index 00000000..67336e38 --- /dev/null +++ b/samples/Terra/terranew.t @@ -0,0 +1,19 @@ + + +A = terralib.new(int[4],{1,2,3,4}) + +terra foo(a : &int) + var sum = 0 + for i = 0,4 do + sum = sum + a[i] + end + return sum,a +end + +local test = require("test") + +local a,b = terralib.unpackstruct(foo(A)) + +test.eq(a,10) +test.eq(terralib.typeof(A),int[4]) +test.eq(terralib.typeof(b),&int) \ No newline at end of file diff --git a/samples/Terra/testdebug.t b/samples/Terra/testdebug.t new file mode 100644 index 00000000..b155e795 --- /dev/null +++ b/samples/Terra/testdebug.t @@ -0,0 +1,57 @@ +if not terralib.traceback then return end +--this test require debug on, if it is not on, relaunch with it on +if 0 == terralib.isdebug then + assert(0 == os.execute(terralib.terrahome.."/bin/terra -g testdebug.t")) + return +end +C = terralib.includec("stdio.h") + +terra foo(a : int, b : int) + var c = a + b + return c * 2 +end + +local ptr = terralib.cast(rawstring,foo:getdefinitions()[1]:getpointer()) + +terra findptr(a : &opaque) + var si : terralib.SymbolInfo + var li : terralib.LineInfo + terralib.lookupsymbol(a,&si) + C.printf("p = %p, addr = %p, sz = %d, nm = %.*s\n",a,si.addr,[int](si.size), si.namelength,si.name) + terralib.lookupline(si.addr,a, &li) + C.printf("line = %.*s:%d\n",li.namelength,li.name,[int](li.linenum)) + return li.linenum +end +assert(11 == findptr(ptr+6)) +assert(10 == findptr(ptr+4)) +local ra = terralib.intrinsic("llvm.returnaddress", int32 -> &opaque ) +local fa = terralib.intrinsic("llvm.frameaddress", int32 -> &opaque ) +terra testbt3() + var frames : (&opaque)[128] + terralib.traceback(nil) + var N = terralib.backtrace(frames,128,ra(0),fa(1)) + for i = 0,N do + C.printf("%p ",frames[i]) + var nm : rawstring + var nmL : uint64 + var si : terralib.SymbolInfo + if terralib.lookupsymbol(frames[i],&si) then + C.printf("frame %.*s\n", si.namelength, si.name) + else + C.printf("\n") + end + end +end +testbt3:setinlined(false) +terra fn2() + testbt3() + C.printf("fn2\n") + return 1 +end +terra what() + fn2() + C.printf("what\n") +end +fn2:setinlined(false) +what() +terralib.disas(terralib.traceback,5,5) \ No newline at end of file diff --git a/samples/Terra/testimport.t b/samples/Terra/testimport.t new file mode 100644 index 00000000..e2ef63db --- /dev/null +++ b/samples/Terra/testimport.t @@ -0,0 +1,6 @@ + +local r,e = terralib.loadstring [[ +import "lib.fakeimport" +]] + +assert(e:match("stack traceback")) \ No newline at end of file diff --git a/samples/Terra/testlang1.t b/samples/Terra/testlang1.t new file mode 100755 index 00000000..89496035 --- /dev/null +++ b/samples/Terra/testlang1.t @@ -0,0 +1,21 @@ +import "lib/testlang" + +print("hello") +local a = image "astring" +image 4 +image and,or,& +image image +image akeyword +image foobar +print(a) +image bar 3 +print(bar,bar1) + +local image what 4 3 +print(what) +local a = 4 +local b = 5 +c = 6 +print(foolist { a, b, c}) +--test eos token +image diff --git a/samples/Terra/testlang2.t b/samples/Terra/testlang2.t new file mode 100755 index 00000000..b4d1229f --- /dev/null +++ b/samples/Terra/testlang2.t @@ -0,0 +1,4 @@ +import "lib/testlang" + +local a = image "astring" +print(a) diff --git a/samples/Terra/testlog.t b/samples/Terra/testlog.t new file mode 100644 index 00000000..2e015773 --- /dev/null +++ b/samples/Terra/testlog.t @@ -0,0 +1,8 @@ +terra foo(a : bool, b : bool, c : bool) return a and b or c end + +foo:disas() +terra callfoo() + var r = foo(true,false,true) + return r +end +assert(callfoo()) \ No newline at end of file diff --git a/samples/Terra/testrequire.t b/samples/Terra/testrequire.t new file mode 100644 index 00000000..e72084de --- /dev/null +++ b/samples/Terra/testrequire.t @@ -0,0 +1,14 @@ +local f = assert(io.popen("uname", 'r')) +local s = assert(f:read('*a')) +f:close() + +if s~="Darwin\n" then + print("Warning, not running test b/c this isn't a mac") +else + +local A = require("lib.objc") +local B = require("lib.objc") + +assert(A == B) + +end \ No newline at end of file diff --git a/samples/Terra/teststd.t b/samples/Terra/teststd.t new file mode 100644 index 00000000..8df604a9 --- /dev/null +++ b/samples/Terra/teststd.t @@ -0,0 +1,45 @@ +local S = require "std" + +c = global(int,0) + +struct A(S.Object) { + a : int; + b : int[5]; +} +struct C { + a : int +} +struct B(S.Object) { + a : A; + b : A[2]; + c : C[3]; + c2 : C; + c3 : C[2]; +} + +terra A:__destruct() + S.printf("A dtor!\n") + c = c + 1 +end +terra B:__destruct() + c = c + 10 +end +terra foo() + var a = A.salloc() +end + +foo() +assert(c:get() == 1) + +terra bar() + var b = B.salloc() +end +bar() +assert(c:get() == 14) + +terra baz() + var b = B.alloc() + b:delete() +end +baz() +assert(c:get() == 27) \ No newline at end of file diff --git a/samples/Terra/testvector.t b/samples/Terra/testvector.t new file mode 100644 index 00000000..7ba46c2b --- /dev/null +++ b/samples/Terra/testvector.t @@ -0,0 +1,57 @@ + +local S = require "std" + +local floatv = S.Vector(int) +terra foo() + var a = floatv.salloc():init() + for i = 0,100 do + a:insert(i) + end + for i = 0,50 do + a:insert(0,i) + end + for i = 0,50 do + a:insert(1,2,i) + end + for i = 0ULL,a:size() do + a(i) = a(i) + 1 + end + for i = 0ULL,50 do + @a:insert() = 5 + end + var s = 0 + for i = 0ULL,a:size() do + s = s + a(i) + end + var z = a:size() + S.assert(a:remove() == 5) + S.assert(a:size() == z - 1) + S.assert(a:remove(0) == 50) + S.assert(a:remove(0) == 50) + S.assert(a:remove(0) == 50) + S.assert(a(1) == 49) + return s +end +assert(foo() == 8875 + 5 *50) + +local g = global(int,0) + +struct A (S.Object) { + a : int +} + +terra A:__destruct() + g = g + self.a +end + +assert(S.Vector(int) == S.Vector(int)) + +terra foo2() + var a = [S.Vector(A)].salloc():init() + for i = 0,50 do + a:insert().a = i + end +end + +foo2() +assert(g:get() == 49*50/2) \ No newline at end of file diff --git a/samples/Terra/torturechain.t b/samples/Terra/torturechain.t new file mode 100644 index 00000000..91af6a06 --- /dev/null +++ b/samples/Terra/torturechain.t @@ -0,0 +1,67 @@ + +terra foo() + return 8.0,9 +end + +local torturechain = quote + var a = 3.0 +in + [quote + var b = 4 + in + [quote + var c = 5.0 + in + a,b,c, [quote + var d = 6 + in + [quote + var e = 7.0 + in + d,e,foo() + end] + end] + end] + end] +end + +terra bindit() + var a,b,c,r1 = torturechain + var d,e,r2 = r1 + var f,g = r2 + return a + b + c + d + e + f + g +end + +local sum = 3+4+5+6+7+8+9 +assert(sum == bindit()) + +terra foo(z : int, a : int, b : int, c : int, d : int, e : int, f : int, g : int) + return z + a + b + c + d + e + f + g +end + + +terra overloadit(a : int, b : int, c : int, d : int, e : int, f : int) + return 0 +end + +terra overloadit(a : double, b : int, c : int, d : int, e : int, f : int) + return 1 +end + + +terra callit() + var a,b,c,r1 = torturechain + var d,e,r2 = r1 + var f,g = r2 + return foo(0,a,b,c,d,e,f,g) +end + +terra callol() + var a,b,c,r1 = torturechain + var d,e,r2 = r1 + var f,g = r2 + return overloadit(a,b,c,e,f,g) +end + +assert(callit() == sum) +assert(callol() == 1) diff --git a/samples/Terra/toterraexpression.t b/samples/Terra/toterraexpression.t new file mode 100644 index 00000000..ba31fb7a --- /dev/null +++ b/samples/Terra/toterraexpression.t @@ -0,0 +1,8 @@ +local x = setmetatable({a = 4}, { __toterraexpression = function(self) return self.a end}) + + +local terra foo() + return x +end + +assert(foo() == 4) \ No newline at end of file diff --git a/samples/Terra/twolang.t b/samples/Terra/twolang.t new file mode 100644 index 00000000..fddc25e6 --- /dev/null +++ b/samples/Terra/twolang.t @@ -0,0 +1,23 @@ + +do +import "lib/foolang" +a = foo bar +import "lib/barlang" +b = bar foo +assert( foo bar + bar foo == 3) +assert(a + b == 3) +end + +local function failparse(str,match) + local r,msg = terralib.loadstring(str) + assert(not r) + local match = msg:match(match) + if not match then print(msg) end + assert(match) +end + +failparse("return (foo bar + bar foo)", "near 'bar'") +failparse('import "lib/foolang";return (foo bar + bar foo)', "near foo") +failparse('import "lib/foolang"; import "lib/foolang";',"entrypoint 'foo' already defined") + +do import "lib/foolang" end do import "lib/foolang" end \ No newline at end of file diff --git a/samples/Terra/typeexp.t b/samples/Terra/typeexp.t new file mode 100644 index 00000000..6f29586e --- /dev/null +++ b/samples/Terra/typeexp.t @@ -0,0 +1,9 @@ +atype = int +terra foo(a : atype) + var b : &atype = &a + return @b +end + +local test = require("test") + +test.eq(foo(3),3) \ No newline at end of file diff --git a/samples/Terra/union.t b/samples/Terra/union.t new file mode 100644 index 00000000..eb18b998 --- /dev/null +++ b/samples/Terra/union.t @@ -0,0 +1,26 @@ + +struct A { a : int, union { c : int8[6], b : int }, d : float, union { e : int, f : float }, g : int } +struct B { union { b : int , c : int8[6] }, a : int } +local C = struct { union { union { b : int} , c : int8[6] }, w : int } +terra foo() + var a : A + var b : B + var c : C + a.b = 4 + a.a = 5 + a.c[4] = 3 + a.d = 4 + return a.a + a.b + a.c[4] + a.d +end + +struct Stuff { union { a : int, b : float } } + +terra what() + var a : Stuff, b : Stuff + a.a,b.a = 3,4 + return a.b/b.b --== .75, this is the best bad interview question +end + +local test = require("test") +test.eq(foo(),16) +test.eq(what(),.75) \ No newline at end of file diff --git a/samples/Terra/unm.t b/samples/Terra/unm.t new file mode 100644 index 00000000..665e2060 --- /dev/null +++ b/samples/Terra/unm.t @@ -0,0 +1,20 @@ + + +struct A { + a : int +} + +A.metamethods.__unm = terra(self : &A) + return A { -self.a } +end + +A.metamethods.__sub = terra(self : &A, rhs : &A) + return A { self.a - rhs.a } +end + +terra doit() + var a,b = A { 1 } , A { 2 } + return (-(a - b)).a +end + +assert(doit() == 1) \ No newline at end of file diff --git a/samples/Terra/unpacktuple.t b/samples/Terra/unpacktuple.t new file mode 100644 index 00000000..7701455f --- /dev/null +++ b/samples/Terra/unpacktuple.t @@ -0,0 +1,30 @@ + + +terra foo() + return 1,2 +end + +terra foo2() + return {a = 1, b = 2} +end + +assert(unpacktuple(1) == 1) +assert(unpacktuple(foo()) == 1) + +assert(unpacktuple(foo(),2) == 2) + +assert(unpacktuple(foo(),nil,1) == 1) +assert(unpacktuple(foo2()).a == 1) + +assert(2 == #{unpacktuple(foo())}) + +assert(1 == #{unpacktuple(foo(),2)}) + +terra usefoo() + var a = foo() + var c,d = unpacktuple(a) + var e = unpacktuple(a,2) + return e +end + +assert(usefoo() == 2) \ No newline at end of file diff --git a/samples/Terra/unsafesym.t b/samples/Terra/unsafesym.t new file mode 100644 index 00000000..c8d2f2f2 --- /dev/null +++ b/samples/Terra/unsafesym.t @@ -0,0 +1,14 @@ + +local mymacro = macro(function(a) + a = a:asvalue() + print(a, terralib.issymbol(a), terralib.unsafetypeofsymbol(a)) + return {} +end) + + + +terra foo(a : int) + mymacro(a) +end + +foo:compile() \ No newline at end of file diff --git a/samples/Terra/unstrict.t b/samples/Terra/unstrict.t new file mode 100644 index 00000000..a4292ec0 --- /dev/null +++ b/samples/Terra/unstrict.t @@ -0,0 +1,5 @@ +Strict.__newindex,Strict.__index = nil,nil + +print(b) +terra foo() end +print(c) \ No newline at end of file diff --git a/samples/Terra/usercast.t b/samples/Terra/usercast.t new file mode 100644 index 00000000..f35bec84 --- /dev/null +++ b/samples/Terra/usercast.t @@ -0,0 +1,24 @@ + +struct A { a : int, b : float } + +function A.metamethods.__cast(from,to,exp) + if from == int and to == A then + return `A {exp, 1.f } + elseif from == float and to == A then + return `A { 1, exp } + end + error("invalid") +end + + +terra moo(a : A) + return a.a + a.b +end + +terra bar() + return moo(1) + moo(1.f) +end + +local test = require("test") + +test.eq(bar(), 4) \ No newline at end of file diff --git a/samples/Terra/varargcstring.t b/samples/Terra/varargcstring.t new file mode 100644 index 00000000..a9406390 --- /dev/null +++ b/samples/Terra/varargcstring.t @@ -0,0 +1,2 @@ +C = terralib.includec("stdio.h") +C.printf("hello, %d\n",3) \ No newline at end of file diff --git a/samples/Terra/vars.t b/samples/Terra/vars.t new file mode 100644 index 00000000..a8f38d3b --- /dev/null +++ b/samples/Terra/vars.t @@ -0,0 +1,23 @@ + + +a = {} +a.b, a.c = global(3),global(double,4) +d = global(5) +--print(a.b) + +--a.b:gettype(nil) + +terra bar() + a.b = a.b + 1 + a.c = a.c + 1 + d = d + 1 +end +terra foo() + return a.b,a.c,d +end + + +local test = require("test") + +bar() +test.meq({4,5,6},foo()) \ No newline at end of file diff --git a/samples/Terra/vars2.t b/samples/Terra/vars2.t new file mode 100644 index 00000000..e3556663 --- /dev/null +++ b/samples/Terra/vars2.t @@ -0,0 +1,17 @@ + +a = global(int) --testing variable with no initializer + + +terra foo() + a = 3 +end + +terra bar() + return a +end + + +local test = require("test") + +foo() +test.eq(bar(),3) \ No newline at end of file diff --git a/samples/Terra/vec.t b/samples/Terra/vec.t new file mode 100644 index 00000000..b3d6790c --- /dev/null +++ b/samples/Terra/vec.t @@ -0,0 +1,27 @@ + +terra foo(a : double) + var v0 : vector(double,3) = a + var v1 : vector(int,3) = 4 + var v2 = v0 / v1 + var v3 = (v0 <= v1) or (v1 >= v0) + var ptr = [&double](&v2) + return v3[0] or v3[1] or v3[2] + --return ptr[0] + ptr[1] + ptr[2] +end + + +N = 64 +terra addsomevecs(a : vector(double,N), b : vector(double,N), c : vector(double,N) ) + return (a + b) / c +end + + +terra foo2(a : double, b : double) + var c = addsomevecs(a,b,b) + return c[0] + c[1] +end + +local test = require("test") + +test.eq(foo(3), true) +test.eq(foo2(3,4), 3.5) \ No newline at end of file diff --git a/samples/Terra/vecarith.t b/samples/Terra/vecarith.t new file mode 100644 index 00000000..6a21b9ba --- /dev/null +++ b/samples/Terra/vecarith.t @@ -0,0 +1,138 @@ +--[[ + +- ++ + +* +/ +% + +^ +and +or +~= == < > >= <= +<< >> + +]] + + +N = 2 + +types = {int,int64,uint64,float,double} +names = {"i","l","u","f","d"} +max = 16 + +for i = 1,#types do + local fenv = getfenv() + for j = 0,max do + local x = global(vector(types[i],N)); + (terra() x = j end)() + fenv[names[i]..j] = x + end +end + + +d375 = global(vector(double,N)) +d175 = global(vector(double,N)) +terra init() + d375 = 3.75 + d175 = 1.75 +end +init() + +terra test0() + var a = i1 + i3 + var b = l1 + l2 + var c = u1 + u2 + var d = f1 + f2 + var e = d1 + d2 + return (a + b + c + d + e)[1] +end + +terra test1() + var a = i1 - i3 + var b = l1 - l2 + var c = u1 - u2 + var d = f1 - f2 + var e = d1 - d2 + return (a - b - c - d - e)[1] +end + +terra test2() + var a = i2 * i3 + var b = l3 * l2 + var c = u3 * u2 + var d = f1 * f2 + var e = d3 * d2 + return (a * b * c * d * e)[1] +end + +terra test3() + var a = i2 / i3 + i1 + var b = l3 / l2 + i1 + var c = u3 / u2 + var d = f1 / f2 + var e = d3 / d2 + return (a * b * c * d * e)[1] +end + +terra test4() + var a = i2 % i3 + var b = l3 % l4 + var c = u3 % u2 + var d = f1 % f2 + var e = d375 % d2 + return ((a == i2) and (b == l3) and (d == f1) and (e == d175))[1] +end + +terra test5() + var a = i2 ^ i3 + var b = l3 ^ l4 + var c = u3 ^ u2 + return ((a == 1) and (b == l7) and (c == u1))[1] +end + +terra test6() + var a = i2 and i3 + var b = l3 and l4 + var c = u3 and u2 + return ((a == 2) and (b == l0) and (c == u2))[1] +end + +terra test7() + var a = i2 or i3 + var b = l3 or l4 + var c = u3 or u2 + return ((a == 3) and (b == l7) and (c == u3))[1] +end + + +terra test8() + var a0,a1 = i2 ~= i3, i2 == i3 + var b0,b1 = i2 < i3, i2 >= i3 + var c0,c1 = i2 > i3, i2 <= i3 + + return (a0 and not a1 and b0 and not b1 and not c0 and c1)[1] +end + +terra test9() + var a0, a1 = i8 >> i1, i8 << i1 + var b0, b1 = -i8 >> i1, -i8 << i1 + return (a0 == i4 and a1 == i16 and b0 == -i4 and b1 == -i16)[1] +end + + +local test = require("test") + +test.eq(test0(),16) +test.eq(test1(),2) +test.eq(test2(),2592) +test.eq(test3(),1.5) + +test.eq(test4(),true) + +test.eq(test5(),true) +test.eq(test6(),true) +test.eq(test7(),true) +test.eq(test8(),true) +test.eq(test9(),true) \ No newline at end of file diff --git a/samples/Terra/veclit.t b/samples/Terra/veclit.t new file mode 100644 index 00000000..20e9aee8 --- /dev/null +++ b/samples/Terra/veclit.t @@ -0,0 +1,29 @@ + +terra foo() + var a = 2* vector(1,2,3) + return a[0] + a[1] + a[2] +end + +terra foo2() + var a = vector(1,2.5,3) + return a[1] +end +terra what() + return 3,4.5 +end +expwhat = macro(function(a) return {`a._0, `a._1} end) +terra foo3() + var a = vector(1,2.5,expwhat(what())) + return a[3] +end + +terra foo4() + var a = vectorof(int,1,2.5,3) + return a[1] +end + +local test = require("test") +test.eq(foo(),12) +test.eq(foo2(),2.5) +test.eq(foo3(),4.5) +test.eq(foo4(),2) \ No newline at end of file diff --git a/samples/Terra/vecobj.t b/samples/Terra/vecobj.t new file mode 100644 index 00000000..59eab9fa --- /dev/null +++ b/samples/Terra/vecobj.t @@ -0,0 +1,54 @@ +local Vec = terralib.memoize(function(typ,N) + N = assert(tonumber(N),"expected a number") + local ops = { "__sub","__add","__mul","__div" } + local struct VecType { + data : typ[N] + } + VecType.metamethods.type, VecType.metamethods.N = typ,N + VecType.metamethods.__typename = function(self) return ("%s_%d"):format(tostring(self.metamethods.type),self.metamethods.N) end + for i, op in ipairs(ops) do + local i = symbol("i") + local function template(ae,be) + return quote + var c : VecType + for [i] = 0,N do + c.data[i] = operator(op,ae,be) + end + return c + end + end + local terra doop(a : VecType, b : VecType) [template(`a.data[i],`b.data[i])] end + terra doop(a : typ, b : VecType) [template(`a,`b.data[i])] end + terra doop(a : VecType, b : typ) [template(`a.data[i],`b)] end + VecType.metamethods[op] = doop + end + terra VecType.methods.FromConstant(x : typ) + var c : VecType + for i = 0,N do + c.data[i] = x + end + return c + end + VecType.metamethods.__apply = macro(function(self,idx) return `self.data[idx] end) + VecType.metamethods.__cast = function(from,to,exp) + if from:isarithmetic() and to == VecType then + return `VecType.FromConstant(exp) + end + error(("unknown conversion %s to %s"):format(tostring(from),tostring(to))) + end + return VecType +end) + +terra foo(v : Vec(float,4), w : Vec(float,4)) + var z : Vec(float,4) = 1 + var x = (v*4)+w+1 + for i = 0,4 do + print(x(i)) + end + return x(2) +end + +foo:printpretty(true,false) +foo:disas() + +assert(20 == foo({{1,2,3,4}},{{5,6,7,8}})) \ No newline at end of file diff --git a/samples/Terra/vecptr.t b/samples/Terra/vecptr.t new file mode 100644 index 00000000..c853065f --- /dev/null +++ b/samples/Terra/vecptr.t @@ -0,0 +1,4 @@ +terra foo(a : &float) + var b = [&vector(float,4)](a) +end +foo:compile() \ No newline at end of file diff --git a/samples/Terra/vecsize.t b/samples/Terra/vecsize.t new file mode 100644 index 00000000..08043aee --- /dev/null +++ b/samples/Terra/vecsize.t @@ -0,0 +1,5 @@ + +assert(terralib.sizeof(int)*3 <= terralib.sizeof(vector(int,3))) +assert(terralib.sizeof(vector(int,1)) == 4) +assert(terralib.sizeof(vector(int,4)) == 16) +assert(terralib.sizeof(vector(int,5)) == 32) \ No newline at end of file diff --git a/samples/Terra/vtablerec.t b/samples/Terra/vtablerec.t new file mode 100644 index 00000000..75e9ea56 --- /dev/null +++ b/samples/Terra/vtablerec.t @@ -0,0 +1,30 @@ + +struct V { + entry : {&A} -> {} +} and +struct A { + vtable : &V +} + +terra what(a : &A) : {} +end + +what:compile() + +terra bar() + var v : V + v.entry = what +end + +bar:compile() + +--[[ +{&A}->{} +&A +A +&V +V +&{&A}->{} +{&A}->{} + +]] \ No newline at end of file diff --git a/samples/Terra/zeroargs.t b/samples/Terra/zeroargs.t new file mode 100644 index 00000000..59b4356d --- /dev/null +++ b/samples/Terra/zeroargs.t @@ -0,0 +1,5 @@ +local b = {} +terra foo() + return 1,b +end +foo() \ No newline at end of file diff --git a/samples/Terra/zeroreturn.t b/samples/Terra/zeroreturn.t new file mode 100644 index 00000000..406a3245 --- /dev/null +++ b/samples/Terra/zeroreturn.t @@ -0,0 +1,18 @@ + + +local b = global(0) + +terra foo(a : int) + if a > 3 then + return + end + b = a +end + +terra getb() return b end + +local test = require("test") +foo(4) +test.eq(getb(),0) +foo(2) +test.eq(getb(),2) \ No newline at end of file diff --git a/samples/Terra/zeroreturn2.t b/samples/Terra/zeroreturn2.t new file mode 100644 index 00000000..82f8e6df --- /dev/null +++ b/samples/Terra/zeroreturn2.t @@ -0,0 +1,17 @@ + +a = global(0) + +terra doit() + a = a + 1 +end +terra geta() + return a +end + +terra bar() + return doit() +end + +bar() +local test = require("test") +test.eq(geta(),1) \ No newline at end of file From 721e5b4656571000b8a184f53ddc62fd29e9f8ac Mon Sep 17 00:00:00 2001 From: Abigail Date: Thu, 28 Jan 2016 11:41:35 +0000 Subject: [PATCH 150/205] Add detection of GrammarKit-generated files GrammarKit is a plugin by JetBrains for creating custom language plugins for JetBrains IDEs (such as IntelliJ, RubyMine, CLion and more). It defines a BNF parser language which can be used to generate a parser in Java, and it also integrates JFLex for generating a lexer in Java. Both of these generated Java files can be recognised by a comment on the first line of the file, and so classifying them as generated is trivial. --- lib/linguist/generated.rb | 31 +- samples/Java/GrammarKit.java | 625 +++++++++++++++++++++++++++++++++++ samples/Java/JFlexLexer.java | 482 +++++++++++++++++++++++++++ test/test_generated.rb | 6 + 4 files changed, 1143 insertions(+), 1 deletion(-) create mode 100644 samples/Java/GrammarKit.java create mode 100644 samples/Java/JFlexLexer.java diff --git a/lib/linguist/generated.rb b/lib/linguist/generated.rb index 35766e4d..7747406f 100644 --- a/lib/linguist/generated.rb +++ b/lib/linguist/generated.rb @@ -72,7 +72,9 @@ module Linguist vcr_cassette? || generated_module? || generated_unity3d_meta? || - generated_racc? + generated_racc? || + generated_jflex? || + generated_grammarkit? end # Internal: Is the blob an Xcode file? @@ -373,5 +375,32 @@ module Linguist return false unless lines.count > 2 return lines[2].start_with?("# This file is automatically generated by Racc") end + + # Internal: Is this a JFlex-generated file? + # + # A JFlex-generated file contains: + # /* The following code was generated by JFlex x.y.z on d/at/e ti:me */ + # on the first line. + # + # Return true or false + def generated_jflex? + return false unless extname == '.java' + return false unless lines.count > 1 + return lines[0].start_with?("/* The following code was generated by JFlex ") + end + + # Internal: Is this a GrammarKit-generated file? + # + # A GrammarKit-generated file typically contain: + # // This is a generated file. Not intended for manual editing. + # on the first line. This is not always the case, as it's possible to + # customize the class header. + # + # Return true or false + def generated_grammarkit? + return false unless extname == '.java' + return false unless lines.count > 1 + return lines[0].start_with?("// This is a generated file. Not intended for manual editing.") + end end end diff --git a/samples/Java/GrammarKit.java b/samples/Java/GrammarKit.java new file mode 100644 index 00000000..a5db6da8 --- /dev/null +++ b/samples/Java/GrammarKit.java @@ -0,0 +1,625 @@ +// This is a generated file. Not intended for manual editing. +package org.intellij.grammar.parser; + +import com.intellij.lang.PsiBuilder; +import com.intellij.lang.PsiBuilder.Marker; +import static org.intellij.grammar.psi.BnfTypes.*; +import static org.intellij.grammar.parser.GeneratedParserUtilBase.*; +import com.intellij.psi.tree.IElementType; +import com.intellij.lang.ASTNode; +import com.intellij.psi.tree.TokenSet; +import com.intellij.lang.PsiParser; +import com.intellij.lang.LightPsiParser; + +@SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"}) +public class GrammarParser implements PsiParser, LightPsiParser { + + public ASTNode parse(IElementType t, PsiBuilder b) { + parseLight(t, b); + return b.getTreeBuilt(); + } + + public void parseLight(IElementType t, PsiBuilder b) { + boolean r; + b = adapt_builder_(t, b, this, EXTENDS_SETS_); + Marker m = enter_section_(b, 0, _COLLAPSE_, null); + if (t == BNF_ATTR) { + r = attr(b, 0); + } + else if (t == BNF_ATTR_PATTERN) { + r = attr_pattern(b, 0); + } + else if (t == BNF_ATTR_VALUE) { + r = attr_value(b, 0); + } + else if (t == BNF_ATTRS) { + r = attrs(b, 0); + } + else if (t == BNF_CHOICE) { + r = choice(b, 0); + } + else if (t == BNF_EXPRESSION) { + r = expression(b, 0); + } + else if (t == BNF_LITERAL_EXPRESSION) { + r = literal_expression(b, 0); + } + else if (t == BNF_MODIFIER) { + r = modifier(b, 0); + } + else if (t == BNF_PAREN_EXPRESSION) { + r = paren_expression(b, 0); + } + else if (t == BNF_PREDICATE) { + r = predicate(b, 0); + } + else if (t == BNF_PREDICATE_SIGN) { + r = predicate_sign(b, 0); + } + else if (t == BNF_QUANTIFIED) { + r = quantified(b, 0); + } + else if (t == BNF_QUANTIFIER) { + r = quantifier(b, 0); + } + else if (t == BNF_REFERENCE_OR_TOKEN) { + r = reference_or_token(b, 0); + } + else if (t == BNF_RULE) { + r = rule(b, 0); + } + else if (t == BNF_SEQUENCE) { + r = sequence(b, 0); + } + else if (t == BNF_STRING_LITERAL_EXPRESSION) { + r = string_literal_expression(b, 0); + } + else { + r = parse_root_(t, b, 0); + } + exit_section_(b, 0, m, t, r, true, TRUE_CONDITION); + } + + protected boolean parse_root_(IElementType t, PsiBuilder b, int l) { + return grammar(b, l + 1); + } + + public static final TokenSet[] EXTENDS_SETS_ = new TokenSet[] { + create_token_set_(BNF_LITERAL_EXPRESSION, BNF_STRING_LITERAL_EXPRESSION), + create_token_set_(BNF_CHOICE, BNF_EXPRESSION, BNF_LITERAL_EXPRESSION, BNF_PAREN_EXPRESSION, + BNF_PREDICATE, BNF_QUANTIFIED, BNF_REFERENCE_OR_TOKEN, BNF_SEQUENCE, + BNF_STRING_LITERAL_EXPRESSION), + }; + + /* ********************************************************** */ + // id attr_pattern? '=' attr_value ';'? + public static boolean attr(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "attr")) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_, ""); + r = consumeToken(b, BNF_ID); + p = r; // pin = 1 + r = r && report_error_(b, attr_1(b, l + 1)); + r = p && report_error_(b, consumeToken(b, BNF_OP_EQ)) && r; + r = p && report_error_(b, attr_value(b, l + 1)) && r; + r = p && attr_4(b, l + 1) && r; + exit_section_(b, l, m, BNF_ATTR, r, p, attr_recover_until_parser_); + return r || p; + } + + // attr_pattern? + private static boolean attr_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "attr_1")) return false; + attr_pattern(b, l + 1); + return true; + } + + // ';'? + private static boolean attr_4(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "attr_4")) return false; + consumeToken(b, BNF_SEMICOLON); + return true; + } + + /* ********************************************************** */ + // '(' string ')' + public static boolean attr_pattern(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "attr_pattern")) return false; + if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, BNF_LEFT_PAREN); + r = r && consumeToken(b, BNF_STRING); + r = r && consumeToken(b, BNF_RIGHT_PAREN); + exit_section_(b, m, BNF_ATTR_PATTERN, r); + return r; + } + + /* ********************************************************** */ + // !'}' + static boolean attr_recover_until(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "attr_recover_until")) return false; + boolean r; + Marker m = enter_section_(b, l, _NOT_, null); + r = !consumeToken(b, BNF_RIGHT_BRACE); + exit_section_(b, l, m, null, r, false, null); + return r; + } + + /* ********************************************************** */ + // (reference_or_token | literal_expression) !'=' + public static boolean attr_value(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "attr_value")) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, ""); + r = attr_value_0(b, l + 1); + r = r && attr_value_1(b, l + 1); + exit_section_(b, l, m, BNF_ATTR_VALUE, r, false, null); + return r; + } + + // reference_or_token | literal_expression + private static boolean attr_value_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "attr_value_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = reference_or_token(b, l + 1); + if (!r) r = literal_expression(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // !'=' + private static boolean attr_value_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "attr_value_1")) return false; + boolean r; + Marker m = enter_section_(b, l, _NOT_, null); + r = !consumeToken(b, BNF_OP_EQ); + exit_section_(b, l, m, null, r, false, null); + return r; + } + + /* ********************************************************** */ + // '{' attr* '}' + public static boolean attrs(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "attrs")) return false; + if (!nextTokenIs(b, BNF_LEFT_BRACE)) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_, null); + r = consumeToken(b, BNF_LEFT_BRACE); + p = r; // pin = 1 + r = r && report_error_(b, attrs_1(b, l + 1)); + r = p && consumeToken(b, BNF_RIGHT_BRACE) && r; + exit_section_(b, l, m, BNF_ATTRS, r, p, null); + return r || p; + } + + // attr* + private static boolean attrs_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "attrs_1")) return false; + int c = current_position_(b); + while (true) { + if (!attr(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "attrs_1", c)) break; + c = current_position_(b); + } + return true; + } + + /* ********************************************************** */ + // '{' sequence ('|' sequence)* '}' | sequence choice_tail* + public static boolean choice(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "choice")) return false; + boolean r; + Marker m = enter_section_(b, l, _COLLAPSE_, ""); + r = choice_0(b, l + 1); + if (!r) r = choice_1(b, l + 1); + exit_section_(b, l, m, BNF_CHOICE, r, false, null); + return r; + } + + // '{' sequence ('|' sequence)* '}' + private static boolean choice_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "choice_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, BNF_LEFT_BRACE); + r = r && sequence(b, l + 1); + r = r && choice_0_2(b, l + 1); + r = r && consumeToken(b, BNF_RIGHT_BRACE); + exit_section_(b, m, null, r); + return r; + } + + // ('|' sequence)* + private static boolean choice_0_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "choice_0_2")) return false; + int c = current_position_(b); + while (true) { + if (!choice_0_2_0(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "choice_0_2", c)) break; + c = current_position_(b); + } + return true; + } + + // '|' sequence + private static boolean choice_0_2_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "choice_0_2_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, BNF_OP_OR); + r = r && sequence(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // sequence choice_tail* + private static boolean choice_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "choice_1")) return false; + boolean r; + Marker m = enter_section_(b); + r = sequence(b, l + 1); + r = r && choice_1_1(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // choice_tail* + private static boolean choice_1_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "choice_1_1")) return false; + int c = current_position_(b); + while (true) { + if (!choice_tail(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "choice_1_1", c)) break; + c = current_position_(b); + } + return true; + } + + /* ********************************************************** */ + // '|' sequence + static boolean choice_tail(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "choice_tail")) return false; + if (!nextTokenIs(b, BNF_OP_OR)) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_, null); + r = consumeToken(b, BNF_OP_OR); + p = r; // pin = 1 + r = r && sequence(b, l + 1); + exit_section_(b, l, m, null, r, p, null); + return r || p; + } + + /* ********************************************************** */ + // choice? + public static boolean expression(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "expression")) return false; + Marker m = enter_section_(b, l, _COLLAPSE_, ""); + choice(b, l + 1); + exit_section_(b, l, m, BNF_EXPRESSION, true, false, null); + return true; + } + + /* ********************************************************** */ + // (attrs | rule) * + static boolean grammar(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "grammar")) return false; + int c = current_position_(b); + while (true) { + if (!grammar_0(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "grammar", c)) break; + c = current_position_(b); + } + return true; + } + + // attrs | rule + private static boolean grammar_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "grammar_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = attrs(b, l + 1); + if (!r) r = rule(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + /* ********************************************************** */ + // string_literal_expression | number + public static boolean literal_expression(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "literal_expression")) return false; + if (!nextTokenIs(b, "", BNF_NUMBER, BNF_STRING)) return false; + boolean r; + Marker m = enter_section_(b, l, _COLLAPSE_, ""); + r = string_literal_expression(b, l + 1); + if (!r) r = consumeToken(b, BNF_NUMBER); + exit_section_(b, l, m, BNF_LITERAL_EXPRESSION, r, false, null); + return r; + } + + /* ********************************************************** */ + // 'private' | 'external' | 'wrapped' + public static boolean modifier(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "modifier")) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, ""); + r = consumeToken(b, "private"); + if (!r) r = consumeToken(b, "external"); + if (!r) r = consumeToken(b, "wrapped"); + exit_section_(b, l, m, BNF_MODIFIER, r, false, null); + return r; + } + + /* ********************************************************** */ + // quantified | predicate + static boolean option(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "option")) return false; + boolean r; + Marker m = enter_section_(b); + r = quantified(b, l + 1); + if (!r) r = predicate(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + /* ********************************************************** */ + // '(' expression ')' + public static boolean paren_expression(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "paren_expression")) return false; + if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_, null); + r = consumeToken(b, BNF_LEFT_PAREN); + p = r; // pin = 1 + r = r && report_error_(b, expression(b, l + 1)); + r = p && consumeToken(b, BNF_RIGHT_PAREN) && r; + exit_section_(b, l, m, BNF_PAREN_EXPRESSION, r, p, null); + return r || p; + } + + /* ********************************************************** */ + // predicate_sign simple + public static boolean predicate(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "predicate")) return false; + if (!nextTokenIs(b, "", BNF_OP_NOT, BNF_OP_AND)) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, ""); + r = predicate_sign(b, l + 1); + r = r && simple(b, l + 1); + exit_section_(b, l, m, BNF_PREDICATE, r, false, null); + return r; + } + + /* ********************************************************** */ + // '&' | '!' + public static boolean predicate_sign(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "predicate_sign")) return false; + if (!nextTokenIs(b, "", BNF_OP_NOT, BNF_OP_AND)) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, ""); + r = consumeToken(b, BNF_OP_AND); + if (!r) r = consumeToken(b, BNF_OP_NOT); + exit_section_(b, l, m, BNF_PREDICATE_SIGN, r, false, null); + return r; + } + + /* ********************************************************** */ + // '[' expression ']' | simple quantifier? + public static boolean quantified(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "quantified")) return false; + boolean r; + Marker m = enter_section_(b, l, _COLLAPSE_, ""); + r = quantified_0(b, l + 1); + if (!r) r = quantified_1(b, l + 1); + exit_section_(b, l, m, BNF_QUANTIFIED, r, false, null); + return r; + } + + // '[' expression ']' + private static boolean quantified_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "quantified_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, BNF_LEFT_BRACKET); + r = r && expression(b, l + 1); + r = r && consumeToken(b, BNF_RIGHT_BRACKET); + exit_section_(b, m, null, r); + return r; + } + + // simple quantifier? + private static boolean quantified_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "quantified_1")) return false; + boolean r; + Marker m = enter_section_(b); + r = simple(b, l + 1); + r = r && quantified_1_1(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // quantifier? + private static boolean quantified_1_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "quantified_1_1")) return false; + quantifier(b, l + 1); + return true; + } + + /* ********************************************************** */ + // '?' | '+' | '*' + public static boolean quantifier(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "quantifier")) return false; + boolean r; + Marker m = enter_section_(b, l, _NONE_, ""); + r = consumeToken(b, BNF_OP_OPT); + if (!r) r = consumeToken(b, BNF_OP_ONEMORE); + if (!r) r = consumeToken(b, BNF_OP_ZEROMORE); + exit_section_(b, l, m, BNF_QUANTIFIER, r, false, null); + return r; + } + + /* ********************************************************** */ + // id + public static boolean reference_or_token(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "reference_or_token")) return false; + if (!nextTokenIs(b, BNF_ID)) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, BNF_ID); + exit_section_(b, m, BNF_REFERENCE_OR_TOKEN, r); + return r; + } + + /* ********************************************************** */ + // modifier* id '::=' expression attrs? ';'? + public static boolean rule(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "rule")) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_, ""); + r = rule_0(b, l + 1); + r = r && consumeToken(b, BNF_ID); + r = r && consumeToken(b, BNF_OP_IS); + p = r; // pin = 3 + r = r && report_error_(b, expression(b, l + 1)); + r = p && report_error_(b, rule_4(b, l + 1)) && r; + r = p && rule_5(b, l + 1) && r; + exit_section_(b, l, m, BNF_RULE, r, p, rule_recover_until_parser_); + return r || p; + } + + // modifier* + private static boolean rule_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "rule_0")) return false; + int c = current_position_(b); + while (true) { + if (!modifier(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "rule_0", c)) break; + c = current_position_(b); + } + return true; + } + + // attrs? + private static boolean rule_4(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "rule_4")) return false; + attrs(b, l + 1); + return true; + } + + // ';'? + private static boolean rule_5(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "rule_5")) return false; + consumeToken(b, BNF_SEMICOLON); + return true; + } + + /* ********************************************************** */ + // !'{' + static boolean rule_recover_until(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "rule_recover_until")) return false; + boolean r; + Marker m = enter_section_(b, l, _NOT_, null); + r = !consumeToken(b, BNF_LEFT_BRACE); + exit_section_(b, l, m, null, r, false, null); + return r; + } + + /* ********************************************************** */ + // option + + public static boolean sequence(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "sequence")) return false; + boolean r; + Marker m = enter_section_(b, l, _COLLAPSE_, ""); + r = option(b, l + 1); + int c = current_position_(b); + while (r) { + if (!option(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "sequence", c)) break; + c = current_position_(b); + } + exit_section_(b, l, m, BNF_SEQUENCE, r, false, null); + return r; + } + + /* ********************************************************** */ + // !(modifier* id '::=' ) reference_or_token | literal_expression | paren_expression + static boolean simple(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "simple")) return false; + boolean r; + Marker m = enter_section_(b); + r = simple_0(b, l + 1); + if (!r) r = literal_expression(b, l + 1); + if (!r) r = paren_expression(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // !(modifier* id '::=' ) reference_or_token + private static boolean simple_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "simple_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = simple_0_0(b, l + 1); + r = r && reference_or_token(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // !(modifier* id '::=' ) + private static boolean simple_0_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "simple_0_0")) return false; + boolean r; + Marker m = enter_section_(b, l, _NOT_, null); + r = !simple_0_0_0(b, l + 1); + exit_section_(b, l, m, null, r, false, null); + return r; + } + + // modifier* id '::=' + private static boolean simple_0_0_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "simple_0_0_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = simple_0_0_0_0(b, l + 1); + r = r && consumeToken(b, BNF_ID); + r = r && consumeToken(b, BNF_OP_IS); + exit_section_(b, m, null, r); + return r; + } + + // modifier* + private static boolean simple_0_0_0_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "simple_0_0_0_0")) return false; + int c = current_position_(b); + while (true) { + if (!modifier(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "simple_0_0_0_0", c)) break; + c = current_position_(b); + } + return true; + } + + /* ********************************************************** */ + // string + public static boolean string_literal_expression(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "string_literal_expression")) return false; + if (!nextTokenIs(b, BNF_STRING)) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, BNF_STRING); + exit_section_(b, m, BNF_STRING_LITERAL_EXPRESSION, r); + return r; + } + + final static Parser attr_recover_until_parser_ = new Parser() { + public boolean parse(PsiBuilder b, int l) { + return attr_recover_until(b, l + 1); + } + }; + final static Parser rule_recover_until_parser_ = new Parser() { + public boolean parse(PsiBuilder b, int l) { + return rule_recover_until(b, l + 1); + } + }; +} diff --git a/samples/Java/JFlexLexer.java b/samples/Java/JFlexLexer.java new file mode 100644 index 00000000..e54564fb --- /dev/null +++ b/samples/Java/JFlexLexer.java @@ -0,0 +1,482 @@ +/* The following code was generated by JFlex 1.4.3 on 28/01/16 11:27 */ + +package test; +import com.intellij.lexer.*; +import com.intellij.psi.tree.IElementType; +import static org.intellij.grammar.psi.BnfTypes.*; + + +/** + * This class is a scanner generated by + * JFlex 1.4.3 + * on 28/01/16 11:27 from the specification file + * /home/abigail/code/intellij-grammar-kit-test/src/test/_GrammarLexer.flex + */ +public class _GrammarLexer implements FlexLexer { + /** initial size of the lookahead buffer */ + private static final int ZZ_BUFFERSIZE = 16384; + + /** lexical states */ + public static final int YYINITIAL = 0; + + /** + * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l + * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l + * at the beginning of a line + * l is of the form l = 2*k, k a non negative integer + */ + private static final int ZZ_LEXSTATE[] = { + 0, 0 + }; + + /** + * Translates characters to character classes + */ + private static final String ZZ_CMAP_PACKED = + "\11\0\1\1\1\1\1\0\1\1\1\1\22\0\1\1\101\0\1\13"+ + "\1\0\1\3\1\14\1\0\1\10\1\0\1\2\3\0\1\12\1\7"+ + "\3\0\1\6\1\4\1\5\1\11\uff8a\0"; + + /** + * Translates characters to character classes + */ + private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED); + + /** + * Translates DFA states to action switch labels. + */ + private static final int [] ZZ_ACTION = zzUnpackAction(); + + private static final String ZZ_ACTION_PACKED_0 = + "\1\0\1\1\1\2\3\1\1\3\10\0\1\4\1\5"; + + private static int [] zzUnpackAction() { + int [] result = new int[17]; + int offset = 0; + offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAction(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /** + * Translates a state to a row index in the transition table + */ + private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); + + private static final String ZZ_ROWMAP_PACKED_0 = + "\0\0\0\15\0\32\0\47\0\64\0\101\0\15\0\116"+ + "\0\133\0\150\0\165\0\202\0\217\0\234\0\251\0\15"+ + "\0\15"; + + private static int [] zzUnpackRowMap() { + int [] result = new int[17]; + int offset = 0; + offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackRowMap(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int high = packed.charAt(i++) << 16; + result[j++] = high | packed.charAt(i++); + } + return j; + } + + /** + * The transition table of the DFA + */ + private static final int [] ZZ_TRANS = zzUnpackTrans(); + + private static final String ZZ_TRANS_PACKED_0 = + "\1\2\1\3\1\4\1\2\1\5\2\2\1\6\5\2"+ + "\16\0\1\3\16\0\1\7\16\0\1\10\20\0\1\11"+ + "\11\0\1\12\20\0\1\13\4\0\1\14\25\0\1\15"+ + "\10\0\1\16\21\0\1\17\10\0\1\20\12\0\1\21"+ + "\6\0"; + + private static int [] zzUnpackTrans() { + int [] result = new int[182]; + int offset = 0; + offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackTrans(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + value--; + do result[j++] = value; while (--count > 0); + } + return j; + } + + + /* error codes */ + private static final int ZZ_UNKNOWN_ERROR = 0; + private static final int ZZ_NO_MATCH = 1; + private static final int ZZ_PUSHBACK_2BIG = 2; + private static final char[] EMPTY_BUFFER = new char[0]; + private static final int YYEOF = -1; + private static java.io.Reader zzReader = null; // Fake + + /* error messages for the codes above */ + private static final String ZZ_ERROR_MSG[] = { + "Unkown internal scanner error", + "Error: could not match input", + "Error: pushback value was too large" + }; + + /** + * ZZ_ATTRIBUTE[aState] contains the attributes of state aState + */ + private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); + + private static final String ZZ_ATTRIBUTE_PACKED_0 = + "\1\0\1\11\4\1\1\11\10\0\2\11"; + + private static int [] zzUnpackAttribute() { + int [] result = new int[17]; + int offset = 0; + offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); + return result; + } + + private static int zzUnpackAttribute(String packed, int offset, int [] result) { + int i = 0; /* index in packed string */ + int j = offset; /* index in unpacked array */ + int l = packed.length(); + while (i < l) { + int count = packed.charAt(i++); + int value = packed.charAt(i++); + do result[j++] = value; while (--count > 0); + } + return j; + } + + /** the current state of the DFA */ + private int zzState; + + /** the current lexical state */ + private int zzLexicalState = YYINITIAL; + + /** this buffer contains the current text to be matched and is + the source of the yytext() string */ + private CharSequence zzBuffer = ""; + + /** this buffer may contains the current text array to be matched when it is cheap to acquire it */ + private char[] zzBufferArray; + + /** the textposition at the last accepting state */ + private int zzMarkedPos; + + /** the textposition at the last state to be included in yytext */ + private int zzPushbackPos; + + /** the current text position in the buffer */ + private int zzCurrentPos; + + /** startRead marks the beginning of the yytext() string in the buffer */ + private int zzStartRead; + + /** endRead marks the last character in the buffer, that has been read + from input */ + private int zzEndRead; + + /** + * zzAtBOL == true <=> the scanner is currently at the beginning of a line + */ + private boolean zzAtBOL = true; + + /** zzAtEOF == true <=> the scanner is at the EOF */ + private boolean zzAtEOF; + + /* user code: */ + public _GrammarLexer() { + this((java.io.Reader)null); + } + + + /** + * Creates a new scanner + * + * @param in the java.io.Reader to read input from. + */ + public _GrammarLexer(java.io.Reader in) { + this.zzReader = in; + } + + + /** + * Unpacks the compressed character translation table. + * + * @param packed the packed character translation table + * @return the unpacked character translation table + */ + private static char [] zzUnpackCMap(String packed) { + char [] map = new char[0x10000]; + int i = 0; /* index in packed string */ + int j = 0; /* index in unpacked array */ + while (i < 52) { + int count = packed.charAt(i++); + char value = packed.charAt(i++); + do map[j++] = value; while (--count > 0); + } + return map; + } + + public final int getTokenStart(){ + return zzStartRead; + } + + public final int getTokenEnd(){ + return getTokenStart() + yylength(); + } + + public void reset(CharSequence buffer, int start, int end,int initialState){ + zzBuffer = buffer; + zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer); + zzCurrentPos = zzMarkedPos = zzStartRead = start; + zzPushbackPos = 0; + zzAtEOF = false; + zzAtBOL = true; + zzEndRead = end; + yybegin(initialState); + } + + /** + * Refills the input buffer. + * + * @return false, iff there was new input. + * + * @exception java.io.IOException if any I/O-Error occurs + */ + private boolean zzRefill() throws java.io.IOException { + return true; + } + + + /** + * Returns the current lexical state. + */ + public final int yystate() { + return zzLexicalState; + } + + + /** + * Enters a new lexical state + * + * @param newState the new lexical state + */ + public final void yybegin(int newState) { + zzLexicalState = newState; + } + + + /** + * Returns the text matched by the current regular expression. + */ + public final CharSequence yytext() { + return zzBuffer.subSequence(zzStartRead, zzMarkedPos); + } + + + /** + * Returns the character at position pos from the + * matched text. + * + * It is equivalent to yytext().charAt(pos), but faster + * + * @param pos the position of the character to fetch. + * A value from 0 to yylength()-1. + * + * @return the character at position pos + */ + public final char yycharat(int pos) { + return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos); + } + + + /** + * Returns the length of the matched text region. + */ + public final int yylength() { + return zzMarkedPos-zzStartRead; + } + + + /** + * Reports an error that occured while scanning. + * + * In a wellformed scanner (no or only correct usage of + * yypushback(int) and a match-all fallback rule) this method + * will only be called with things that "Can't Possibly Happen". + * If this method is called, something is seriously wrong + * (e.g. a JFlex bug producing a faulty scanner etc.). + * + * Usual syntax/scanner level error handling should be done + * in error fallback rules. + * + * @param errorCode the code of the errormessage to display + */ + private void zzScanError(int errorCode) { + String message; + try { + message = ZZ_ERROR_MSG[errorCode]; + } + catch (ArrayIndexOutOfBoundsException e) { + message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; + } + + throw new Error(message); + } + + + /** + * Pushes the specified amount of characters back into the input stream. + * + * They will be read again by then next call of the scanning method + * + * @param number the number of characters to be read again. + * This number must not be greater than yylength()! + */ + public void yypushback(int number) { + if ( number > yylength() ) + zzScanError(ZZ_PUSHBACK_2BIG); + + zzMarkedPos -= number; + } + + + /** + * Resumes scanning until the next regular expression is matched, + * the end of input is encountered or an I/O-Error occurs. + * + * @return the next token + * @exception java.io.IOException if any I/O-Error occurs + */ + public IElementType advance() throws java.io.IOException { + int zzInput; + int zzAction; + + // cached fields: + int zzCurrentPosL; + int zzMarkedPosL; + int zzEndReadL = zzEndRead; + CharSequence zzBufferL = zzBuffer; + char[] zzBufferArrayL = zzBufferArray; + char [] zzCMapL = ZZ_CMAP; + + int [] zzTransL = ZZ_TRANS; + int [] zzRowMapL = ZZ_ROWMAP; + int [] zzAttrL = ZZ_ATTRIBUTE; + + while (true) { + zzMarkedPosL = zzMarkedPos; + + zzAction = -1; + + zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; + + zzState = ZZ_LEXSTATE[zzLexicalState]; + + + zzForAction: { + while (true) { + + if (zzCurrentPosL < zzEndReadL) + zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++)); + else if (zzAtEOF) { + zzInput = YYEOF; + break zzForAction; + } + else { + // store back cached positions + zzCurrentPos = zzCurrentPosL; + zzMarkedPos = zzMarkedPosL; + boolean eof = zzRefill(); + // get translated positions and possibly new buffer + zzCurrentPosL = zzCurrentPos; + zzMarkedPosL = zzMarkedPos; + zzBufferL = zzBuffer; + zzEndReadL = zzEndRead; + if (eof) { + zzInput = YYEOF; + break zzForAction; + } + else { + zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++)); + } + } + int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; + if (zzNext == -1) break zzForAction; + zzState = zzNext; + + int zzAttributes = zzAttrL[zzState]; + if ( (zzAttributes & 1) == 1 ) { + zzAction = zzState; + zzMarkedPosL = zzCurrentPosL; + if ( (zzAttributes & 8) == 8 ) break zzForAction; + } + + } + } + + // store back cached position + zzMarkedPos = zzMarkedPosL; + + switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { + case 1: + { return com.intellij.psi.TokenType.BAD_CHARACTER; + } + case 6: break; + case 4: + { return BNF_STRING; + } + case 7: break; + case 5: + { return BNF_NUMBER; + } + case 8: break; + case 3: + { return BNF_ID; + } + case 9: break; + case 2: + { return com.intellij.psi.TokenType.WHITE_SPACE; + } + case 10: break; + default: + if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { + zzAtEOF = true; + return null; + } + else { + zzScanError(ZZ_NO_MATCH); + } + } + } + } + + +} diff --git a/test/test_generated.rb b/test/test_generated.rb index 164e1fc2..591f50ed 100644 --- a/test/test_generated.rb +++ b/test/test_generated.rb @@ -69,5 +69,11 @@ class TestGenerated < Minitest::Test # Specflow generated_fixture_without_loading_data("Features/BindingCulture.feature.cs") + + # JFlex + generated_sample_loading_data("Java/JFlexLexer.java") + + # GrammarKit + generated_sample_loading_data("Java/GrammarKit.java") end end From 16d9612603c2ebf670745f2160178d4d0e7cd59c Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sun, 31 Jan 2016 10:29:06 +0100 Subject: [PATCH 151/205] Support for YANG language --- lib/linguist/languages.yml | 7 +++++ samples/YANG/sfc-lisp-impl.yang | 55 +++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 samples/YANG/sfc-lisp-impl.yang diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 306dfe9d..9903f2c9 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3901,6 +3901,13 @@ YAML: - .yaml-tmlanguage ace_mode: yaml +YANG: + type: data + extensions: + - .yang + tm_scope: none + ace_mode: text + Yacc: type: programming extensions: diff --git a/samples/YANG/sfc-lisp-impl.yang b/samples/YANG/sfc-lisp-impl.yang new file mode 100644 index 00000000..761d9829 --- /dev/null +++ b/samples/YANG/sfc-lisp-impl.yang @@ -0,0 +1,55 @@ +module sfc-lisp-impl { + + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:controller:config:sfc-lisp:impl"; + prefix "sfc-lisp-impl"; + + import config { prefix config; revision-date 2013-04-05; } + import rpc-context { prefix rpcx; revision-date 2013-06-17; } + import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; } + + + description + "This module contains the base YANG definitions for + sfc-lisp implementation."; + + revision "2015-04-27" { + description + "Initial revision."; + } + + // This is the definition of the service implementation as a module identity + identity sfc-lisp-impl { + base config:module-type; + + // Specifies the prefix for generated java classes. + config:java-name-prefix SfcLisp; + } + + + // Augments the 'configuration' choice node under modules/module. + augment "/config:modules/config:module/config:configuration" { + case sfc-lisp-impl { + when "/config:modules/config:module/config:type = 'sfc-lisp-impl'"; + + //wires in the data-broker service + container data-broker { + uses config:service-ref { + refine type { + mandatory false; + config:required-identity mdsal:binding-async-data-broker; + } + } + } + + container rpc-registry { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity mdsal:binding-rpc-registry; + } + } + } + } + } +} \ No newline at end of file From b235ed1223a97e6a1bdfa23043b7fa084dfd9804 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sun, 31 Jan 2016 10:31:06 +0100 Subject: [PATCH 152/205] Grammar for YANG from Atom package --- .gitmodules | 3 +++ grammars.yml | 2 ++ lib/linguist/languages.yml | 2 +- vendor/grammars/language-yang | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) create mode 160000 vendor/grammars/language-yang diff --git a/.gitmodules b/.gitmodules index e3dfa2a7..f4d07d4a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -707,3 +707,6 @@ [submodule "vendor/grammars/atom-language-stan"] path = vendor/grammars/atom-language-stan url = https://github.com/jrnold/atom-language-stan +[submodule "vendor/grammars/language-yang"] + path = vendor/grammars/language-yang + url = https://github.com/DzonyKalafut/language-yang.git diff --git a/grammars.yml b/grammars.yml index c8de7b72..8edfce74 100644 --- a/grammars.yml +++ b/grammars.yml @@ -372,6 +372,8 @@ vendor/grammars/language-xbase: - source.harbour vendor/grammars/language-yaml: - source.yaml +vendor/grammars/language-yang/: +- source.yang vendor/grammars/latex.tmbundle: - text.bibtex - text.log.latex diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 9903f2c9..a6813602 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3905,7 +3905,7 @@ YANG: type: data extensions: - .yang - tm_scope: none + tm_scope: source.yang ace_mode: text Yacc: diff --git a/vendor/grammars/language-yang b/vendor/grammars/language-yang new file mode 160000 index 00000000..c2d4a701 --- /dev/null +++ b/vendor/grammars/language-yang @@ -0,0 +1 @@ +Subproject commit c2d4a701d15e0ea7a1cef4f2fe4396b336504d7c From 56af13047c6b6fa791989cf7239784b9398d6de3 Mon Sep 17 00:00:00 2001 From: Bayu Aldi Yansyah Date: Mon, 1 Feb 2016 15:11:24 +0700 Subject: [PATCH 153/205] grammar: add Terra --- .gitmodules | 3 +++ grammars.yml | 2 ++ vendor/grammars/sublime-terra | 1 + 3 files changed, 6 insertions(+) create mode 160000 vendor/grammars/sublime-terra diff --git a/.gitmodules b/.gitmodules index e3dfa2a7..f00d7ebd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -707,3 +707,6 @@ [submodule "vendor/grammars/atom-language-stan"] path = vendor/grammars/atom-language-stan url = https://github.com/jrnold/atom-language-stan +[submodule "vendor/grammars/sublime-terra"] + path = vendor/grammars/sublime-terra + url = https://github.com/pyk/sublime-terra diff --git a/grammars.yml b/grammars.yml index c8de7b72..b4df31de 100644 --- a/grammars.yml +++ b/grammars.yml @@ -541,6 +541,8 @@ vendor/grammars/sublime-spintools/: - source.spin vendor/grammars/sublime-tea: - source.tea +vendor/grammars/sublime-terra: +- source.terra vendor/grammars/sublime-text-ox/: - source.ox vendor/grammars/sublime-text-pig-latin/: diff --git a/vendor/grammars/sublime-terra b/vendor/grammars/sublime-terra new file mode 160000 index 00000000..2a73bf7d --- /dev/null +++ b/vendor/grammars/sublime-terra @@ -0,0 +1 @@ +Subproject commit 2a73bf7dfd996d00d13ee9059b400f65069a6407 From c8ea3fba5a7b772d1f7e6f1b450024f1c9825b01 Mon Sep 17 00:00:00 2001 From: Bayu Aldi Yansyah Date: Mon, 1 Feb 2016 15:11:46 +0700 Subject: [PATCH 154/205] terra use #00004c 3 shades from Lua #000080 http://www.color-hex.com/color/000080 --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 18e98a38..7d419b16 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3512,7 +3512,7 @@ Terra: type: programming extensions: - .t - color: "#0077AA" + color: "#00004c" ace_mode: lua group: Lua interpreters: From 2e9d8f5520a9ad311ef7fd312857724f9f008480 Mon Sep 17 00:00:00 2001 From: Bayu Aldi Yansyah Date: Mon, 1 Feb 2016 16:02:19 +0700 Subject: [PATCH 155/205] samples: remove empty file --- samples/Terra/empty.t | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 samples/Terra/empty.t diff --git a/samples/Terra/empty.t b/samples/Terra/empty.t deleted file mode 100644 index e69de29b..00000000 From c454396c26f2c67570a2b71e08de4504afe3ae08 Mon Sep 17 00:00:00 2001 From: Farbod Salamat-Zadeh Date: Tue, 2 Feb 2016 19:41:05 +0000 Subject: [PATCH 156/205] Add CSV as data type to languages.xml Adds the .csv extension (and also .txt extension) so that this file type is shown when searching on GitHub. --- lib/linguist/languages.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 081da674..c4df6e56 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -474,6 +474,12 @@ CSS: color: "#563d7c" extensions: - .css + +CSV: + type: data + extensions: + - .csv + - .txt Cap'n Proto: type: programming From 7b58b1ea59f82b7229db3e0258cb360a949151b7 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 2 Feb 2016 19:37:35 -0700 Subject: [PATCH 157/205] Adding Perl6-specific grammar. --- .gitmodules | 3 +++ grammars.yml | 4 ++++ lib/linguist/languages.yml | 2 +- vendor/grammars/perl6fe | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) create mode 160000 vendor/grammars/perl6fe diff --git a/.gitmodules b/.gitmodules index f4d07d4a..468dd8b9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -710,3 +710,6 @@ [submodule "vendor/grammars/language-yang"] path = vendor/grammars/language-yang url = https://github.com/DzonyKalafut/language-yang.git +[submodule "vendor/grammars/perl6fe"] + path = vendor/grammars/perl6fe + url = https://github.com/MadcapJake/language-perl6fe.git diff --git a/grammars.yml b/grammars.yml index 8edfce74..4aefd99f 100644 --- a/grammars.yml +++ b/grammars.yml @@ -445,6 +445,10 @@ vendor/grammars/pascal.tmbundle: vendor/grammars/perl.tmbundle/: - source.perl - source.perl.6 +vendor/grammars/perl6fe: +- source.meta-info +- source.perl6fe +- source.regexp.perl6fe vendor/grammars/php-smarty.tmbundle: - text.html.smarty vendor/grammars/php.tmbundle: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 081da674..9faff3af 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2654,7 +2654,7 @@ Perl6: - Rexfile interpreters: - perl6 - tm_scope: source.perl.6 + tm_scope: source.perl6fe ace_mode: perl Pickle: diff --git a/vendor/grammars/perl6fe b/vendor/grammars/perl6fe new file mode 160000 index 00000000..8bcf0980 --- /dev/null +++ b/vendor/grammars/perl6fe @@ -0,0 +1 @@ +Subproject commit 8bcf098074c65aac5a73612e214a3b6eb1b2d5f8 From 9fd80bfd67f8087e4b89dd016cc53ea0a420a566 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 2 Feb 2016 22:38:50 -0700 Subject: [PATCH 158/205] Updating to latest perl6 grammar --- vendor/grammars/perl6fe | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/grammars/perl6fe b/vendor/grammars/perl6fe index 8bcf0980..f433aa1d 160000 --- a/vendor/grammars/perl6fe +++ b/vendor/grammars/perl6fe @@ -1 +1 @@ -Subproject commit 8bcf098074c65aac5a73612e214a3b6eb1b2d5f8 +Subproject commit f433aa1dcade27f6da46c0e14779ed06d922cc20 From eb8eb28ca725e6f1f6e3b7de7c18015c630f6ef1 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 3 Feb 2016 14:19:58 +0100 Subject: [PATCH 159/205] Remove Less grammar --- .gitmodules | 3 --- grammars.yml | 2 -- lib/linguist/languages.yml | 2 +- vendor/grammars/less.tmbundle | 1 - 4 files changed, 1 insertion(+), 7 deletions(-) delete mode 160000 vendor/grammars/less.tmbundle diff --git a/.gitmodules b/.gitmodules index 468dd8b9..e67450e7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -340,9 +340,6 @@ [submodule "vendor/grammars/latex.tmbundle"] path = vendor/grammars/latex.tmbundle url = https://github.com/textmate/latex.tmbundle -[submodule "vendor/grammars/less.tmbundle"] - path = vendor/grammars/less.tmbundle - url = https://github.com/textmate/less.tmbundle [submodule "vendor/grammars/lilypond.tmbundle"] path = vendor/grammars/lilypond.tmbundle url = https://github.com/textmate/lilypond.tmbundle diff --git a/grammars.yml b/grammars.yml index 4aefd99f..d7da2b7c 100644 --- a/grammars.yml +++ b/grammars.yml @@ -381,8 +381,6 @@ vendor/grammars/latex.tmbundle: - text.tex.latex - text.tex.latex.beamer - text.tex.latex.memoir -vendor/grammars/less.tmbundle: -- source.css.less vendor/grammars/lilypond.tmbundle: - source.lilypond vendor/grammars/liquid.tmbundle: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 9faff3af..2b095e3f 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1834,7 +1834,7 @@ Less: group: CSS extensions: - .less - tm_scope: source.css.less + tm_scope: none ace_mode: less color: "#A1D9A1" diff --git a/vendor/grammars/less.tmbundle b/vendor/grammars/less.tmbundle deleted file mode 160000 index 7ef97ad5..00000000 --- a/vendor/grammars/less.tmbundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 7ef97ad5f15d2a136afe4d5cf568fc8ee79675b7 From 889a39534066b711480b21f0156266ed413136b4 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 3 Feb 2016 14:22:23 +0100 Subject: [PATCH 160/205] Grammar for Less from Atom package --- .gitmodules | 3 +++ grammars.yml | 2 ++ lib/linguist/languages.yml | 2 +- vendor/grammars/language-less | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) create mode 160000 vendor/grammars/language-less diff --git a/.gitmodules b/.gitmodules index e67450e7..41e39127 100644 --- a/.gitmodules +++ b/.gitmodules @@ -710,3 +710,6 @@ [submodule "vendor/grammars/perl6fe"] path = vendor/grammars/perl6fe url = https://github.com/MadcapJake/language-perl6fe.git +[submodule "vendor/grammars/language-less"] + path = vendor/grammars/language-less + url = https://github.com/atom/language-less.git diff --git a/grammars.yml b/grammars.yml index d7da2b7c..6139fb0a 100644 --- a/grammars.yml +++ b/grammars.yml @@ -354,6 +354,8 @@ vendor/grammars/language-javascript: vendor/grammars/language-jsoniq/: - source.jq - source.xq +vendor/grammars/language-less/: +- source.css.less vendor/grammars/language-maxscript: - source.maxscript vendor/grammars/language-ncl: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 2b095e3f..9faff3af 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1834,7 +1834,7 @@ Less: group: CSS extensions: - .less - tm_scope: none + tm_scope: source.css.less ace_mode: less color: "#A1D9A1" diff --git a/vendor/grammars/language-less b/vendor/grammars/language-less new file mode 160000 index 00000000..a4ded260 --- /dev/null +++ b/vendor/grammars/language-less @@ -0,0 +1 @@ +Subproject commit a4ded2608cd22b8dba79df2025ad8dcf62158ddb From a0065febe25a4e705367c71492c0e0216c4974ea Mon Sep 17 00:00:00 2001 From: Farbod Salamat-Zadeh Date: Sat, 6 Feb 2016 16:34:33 +0000 Subject: [PATCH 161/205] Add ace_mode and tm_scope for CSV --- lib/linguist/languages.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index c4df6e56..4fe4390e 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -477,6 +477,8 @@ CSS: CSV: type: data + ace_mode: text + tm_scope: none extensions: - .csv - .txt From 7b3efb185fed3f9f00415cd1ec9a967684bdcf07 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Fri, 12 Feb 2016 16:25:05 -0700 Subject: [PATCH 162/205] Updating grammars --- vendor/grammars/Elm.tmLanguage | 2 +- vendor/grammars/Handlebars | 2 +- vendor/grammars/MagicPython | 2 +- vendor/grammars/NimLime | 2 +- vendor/grammars/atom-fsharp | 2 +- vendor/grammars/atom-language-stan | 2 +- vendor/grammars/c.tmbundle | 2 +- vendor/grammars/chapel-tmbundle | 2 +- vendor/grammars/d.tmbundle | 2 +- vendor/grammars/elixir-tmbundle | 2 +- vendor/grammars/factor | 2 +- vendor/grammars/gap-tmbundle | 2 +- vendor/grammars/html.tmbundle | 2 +- vendor/grammars/language-babel | 2 +- vendor/grammars/language-coffee-script | 2 +- vendor/grammars/language-crystal | 2 +- vendor/grammars/language-gfm | 2 +- vendor/grammars/language-javascript | 2 +- vendor/grammars/language-jsoniq | 2 +- vendor/grammars/language-renpy | 2 +- vendor/grammars/language-yaml | 2 +- vendor/grammars/latex.tmbundle | 2 +- vendor/grammars/objective-c.tmbundle | 2 +- vendor/grammars/perl6fe | 2 +- vendor/grammars/php.tmbundle | 2 +- vendor/grammars/powershell | 2 +- vendor/grammars/sublime-nginx | 2 +- vendor/grammars/sublime-pony | 2 +- vendor/grammars/sublime-rust | 2 +- vendor/grammars/sublime-typescript | 2 +- vendor/grammars/sublime_cobol | 2 +- vendor/grammars/swift.tmbundle | 2 +- vendor/grammars/vue-syntax-highlight | 2 +- 33 files changed, 33 insertions(+), 33 deletions(-) diff --git a/vendor/grammars/Elm.tmLanguage b/vendor/grammars/Elm.tmLanguage index 494145bd..437033bd 160000 --- a/vendor/grammars/Elm.tmLanguage +++ b/vendor/grammars/Elm.tmLanguage @@ -1 +1 @@ -Subproject commit 494145bded21fd6e18454d9d9d5aa8b67ced1b96 +Subproject commit 437033bd48350b49bc0dfa734206bfa0ba5de337 diff --git a/vendor/grammars/Handlebars b/vendor/grammars/Handlebars index 7e5396d9..2e9f6884 160000 --- a/vendor/grammars/Handlebars +++ b/vendor/grammars/Handlebars @@ -1 +1 @@ -Subproject commit 7e5396d9be8b05c705be614afb022f755a7edc17 +Subproject commit 2e9f68840073f5a3de13cbfed10e31b199760654 diff --git a/vendor/grammars/MagicPython b/vendor/grammars/MagicPython index d7855f98..82c76aff 160000 --- a/vendor/grammars/MagicPython +++ b/vendor/grammars/MagicPython @@ -1 +1 @@ -Subproject commit d7855f98ce6fbe0703c2753b0deae263a27fd8f8 +Subproject commit 82c76aff704192fb9ed1f505360635f575f13b5a diff --git a/vendor/grammars/NimLime b/vendor/grammars/NimLime index 4e60e565..4db349dd 160000 --- a/vendor/grammars/NimLime +++ b/vendor/grammars/NimLime @@ -1 +1 @@ -Subproject commit 4e60e5657fcddde6bf8b4bce0030ecb3154e7dfa +Subproject commit 4db349dda5219a37e99a0375e2a5d8a001fbf20e diff --git a/vendor/grammars/atom-fsharp b/vendor/grammars/atom-fsharp index 4376748e..13eb4d43 160000 --- a/vendor/grammars/atom-fsharp +++ b/vendor/grammars/atom-fsharp @@ -1 +1 @@ -Subproject commit 4376748ed29b5e104cd0dd807c8c9f09a09ec361 +Subproject commit 13eb4d4347be4e8dd825ba174e4271f9cb0f9cab diff --git a/vendor/grammars/atom-language-stan b/vendor/grammars/atom-language-stan index f6911bef..f8d855ea 160000 --- a/vendor/grammars/atom-language-stan +++ b/vendor/grammars/atom-language-stan @@ -1 +1 @@ -Subproject commit f6911bef091e155098f113ec5aaa89bd55283705 +Subproject commit f8d855eab960b4dd140c0f469a809401544850b8 diff --git a/vendor/grammars/c.tmbundle b/vendor/grammars/c.tmbundle index f1424d49..5b5d3663 160000 --- a/vendor/grammars/c.tmbundle +++ b/vendor/grammars/c.tmbundle @@ -1 +1 @@ -Subproject commit f1424d49dd879f6c5a67d3afe6c48a17f538345a +Subproject commit 5b5d366309e8a549ce6fff5bcd9aa57ffb6dae77 diff --git a/vendor/grammars/chapel-tmbundle b/vendor/grammars/chapel-tmbundle index b657738c..469476b2 160000 --- a/vendor/grammars/chapel-tmbundle +++ b/vendor/grammars/chapel-tmbundle @@ -1 +1 @@ -Subproject commit b657738cc05cddd8d8a20afa307e93e607d17d97 +Subproject commit 469476b285adf6c4a09973fd12e97ec831afd050 diff --git a/vendor/grammars/d.tmbundle b/vendor/grammars/d.tmbundle index e6551b27..bc27d5e5 160000 --- a/vendor/grammars/d.tmbundle +++ b/vendor/grammars/d.tmbundle @@ -1 +1 @@ -Subproject commit e6551b27e30960a272758afb7da323aa402d70e6 +Subproject commit bc27d5e552b28eaceb76cfe93bd7c27a1105b57d diff --git a/vendor/grammars/elixir-tmbundle b/vendor/grammars/elixir-tmbundle index 13d94e0e..a7aa16e3 160000 --- a/vendor/grammars/elixir-tmbundle +++ b/vendor/grammars/elixir-tmbundle @@ -1 +1 @@ -Subproject commit 13d94e0ec98c2447adc80230708afa94012ec825 +Subproject commit a7aa16e349f673d70dd43fcab72e2a3f219cb9d7 diff --git a/vendor/grammars/factor b/vendor/grammars/factor index fffb5014..97d1ec75 160000 --- a/vendor/grammars/factor +++ b/vendor/grammars/factor @@ -1 +1 @@ -Subproject commit fffb501486083871377237b9320159de140a943a +Subproject commit 97d1ec759eb9fa2ace83c62685b6b36faec05981 diff --git a/vendor/grammars/gap-tmbundle b/vendor/grammars/gap-tmbundle index ce4ff698..52c8fafb 160000 --- a/vendor/grammars/gap-tmbundle +++ b/vendor/grammars/gap-tmbundle @@ -1 +1 @@ -Subproject commit ce4ff698ebb4a692f0b9a3ab5e30853b87fd2b34 +Subproject commit 52c8fafb664fb7909223f92403e26fe3bfde0cdc diff --git a/vendor/grammars/html.tmbundle b/vendor/grammars/html.tmbundle index 58640721..7710c79b 160000 --- a/vendor/grammars/html.tmbundle +++ b/vendor/grammars/html.tmbundle @@ -1 +1 @@ -Subproject commit 58640721ca0ea5210786086940f789c299366791 +Subproject commit 7710c79b161314fe937b05b13b1101e78f5dc62e diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel index e63e3e29..e2fd09d7 160000 --- a/vendor/grammars/language-babel +++ b/vendor/grammars/language-babel @@ -1 +1 @@ -Subproject commit e63e3e29e93327e1d0979e3acb37a0e2acc463c0 +Subproject commit e2fd09d7d9caf1f336b3a35581e55387723dcbf3 diff --git a/vendor/grammars/language-coffee-script b/vendor/grammars/language-coffee-script index afa4f6f1..93e935ec 160000 --- a/vendor/grammars/language-coffee-script +++ b/vendor/grammars/language-coffee-script @@ -1 +1 @@ -Subproject commit afa4f6f157e02fd1a635357e8117e4c726a84542 +Subproject commit 93e935ec1d54815c182d683d3dfb9583db4e269b diff --git a/vendor/grammars/language-crystal b/vendor/grammars/language-crystal index 5c0e60fd..f87d6864 160000 --- a/vendor/grammars/language-crystal +++ b/vendor/grammars/language-crystal @@ -1 +1 @@ -Subproject commit 5c0e60fd5323b5f093317ffda9721db3fcd72672 +Subproject commit f87d68645c9a4243a7942e6b414449f1eec8a3e7 diff --git a/vendor/grammars/language-gfm b/vendor/grammars/language-gfm index 6b60f7d8..298a8a3e 160000 --- a/vendor/grammars/language-gfm +++ b/vendor/grammars/language-gfm @@ -1 +1 @@ -Subproject commit 6b60f7d89bb7afc67640d46eb8a7cc83e266b30d +Subproject commit 298a8a3eb180f1fa6b8a8bc77c2147e355c8cafd diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript index 162309ab..f68e4bfe 160000 --- a/vendor/grammars/language-javascript +++ b/vendor/grammars/language-javascript @@ -1 +1 @@ -Subproject commit 162309ab8525c0f1b8602514e6aa347c9889437e +Subproject commit f68e4bfe54a3b9d16450223f401d2fb16453897f diff --git a/vendor/grammars/language-jsoniq b/vendor/grammars/language-jsoniq index 7a971acf..008a2458 160000 --- a/vendor/grammars/language-jsoniq +++ b/vendor/grammars/language-jsoniq @@ -1 +1 @@ -Subproject commit 7a971acf1c2001e6b2e9afc7b69b6ff8a2ae39ce +Subproject commit 008a24589d32a8f8bbd55985d27844a7cda842e5 diff --git a/vendor/grammars/language-renpy b/vendor/grammars/language-renpy index 00e92d74..cc2f1c69 160000 --- a/vendor/grammars/language-renpy +++ b/vendor/grammars/language-renpy @@ -1 +1 @@ -Subproject commit 00e92d7450a97c33b40931113b64034bac27e010 +Subproject commit cc2f1c69f0b1c1d121aa5648422fc70d86dca7cf diff --git a/vendor/grammars/language-yaml b/vendor/grammars/language-yaml index e1d62e5a..249fdeed 160000 --- a/vendor/grammars/language-yaml +++ b/vendor/grammars/language-yaml @@ -1 +1 @@ -Subproject commit e1d62e5aff1c475ea3eedc3b03a52ce0e750ec89 +Subproject commit 249fdeed7877ccdcba123645f32cc6597bce4b37 diff --git a/vendor/grammars/latex.tmbundle b/vendor/grammars/latex.tmbundle index ed94d309..82986b93 160000 --- a/vendor/grammars/latex.tmbundle +++ b/vendor/grammars/latex.tmbundle @@ -1 +1 @@ -Subproject commit ed94d3091501cfc6d9aa293ea241d1c0ad6c6395 +Subproject commit 82986b93a4f4ae7aab52445d8b7742b9af635d05 diff --git a/vendor/grammars/objective-c.tmbundle b/vendor/grammars/objective-c.tmbundle index 1bade8a1..fdcedb95 160000 --- a/vendor/grammars/objective-c.tmbundle +++ b/vendor/grammars/objective-c.tmbundle @@ -1 +1 @@ -Subproject commit 1bade8a1c919c358fc4a6d83ba93e98e419ffede +Subproject commit fdcedb95de8846220c49f769fee91045188767d9 diff --git a/vendor/grammars/perl6fe b/vendor/grammars/perl6fe index f433aa1d..12fa46f7 160000 --- a/vendor/grammars/perl6fe +++ b/vendor/grammars/perl6fe @@ -1 +1 @@ -Subproject commit f433aa1dcade27f6da46c0e14779ed06d922cc20 +Subproject commit 12fa46f7bbf646616df1120ed8cfee3e1fcb75de diff --git a/vendor/grammars/php.tmbundle b/vendor/grammars/php.tmbundle index 2ecaa60d..3ed4837b 160000 --- a/vendor/grammars/php.tmbundle +++ b/vendor/grammars/php.tmbundle @@ -1 +1 @@ -Subproject commit 2ecaa60d92b92d4c07f243207ba1d5b2114bb70a +Subproject commit 3ed4837b43d3f650ebb525b068636281942883a0 diff --git a/vendor/grammars/powershell b/vendor/grammars/powershell index 982ae21d..b4ea52c5 160000 --- a/vendor/grammars/powershell +++ b/vendor/grammars/powershell @@ -1 +1 @@ -Subproject commit 982ae21d54b3affc498131515ebbfca6b186ac16 +Subproject commit b4ea52c51c5111fdda1d24103082d9580472c31b diff --git a/vendor/grammars/sublime-nginx b/vendor/grammars/sublime-nginx index ba28d29d..fcf644ec 160000 --- a/vendor/grammars/sublime-nginx +++ b/vendor/grammars/sublime-nginx @@ -1 +1 @@ -Subproject commit ba28d29de729f01d39a29fa214a6818112b48803 +Subproject commit fcf644ecea021ab8a6bc171f415f8df0b005b31e diff --git a/vendor/grammars/sublime-pony b/vendor/grammars/sublime-pony index 384ba3ed..b5eb8f8e 160000 --- a/vendor/grammars/sublime-pony +++ b/vendor/grammars/sublime-pony @@ -1 +1 @@ -Subproject commit 384ba3ed980189f0cc140d3fb86455f880fffeb0 +Subproject commit b5eb8f8e97e5253de8d81cfa4826cfb5815f2944 diff --git a/vendor/grammars/sublime-rust b/vendor/grammars/sublime-rust index 06a278cc..621e4f61 160000 --- a/vendor/grammars/sublime-rust +++ b/vendor/grammars/sublime-rust @@ -1 +1 @@ -Subproject commit 06a278ccfaf5e542d26a95d66c734b4407bc4912 +Subproject commit 621e4f6117531d8fe299eb5584a6be766df1822e diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript index 0504a558..26fd717a 160000 --- a/vendor/grammars/sublime-typescript +++ b/vendor/grammars/sublime-typescript @@ -1 +1 @@ -Subproject commit 0504a5582b6e5d814630259c87f2d8f8e6027c47 +Subproject commit 26fd717a79d1984e76bbe6d958c5c4bbf0179049 diff --git a/vendor/grammars/sublime_cobol b/vendor/grammars/sublime_cobol index ad15734a..3d2b6dbc 160000 --- a/vendor/grammars/sublime_cobol +++ b/vendor/grammars/sublime_cobol @@ -1 +1 @@ -Subproject commit ad15734a4a9798a006525f53a968565fee1411b1 +Subproject commit 3d2b6dbcd1b27023150ff9d8ab47953706d070b8 diff --git a/vendor/grammars/swift.tmbundle b/vendor/grammars/swift.tmbundle index f5ce5833..32141e91 160000 --- a/vendor/grammars/swift.tmbundle +++ b/vendor/grammars/swift.tmbundle @@ -1 +1 @@ -Subproject commit f5ce5833a914f71aa1ab7df0a262104acd3436ef +Subproject commit 32141e91eeffbbd29482d5b1a0131eec4613e73e diff --git a/vendor/grammars/vue-syntax-highlight b/vendor/grammars/vue-syntax-highlight index a2336ddc..f20c9bab 160000 --- a/vendor/grammars/vue-syntax-highlight +++ b/vendor/grammars/vue-syntax-highlight @@ -1 +1 @@ -Subproject commit a2336ddc7ea01876caa31793f806250cad3b53e6 +Subproject commit f20c9bab7e71738f421e6edc1aab8839ee05d85a From bd95ac0beb4acfb68a505f0a1a5a40b6f00585ad Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Fri, 12 Feb 2016 16:27:29 -0700 Subject: [PATCH 163/205] Bumping version --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index ba44bb5b..bc1707a9 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.7.4" + VERSION = "4.7.5" end From 8de50edb41952b70f44f8199a4995e669c3e5a80 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Fri, 12 Feb 2016 17:05:44 -0700 Subject: [PATCH 164/205] ruby for example --- lib/linguist/strategy/modeline.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/linguist/strategy/modeline.rb b/lib/linguist/strategy/modeline.rb index ece98a1f..eb5a8a5f 100644 --- a/lib/linguist/strategy/modeline.rb +++ b/lib/linguist/strategy/modeline.rb @@ -5,12 +5,12 @@ module Linguist # First form vim modeline # [text]{white}{vi:|vim:|ex:}[white]{options} - # ex: 'vim: syntax=perl' + # ex: 'vim: syntax=ruby' VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i # Second form vim modeline (compatible with some versions of Vi) # [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text] - # ex: 'vim set syntax=perl:' + # ex: 'vim set syntax=ruby:' VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2] From fb9f271720c13f109e34cd818cf8a26b23d821b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Sun, 14 Feb 2016 21:57:02 +0200 Subject: [PATCH 165/205] Shell: Add shell-script alias for recognizing Emacs modelines --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 14519a61..1f04c03c 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3274,6 +3274,7 @@ Shell: color: "#89e051" aliases: - sh + - shell-script - bash - zsh extensions: From 17a946358831a776fcacbe8be7dbed29c2dbac10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Sun, 14 Feb 2016 22:08:21 +0200 Subject: [PATCH 166/205] Makefile: Add Makefile.am and Makefile.in filenames --- lib/linguist/languages.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 14519a61..e1c0f970 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2031,6 +2031,8 @@ Makefile: - Makefile - Makefile.inc - makefile + - Makefile.am + - Makefile.in interpreters: - make ace_mode: makefile From 41713d7719c547278948eae451172100ce4c2c7d Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Thu, 18 Feb 2016 21:41:38 +0000 Subject: [PATCH 167/205] add a sample of FLUX code These samples were taken from the paper "Flux: A Language for Programming High-Performance Servers", by Burns et al and Flux V0.02 which can be found here: https://plasma.cs.umass.edu/emery/flux.1.html --- samples/FLUX/gameserver.fx | 54 +++++++++++++ samples/FLUX/imageserver.fx | 44 +++++++++++ samples/FLUX/mbittorrent.fx | 151 ++++++++++++++++++++++++++++++++++++ samples/FLUX/test.fx | 38 +++++++++ 4 files changed, 287 insertions(+) create mode 100644 samples/FLUX/gameserver.fx create mode 100644 samples/FLUX/imageserver.fx create mode 100644 samples/FLUX/mbittorrent.fx create mode 100644 samples/FLUX/test.fx diff --git a/samples/FLUX/gameserver.fx b/samples/FLUX/gameserver.fx new file mode 100644 index 00000000..9c40d5f1 --- /dev/null +++ b/samples/FLUX/gameserver.fx @@ -0,0 +1,54 @@ +typedef engine isEngineMessage; +typedef turn isTurnMessage; +typedef connect isConnectMessage; +typedef disconnect isDisconnectMessage; + +ClientMessage(char* data) => (); +ParseMessage(char* data) => (int type, int client, char* data); +ReadMessage(int type, int client, char* data) => (); + +ParseEngine(int type, int client, char* data) => (int client, int direction); +DoEngine(int client, int direction) => (); + +ParseTurn(int type, int client, char* data) => (int client, int direction); +DoTurn(int client, int direction) => (); + +ParseConnect(int type, int client, char* data) + => (int client, char* host, int port); +DoConnect(int client, char* host, int port) => (); + +ParseDisconnect(int type, int client, char* data) => (int client); +DoDisconnect(int client) => (); + +UpdateBoard(ClientList clients) => (ClientList clients); +SendData(ClientList clients) => (); + +DoUpdate(ClientList clients) => (); + +DataTimer() => (ClientList clients); + +GetClients() => (ClientList clients); + +Wait(ClientList clients) => (ClientList clients); + +Listen () => (char* data); + +source Listen => ClientMessage; +source DataTimer => DoUpdate; + +DataTimer = GetClients -> Wait; + +DoUpdate = UpdateBoard -> SendData; + +ClientMessage=ParseMessage -> ReadMessage; + +ReadMessage:[engine, _, _] = ParseEngine -> DoEngine; +ReadMessage:[turn, _, _] = ParseTurn -> DoTurn; +ReadMessage:[connect, _, _] = ParseConnect -> DoConnect; +ReadMessage:[disconnect, _, _] = ParseDisconnect -> DoDisconnect; + +atomic GetClients:{client_lock}; +atomic DoConnect:{client_lock}; +atomic DoDisconnect:{client_lock}; + + diff --git a/samples/FLUX/imageserver.fx b/samples/FLUX/imageserver.fx new file mode 100644 index 00000000..effbfaed --- /dev/null +++ b/samples/FLUX/imageserver.fx @@ -0,0 +1,44 @@ +typedef xml TestXML; +typedef html TestHTML; + +typedef inCache TestInCache; + +Page (int socket) => (); + +ReadRequest (int socket) => (int socket, bool close, image_tag *request); + +CheckCache (int socket, bool close, image_tag *request) + => (int socket, bool close, image_tag *request); + +Handler (int socket, bool close, image_tag *request) + => (int socket, bool close, image_tag *request); + +Complete (int socket, bool close, image_tag *request) => (); + +ReadInFromDisk (int socket, bool close, image_tag *request) + => (int socket, bool close, image_tag *request, __u8 *rgb_data); + +Write (int socket, bool close, image_tag *request) + => (int socket, bool close, image_tag *request); + +Compress(int socket, bool close, image_tag *request, __u8 *rgb_data) + => (int socket, bool close, image_tag *request); + +StoreInCache(int socket, bool close, image_tag *request) + => (int socket, bool close, image_tag *request); + +Listen () + => (int socket); + +source Listen => Page; + +Handler:[_, _, inCache]=; +Handler:[_, _, _]=ReadInFromDisk -> Compress -> StoreInCache; + +Page = ReadRequest -> CheckCache-> Handler -> Write -> Complete; + +atomic CheckCache:{cache}; +atomic StoreInCache:{cache}; +atomic Complete:{cache}; + +handle error ReadInFromDisk => FourOhFor; diff --git a/samples/FLUX/mbittorrent.fx b/samples/FLUX/mbittorrent.fx new file mode 100644 index 00000000..620bcd54 --- /dev/null +++ b/samples/FLUX/mbittorrent.fx @@ -0,0 +1,151 @@ +typedef choke TestChoke; +typedef unchoke TestUnchoke; +typedef interested TestInterested; +typedef uninterested TestUninterested; +typedef request TestRequest; +typedef cancel TestCancel; +typedef piece TestPiece; +typedef bitfield TestBitfield; +typedef have TestHave; +typedef piececomplete TestPieceComplete; + +CheckinWithTracker (torrent_data_t *tdata) + => (); + +SendRequestToTracker (torrent_data_t *tdata) + => (torrent_data_t *tdata, int socket); + +GetTrackerResponse (torrent_data_t *tdata, int socket) + => (); + +UpdateChokeList (torrent_data_t *tdata) + => (); + +PickChoked (torrent_data_t *tdata) + => (torrent_data_t *tdata, chokelist_t clist); + +SendChokeUnchoke (torrent_data_t *tdata, chokelist_t clist) + => (); + +SetupConnection (torrent_data_t *tdata, int socket) + => (); + +Handshake (torrent_data_t *tdata, int socket) + => (torrent_data_t *tdata, client_data_t *client); + +SendBitfield (torrent_data_t *tdata, client_data_t *client) + => (); + +Message (torrent_data_t *tdata, client_data_t *client) + => (); + +ReadMessage (torrent_data_t *tdata, client_data_t *client) + => (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload); + +HandleMessage (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) + => (client_data_t *client); + +MessageDone (client_data_t *client) + => (); + +CompletePiece (torrent_data_t *tdata, client_data_t *client, int piece) + => (torrent_data_t *tdata, client_data_t *client); + +VerifyPiece (torrent_data_t *tdata, client_data_t *client, int piece) + => (torrent_data_t *tdata, client_data_t *client, int piece); + +SendHave (torrent_data_t *tdata, client_data_t *client, int piece) + => (torrent_data_t *tdata, client_data_t *client); + +SendUninterested (torrent_data_t *tdata, client_data_t *client) + => (torrent_data_t *tdata, client_data_t *client); + +Choke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) + => (client_data_t *client); + +Cancel (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) + => (client_data_t *client); + +Interested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) + => (client_data_t *client); + +Uninterested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) + => (client_data_t *client); + +Bitfield (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) + => (client_data_t *client); + +Unchoke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) + => (torrent_data_t *tdata, client_data_t *client); + +SendRequest (torrent_data_t *tdata, client_data_t *client) + => (client_data_t *client); + +Have (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) + => (torrent_data_t *tdata, client_data_t *client); + +Piece (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) + => (torrent_data_t *tdata, client_data_t *client, int piece); + +Request (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) + => (client_data_t *client); + +SendKeepAlives (torrent_data_t *tdata) + => (); + +GetClients () + => (int maxfd, fd_set *fds); + +SelectSockets (int maxfd, fd_set *fds) + => (fd_set *fds); + +CheckSockets (fd_set *fds) + => (torrent_data_t *tdata, client_data_t *client); + +TrackerTimer () + => (torrent_data_t *tdata); + +ChokeTimer () + => (torrent_data_t *tdata); + +Connect () + => (torrent_data_t *tdata, int socket); + +KeepAliveTimer () + => (torrent_data_t *tdata); + +Listen () + => (torrent_data_t *tdata, client_data_t *client); + +source TrackerTimer => CheckinWithTracker; +source ChokeTimer => UpdateChokeList; +source Connect => SetupConnection; +source Listen => Message; +source KeepAliveTimer => SendKeepAlives; + +Listen = GetClients -> SelectSockets -> CheckSockets; +CheckinWithTracker = SendRequestToTracker -> GetTrackerResponse; +UpdateChokeList = PickChoked -> SendChokeUnchoke; +SetupConnection = Handshake -> SendBitfield; +Message = ReadMessage -> HandleMessage -> MessageDone; + +CompletePiece:[_, _, piececomplete] = VerifyPiece -> SendHave -> SendUninterested; + +HandleMessage:[_, _, choke, _, _] = Choke; +HandleMessage:[_, _, unchoke, _, _] = Unchoke -> SendRequest; +HandleMessage:[_, _, interested, _, _] = Interested; + +HandleMessage:[_, _, uninterested, _, _] = Uninterested; +HandleMessage:[_, _, request, _, _] = Request; +HandleMessage:[_, _, cancel, _, _] = Cancel; +HandleMessage:[_, _, piece, _, _] = Piece -> CompletePiece -> SendRequest; +HandleMessage:[_, _, bitfield, _, _] = Bitfield; +HandleMessage:[_, _, have, _, _] = Have -> SendRequest; + +atomic GetClients:{BigLock}; +atomic CheckSockets:{BigLock}; +atomic Message:{BigLock}; +atomic CheckinWithTracker:{BigLock}; +atomic UpdateChokeList:{BigLock}; +atomic SetupConnection:{BigLock}; +atomic SendKeepAlives:{BigLock}; diff --git a/samples/FLUX/test.fx b/samples/FLUX/test.fx new file mode 100644 index 00000000..bb81fa9a --- /dev/null +++ b/samples/FLUX/test.fx @@ -0,0 +1,38 @@ +// concrete node signatures +Listen () + => (int socket); + +ReadRequest (int socket) + => (int socket, bool close, image_tag *request); + +CheckCache (int socket, bool close, image_tag *request) + => (int socket, bool close, image_tag *request); + +// omitted for space: +// ReadInFromDisk, StoreInCache +Compress (int socket, bool close, image_tag *request, __u8 *rgb_data) + => (int socket, bool close, image_tag *request); +Write (int socket, bool close, image_tag *request) + => (int socket, bool close, image_tag *request); +Complete (int socket, bool close, image_tag *request) => (); + +// source node +source Listen => Image; + +// abstract node +Image = ReadRequest -> CheckCache -> Handler -> Write -> Complete; + +// predicate type & dispatch +typedef hit TestInCache; +Handler:[_, _, hit] = ; +Handler:[_, _, _] = +ReadInFromDisk -> Compress -> StoreInCache; + +// error handler +handle error ReadInFromDisk => FourOhFor; + +// atomicity constraints +atomic CheckCache:{cache}; +atomic StoreInCache:{cache}; +atomic Complete:{cache}; + From 5c4129f85bb2d5af921cd826f4d6e75072bc1fe9 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Fri, 19 Feb 2016 08:50:01 +0100 Subject: [PATCH 168/205] Move HACKING.rst.txt to sample directory The file was incorrectly placed at the root of the repo --- HACKING.rst.txt => samples/reStructuredText/HACKING.rst.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename HACKING.rst.txt => samples/reStructuredText/HACKING.rst.txt (100%) diff --git a/HACKING.rst.txt b/samples/reStructuredText/HACKING.rst.txt similarity index 100% rename from HACKING.rst.txt rename to samples/reStructuredText/HACKING.rst.txt From 6b001cf861f31ad51c71274ff332d5a6b84f0d89 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Thu, 18 Feb 2016 21:44:21 +0000 Subject: [PATCH 169/205] add support for HLSL/FX Add support for DirectX HLSL / FX files. The FX files are just HLSL files with some additional syntax to set render-states and define multiple shader stages in one file. Samples are either written by me, or taken from Chromium. --- lib/linguist/languages.yml | 10 ++ samples/HLSL/accelerated_surface_win.hlsl | 27 +++++ samples/HLSL/corridor.fx | 105 +++++++++++++++++++ samples/HLSL/jellyfish.fx | 119 ++++++++++++++++++++++ samples/HLSL/noise.fx | 41 ++++++++ 5 files changed, 302 insertions(+) create mode 100644 samples/HLSL/accelerated_surface_win.hlsl create mode 100644 samples/HLSL/corridor.fx create mode 100644 samples/HLSL/jellyfish.fx create mode 100644 samples/HLSL/noise.fx diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 14519a61..7ee17bb0 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1323,6 +1323,16 @@ HCL: ace_mode: ruby tm_scope: source.ruby +HLSL: + type: programming + extensions: + - .fx + - .fxh + - .hlsl + - .hlsli + ace_mode: text + tm_scope: none + HTML: type: markup tm_scope: text.html.basic diff --git a/samples/HLSL/accelerated_surface_win.hlsl b/samples/HLSL/accelerated_surface_win.hlsl new file mode 100644 index 00000000..74d28b8f --- /dev/null +++ b/samples/HLSL/accelerated_surface_win.hlsl @@ -0,0 +1,27 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// To compile these two shaders: +// fxc /E pixelMain /T ps_2_0 accelerated_surface_win.hlsl +// fxc /E vertexMain /T vs_2_0 accelerated_surface_win.hlsl +// +// fxc is in the DirectX SDK. + +struct Vertex { + float4 position : POSITION; + float2 texCoord : TEXCOORD0; +}; + +texture t; +sampler s; + +// Passes a position and texture coordinate to the pixel shader. +Vertex vertexMain(Vertex input) { + return input; +}; + +// Samples a texture at the given texture coordinate and returns the result. +float4 pixelMain(float2 texCoord : TEXCOORD0) : COLOR0 { + return tex2D(s, texCoord); +}; diff --git a/samples/HLSL/corridor.fx b/samples/HLSL/corridor.fx new file mode 100644 index 00000000..476ea4cc --- /dev/null +++ b/samples/HLSL/corridor.fx @@ -0,0 +1,105 @@ +float4x4 matWorldView : WORLDVIEW; +float4x4 matWorldViewProjection : WORLDVIEWPROJECTION; + +struct VS_INPUT { + float4 Position : POSITION0; + float3 Normal : NORMAL; + float3 Tangent : TANGENT; + float3 Binormal : BINORMAL; + float2 TexCoord0 : TEXCOORD0; + float2 TexCoord1 : TEXCOORD1; +}; + +struct VS_OUTPUT { + float4 Position : POSITION0; + float2 TexCoord0 : TEXCOORD0; + float2 TexCoord1 : TEXCOORD1; + float3x3 TangentToView : TEXCOORD2; +}; + +VS_OUTPUT vs_main(VS_INPUT input) +{ + VS_OUTPUT output; + output.Position = mul(input.Position, matWorldViewProjection); + output.TexCoord0 = input.TexCoord0 * 5; + output.TexCoord1 = input.TexCoord1; + output.TangentToView[0] = mul(float4(input.Tangent, 0), matWorldView).xyz; + output.TangentToView[1] = mul(float4(input.Binormal, 0), matWorldView).xyz; + output.TangentToView[2] = mul(float4(input.Normal, 0), matWorldView).xyz; + return output; +} + +struct PS_OUTPUT { + float4 gbuffer0 : COLOR0; + float4 gbuffer1 : COLOR1; +}; + +texture albedo_tex; +sampler albedo_samp = sampler_state { + Texture = (albedo_tex); + MipFilter = Linear; + MinFilter = Linear; + MagFilter = Linear; + AddressU = Wrap; + AddressV = Wrap; + sRGBTexture = True; +}; + +texture normal_tex; +sampler normal_samp = sampler_state { + Texture = (normal_tex); + MipFilter = Linear; + MinFilter = Linear; + MagFilter = Linear; + AddressU = Wrap; + AddressV = Wrap; + sRGBTexture = False; +}; + +texture specular_tex; +sampler specular_samp = sampler_state { + Texture = (specular_tex); + MipFilter = Linear; + MinFilter = Linear; + MagFilter = Linear; + AddressU = Wrap; + AddressV = Wrap; + sRGBTexture = True; +}; + +texture ao_tex; +sampler ao_samp = sampler_state { + Texture = (ao_tex); + MipFilter = Linear; + MinFilter = Linear; + MagFilter = Linear; + AddressU = Wrap; + AddressV = Wrap; + sRGBTexture = True; +}; + +PS_OUTPUT ps_main(VS_OUTPUT Input) +{ + PS_OUTPUT o; + + float3 tangentNormal = normalize(tex2D(normal_samp, Input.TexCoord0).xyz * 2 - 1); + float3 eyeNormal = normalize(mul(tangentNormal, Input.TangentToView)); + + float3 albedo = tex2D(albedo_samp, Input.TexCoord0).rgb; + float ao = tex2D(ao_samp, Input.TexCoord1).r * 0.75; + float spec = tex2D(specular_samp, Input.TexCoord0).r; + + o.gbuffer0 = float4(eyeNormal, spec * ao); + o.gbuffer1 = float4(albedo, 1 - ao); + return o; +} + +technique mesh { + pass Geometry { + VertexShader = compile vs_3_0 vs_main(); + PixelShader = compile ps_3_0 ps_main(); + + AlphaBlendEnable = False; + ZWriteEnable = True; + } +} diff --git a/samples/HLSL/jellyfish.fx b/samples/HLSL/jellyfish.fx new file mode 100644 index 00000000..c1c8359e --- /dev/null +++ b/samples/HLSL/jellyfish.fx @@ -0,0 +1,119 @@ +float4x4 matWorldViewProjection : WORLDVIEWPROJECTION; +float4x4 matWorldView : WORLDVIEW; +float4x4 matWorld : WORLD; +float4x4 matView : VIEW; + +uniform float4 vViewPosition; + +struct VS_INPUT +{ + float3 Pos: POSITION; + float3 Normal: NORMAL; + float3 Tangent: TANGENT; + float3 Binormal: BINORMAL; +}; + +struct VS_OUTPUT +{ + float4 Pos : POSITION; + float3 reflection : TEXCOORD1; + float3 refraction : TEXCOORD2; + float fresnel : TEXCOORD3; +}; + +uniform float3 amt; +uniform float3 scale; +uniform float3 phase; + +float3 deform(float3 p) +{ + float s = 3; + float3 p2 = p * scale + phase; + s += sin(p2.x) * amt.x; + s += sin(p2.y) * amt.y; + s += sin(p2.z) * amt.z; + return p * s / 3; +} + +VS_OUTPUT vs_main( VS_INPUT In ) +{ + VS_OUTPUT Out; + + float3 pos = In.Pos; + float3 norm = In.Normal; + + float3 p1 = pos + In.Tangent * 0.05; + float3 p2 = pos + In.Binormal * 0.05; + pos = deform(pos); + p1 = deform(p1); + p2 = deform(p2); + + p1 -= pos; + p2 -= pos; + norm = normalize(cross(p1, p2)); + + float3 view = normalize(pos - vViewPosition.xyz); + + Out.Pos = mul(float4(pos, 1.0), matWorldViewProjection); + Out.reflection = reflect(view, norm); + Out.refraction = reflect(view, norm * 0.4f); /* fake, but who cares? */ + Out.fresnel = dot(view, norm); + norm = mul(float4(norm, 0.0), matWorldViewProjection); + + return Out; +} + +#define PS_INPUT VS_OUTPUT + +#if 0 +textureCUBE reflectionMap; +samplerCUBE reflectionMapSampler = sampler_state +{ + Texture = (reflectionMap); + MipFilter = LINEAR; + MinFilter = LINEAR; + MagFilter = LINEAR; +}; +#else +// textures +texture reflectionMap +< + string type = "CUBE"; + string name = "test_cube.dds"; +>; + +samplerCUBE reflectionMapSampler = sampler_state +{ + Texture = (reflectionMap); + MipFilter = LINEAR; + MinFilter = LINEAR; + MagFilter = LINEAR; +}; +#endif + +struct PS_OUTPUT +{ + float4 color : COLOR0; +}; + +PS_OUTPUT ps_main( PS_INPUT In ) +{ + PS_OUTPUT Out; + + float4 reflection = texCUBE(reflectionMapSampler, normalize(In.reflection)) * 1.5; + float4 refraction = texCUBE(reflectionMapSampler, normalize(In.refraction)); + float fresnel = In.fresnel; +// float fresnel = abs(normalize(In.normal).z); + Out.color = lerp(reflection, refraction, fresnel) * pow(1.0 - fresnel * 0.75, 1.0); + + return Out; +} + +technique blur_ps_vs_2_0 +{ + pass P0 + { + VertexShader = compile vs_2_0 vs_main(); + PixelShader = compile ps_2_0 ps_main(); + } +} diff --git a/samples/HLSL/noise.fx b/samples/HLSL/noise.fx new file mode 100644 index 00000000..be0303c1 --- /dev/null +++ b/samples/HLSL/noise.fx @@ -0,0 +1,41 @@ +float alpha = 1.f; + +texture tex; +sampler tex_sampler = sampler_state +{ + Texture = (tex); + MipFilter = LINEAR; + MinFilter = LINEAR; + MagFilter = LINEAR; + + AddressU = WRAP; + AddressV = WRAP; +}; + +struct VS_OUTPUT +{ + float4 pos : POSITION; + float2 tex : TEXCOORD1; +}; + +VS_OUTPUT vertex(float4 ipos : POSITION, float2 tex : TEXCOORD0) +{ + VS_OUTPUT Out; + Out.pos = ipos; + Out.tex = tex * 2; + return Out; +} + +float4 pixel(VS_OUTPUT In) : COLOR +{ + return tex2D(tex_sampler, In.tex) * alpha; +} + +technique blur_ps_vs_2_0 +{ + pass P0 + { + VertexShader = compile vs_2_0 vertex(); + PixelShader = compile ps_2_0 pixel(); + } +} From b08c5a8421bbc69d503d82d74cc905b31f078ff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Sun, 14 Feb 2016 22:05:53 +0200 Subject: [PATCH 170/205] Shell: Add .sh.in extension --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 1f04c03c..2e2f5fce 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3285,6 +3285,7 @@ Shell: - .command - .fcgi - .ksh + - .sh.in - .tmux - .tool - .zsh From b67254e9862816f056181b260941e22e6c60fd60 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Fri, 19 Feb 2016 18:52:10 +0100 Subject: [PATCH 171/205] add support for Uno Uno is a fast, native dialect of C#, that includes a lot of specialized functionality for graphics programming. https://www.fusetools.com/learn/uno --- lib/linguist/languages.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 14519a61..d5646305 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3591,6 +3591,13 @@ Unity3D Asset: - .unity tm_scope: source.yaml +Uno: + type: programming + extensions: + - .uno + ace_mode: csharp + tm_scope: source.cs + UnrealScript: type: programming color: "#a54c4d" From 1c20c541917da5a1aa2650381810f65a2cfafbcb Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Fri, 19 Feb 2016 16:55:38 -0700 Subject: [PATCH 172/205] Fixing ordering of makefile filenames --- lib/linguist/languages.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 3e015b2b..4d61ca61 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2029,10 +2029,10 @@ Makefile: - GNUmakefile - Kbuild - Makefile - - Makefile.inc - - makefile - Makefile.am - Makefile.in + - Makefile.inc + - makefile interpreters: - make ace_mode: makefile From 864a6c0a205aba086955eb5a2430e60d4a42b089 Mon Sep 17 00:00:00 2001 From: Michael Zhou Date: Fri, 19 Feb 2016 18:23:15 -0500 Subject: [PATCH 173/205] Add .bzl extension to Python in languages.yml .bzl is the extension for Skylark, a subset of Python that is used to define build extensions for the Bazel build system. Eg: https://github.com/bazelbuild/bazel/blob/master/tools/build_rules/closure/closure_js_binary.bzl --- lib/linguist/languages.yml | 1 + samples/Python/closure_js_binary.bzl | 124 +++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 samples/Python/closure_js_binary.bzl diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 4d61ca61..b497d88b 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2822,6 +2822,7 @@ Python: color: "#3572A5" extensions: - .py + - .bzl - .cgi - .fcgi - .gyp diff --git a/samples/Python/closure_js_binary.bzl b/samples/Python/closure_js_binary.bzl new file mode 100644 index 00000000..c4453ffb --- /dev/null +++ b/samples/Python/closure_js_binary.bzl @@ -0,0 +1,124 @@ +# Copyright 2015 The Bazel Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Build definitions for JavaScript binaries compiled with the Closure Compiler. + +A single file is produced with the _compiled.js suffix. + +By default, the name of the entry point is assumed to be the same as that of the +build target. This behaviour may be overridden with the "main" attribute. + +The optimization level may be set with the "compilation_level" attribute. +Supported values are: unobfuscated, simple, and advanced. + +Example: + + closure_js_binary( + name = "hello", + compilation_level = "simple", + language_in = "ecmascript6", + language_out = "ecmascript3", + externs = ["//third_party/javascript/google_cast/cast.js"], + deps = [ + "@closure_library//:closure_library", + ":hello_lib", + ], + ) + +This rule will produce hello_combined.js. +""" + +_COMPILATION_LEVELS = { + "whitespace_only": [ + "--compilation_level=WHITESPACE_ONLY", + "--formatting=PRETTY_PRINT" + ], + "simple": ["--compilation_level=SIMPLE"], + "advanced": ["--compilation_level=ADVANCED"] +} + +_SUPPORTED_LANGUAGES = { + "es3": ["ES3"], + "ecmascript3": ["ECMASCRIPT3"], + "es5": ["ES5"], + "ecmascript5": ["ECMASCRIPT5"], + "es5_strict": ["ES5_STRICT"], + "ecmascript5_strict": ["ECMASCRIPT5_STRICT"], + "es6": ["ES6"], + "ecmascript6": ["ECMASCRIPT6"], + "es6_strict": ["ES6_STRICT"], + "ecmascript6_strict": ["ECMASCRIPT6_STRICT"], + "es6_typed": ["ES6_TYPED"], + "ecmascript6_typed": ["ECMASCRIPT6_TYPED"], +} + +def _impl(ctx): + externs = set(order="compile") + srcs = set(order="compile") + for dep in ctx.attr.deps: + externs += dep.transitive_js_externs + srcs += dep.transitive_js_srcs + + args = [ + "--entry_point=goog:%s" % ctx.attr.main, + "--js_output_file=%s" % ctx.outputs.out.path, + "--dependency_mode=LOOSE", + "--warning_level=VERBOSE", + ] + (["--js=%s" % src.path for src in srcs] + + ["--externs=%s" % extern.path for extern in externs]) + + # Set the compilation level. + if ctx.attr.compilation_level in _COMPILATION_LEVELS: + args += _COMPILATION_LEVELS[ctx.attr.compilation_level] + else: + fail("Invalid compilation_level '%s', expected one of %s" % + (ctx.attr.compilation_level, _COMPILATION_LEVELS.keys())) + + # Set the language in. + if ctx.attr.language_in in _SUPPORTED_LANGUAGES: + args += "--language_in=" + _SUPPORTED_LANGUAGES[ctx.attr.language_in] + else: + fail("Invalid language_in '%s', expected one of %s" % + (ctx.attr.language_in, _SUPPORTED_LANGUAGES.keys())) + + # Set the language out. + if ctx.attr.language_out in _SUPPORTED_LANGUAGES: + args += "--language_out=" + _SUPPORTED_LANGUAGES[ctx.attr.language_out] + else: + fail("Invalid language_out '%s', expected one of %s" % + (ctx.attr.language_out, _SUPPORTED_LANGUAGES.keys())) + + ctx.action( + inputs=list(srcs) + list(externs), + outputs=[ctx.outputs.out], + arguments=args, + executable=ctx.executable._closure_compiler) + + return struct(files=set([ctx.outputs.out])) + +closure_js_binary = rule( + implementation=_impl, + attrs={ + "deps": attr.label_list( + allow_files=False, + providers=["transitive_js_externs", "transitive_js_srcs"]), + "main": attr.string(default="%{name}"), + "compilation_level": attr.string(default="advanced"), + "language_in": attr.string(default="ecmascript6"), + "language_out": attr.string(default="ecmascript3"), + "_closure_compiler": attr.label( + default=Label("//external:closure_compiler_"), + executable=True), + }, + outputs={"out": "%{name}_combined.js"}) From f8d6be55ee9df7fa91e6e878655ea4b2c274020b Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Fri, 19 Feb 2016 19:03:24 +0100 Subject: [PATCH 174/205] add .ux as an XML extension This is used by Fusetools' UX markup: https://www.fusetools.com/learn/fuse#hello-ux-markup --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index d5646305..b7e4d4d5 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3804,6 +3804,7 @@ XML: - .tsx - .ui - .urdf + - .ux - .vbproj - .vcxproj - .vxml From ead85379ed8314fa0cd5f3854295ff1664bce2db Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Mon, 22 Feb 2016 18:44:02 +0100 Subject: [PATCH 175/205] add sample uno-files --- samples/Uno/PlayerPads.uno | 154 +++++++++++++++++++++++++++++++++++++ samples/Uno/Pong.uno | 139 +++++++++++++++++++++++++++++++++ samples/Uno/TowerBlock.uno | 136 ++++++++++++++++++++++++++++++++ 3 files changed, 429 insertions(+) create mode 100644 samples/Uno/PlayerPads.uno create mode 100644 samples/Uno/Pong.uno create mode 100644 samples/Uno/TowerBlock.uno diff --git a/samples/Uno/PlayerPads.uno b/samples/Uno/PlayerPads.uno new file mode 100644 index 00000000..0d71a25e --- /dev/null +++ b/samples/Uno/PlayerPads.uno @@ -0,0 +1,154 @@ +using Uno; +using Uno.Collections; +using Uno.Graphics; +using Uno.Scenes; +using Uno.Designer; +using Uno.Content; +using Uno.Content.Models; +using Uno.UI; + +namespace PONG2D +{ + public class PlayerPads : Node + { + + Image _player1Image; + Image _player2Image; + + [Inline] + public Image Player1 + { + get { return _player1Image; } + set + { + if (_player1Image != value) + { + _player1Image = value; + + } + } + } + + [Inline] + public Image Player2 + { + get { return _player2Image; } + set + { + if (_player2Image != value) + { + _player2Image = value; + + } + } + } + + [Hide] + public float2 Player1Pos + { + get { return (Player1.ActualPosition); } + set + { + if (Player1 != null) + Player1.Position = value; + + } + } + + [Hide] + public float2 Player2Pos + { + get { return (Player2.ActualPosition); } + set + { + if (Player2 != null) + Player2.Position = value; + + } + } + + public Rect Player1Rect + { + get { return new Rect(Player1Pos, float2(Player1.Width, Player2.Height)); } + set + { + Player1Pos = value.Position; + if (Player1 != null) + { + Player1.Width = value.Size.X; + Player1.Height = value.Size.Y; + } + } + } + + public Rect Player2Rect + { + get { return new Rect(Player2Pos, float2(Player2.Width, Player2.Height)); } + set + { + Player2Pos = value.Position; + if (Player2 != null) + { + Player2.Width = value.Size.X; + Player2.Height = value.Size.Y; + } + } + } + + public Ball Ball + { + get; + set; + } + + public float PadVelocity { get; set; } + + public PlayerPads() + { + + } + + void UpdatePositions() + { + + } + + protected override void OnUpdate() + { + base.OnUpdate(); + + if (Input.IsKeyDown(Uno.Platform.Key.W)) + { + Player1Pos = float2(0, Player1Pos.Y - PadVelocity); + } + + if (Input.IsKeyDown(Uno.Platform.Key.S)) + { + Player1Pos = float2(0, Player1Pos.Y + PadVelocity); + } + + if (Input.IsKeyDown(Uno.Platform.Key.Up)) + { + Player2Pos = float2(0, Player2Pos.Y - PadVelocity); + } + + if (Input.IsKeyDown(Uno.Platform.Key.Down)) + { + Player2Pos = float2(0, Player2Pos.Y + PadVelocity); + } + + if (Ball != null) + { + + if (Ball.BallRectangle.Intersects(Player1Rect) || + Ball.BallRectangle.Intersects(Player2Rect)) + { + + Ball.BallVelocity = float2(Ball.BallVelocity.X * -1f, Ball.BallVelocity.Y); + } + } + + } + + } +} \ No newline at end of file diff --git a/samples/Uno/Pong.uno b/samples/Uno/Pong.uno new file mode 100644 index 00000000..4e578250 --- /dev/null +++ b/samples/Uno/Pong.uno @@ -0,0 +1,139 @@ +using Uno; +using Uno.Collections; +using Uno.Graphics; +using Uno.Scenes; +using Uno.Content; +using Uno.Content.Models; + +namespace PONG2D +{ + public class Pong : Node + { + float2 _player1Pos; + float2 _player2Pos; + float2 ballPosition; + float2 ballVelocity; + float2 rectangleSize; + + Rect player1Rect; + Rect player2Rect; + Rect ballRect; + + float2 resolution = Context.VirtualResolution; + + Random random = new Random(1); + + + float2 Player1Pos + { + get { return _player1Pos; } + set + { + _player1Pos = Math.Clamp(value, float2(0, 0), resolution - rectangleSize); + } + } + + float2 Player2Pos + { + get { return _player2Pos; } + set + { + _player2Pos = Math.Clamp(value, float2(0, 0), resolution - rectangleSize); + } + } + + public Pong() + { + Uno.Scenes.Input.AddGlobalListener(this); + } + + protected override void OnInitialize() + { + base.OnInitialize(); + UpdateValues(); + + } + + void UpdateValues() + { + rectangleSize = float2(resolution.X / 80f, resolution.Y / 5f); + _player1Pos = float2(0f); + _player2Pos = float2(Context.VirtualResolution.X - rectangleSize.X, 0f); + + player1Rect = new Rect(_player1Pos, rectangleSize); + player2Rect = new Rect(_player2Pos, rectangleSize); + + ballPosition = float2(resolution.X * 0.5f - 10f, resolution.Y * 0.5f - 10f); + ballRect = new Rect(ballPosition, float2(20f)); + + + SpwanBall(); + + } + + void SpwanBall() + { + ballRect.Position = float2(resolution.X * 0.5f - 10f, resolution.Y * 0.5f - 10f); + ballVelocity = float2(5f, 10f) * 0.5f; + } + + void OnWindowResize(object sender, EventArgs args) + { + //UpdateValues(); + } + + protected override void OnUpdate() + { + base.OnUpdate(); + + var padVelocity = resolution.Y * (float)Application.Current.FrameInterval * 4f; + if (Input.IsKeyDown(Uno.Platform.Key.Up)) + { + Player1Pos = float2(Player1Pos.X, Player1Pos.Y - padVelocity); + } + + if (Input.IsKeyDown(Uno.Platform.Key.Down)) + { + Player1Pos = float2(Player1Pos.X, Player1Pos.Y + padVelocity); + } + + if (Input.IsKeyDown(Uno.Platform.Key.W)) + { + Player2Pos = float2(Player2Pos.X, Player2Pos.Y - padVelocity); + } + + if (Input.IsKeyDown(Uno.Platform.Key.S)) + { + Player2Pos = float2(Player2Pos.X, Player2Pos.Y + padVelocity); + } + player1Rect.Position = Player1Pos; + player2Rect.Position = Player2Pos; + + if (ballRect.Position.X > resolution.X || ballRect.Position.X < 0) + { + SpwanBall(); + } + if (ballRect.Position.Y > resolution.Y || + ballRect.Position.Y < 0) + { + ballVelocity.Y *= -1f; + } + + if (ballRect.Intersects(player1Rect) || + ballRect.Intersects(player2Rect)) + { + ballVelocity.X *= -1f; + } + + ballRect.Position += ballVelocity; + + } + + protected override void OnDraw() + { + Uno.Drawing.RoundedRectangle.Draw(player1Rect.Position, player1Rect.Size, float4(1f), 0); + Uno.Drawing.RoundedRectangle.Draw(player2Rect.Position, player2Rect.Size, float4(1f), 0); + Uno.Drawing.RoundedRectangle.Draw(ballRect.Position, ballRect.Size, float4(1f), 0f); + } + } +} \ No newline at end of file diff --git a/samples/Uno/TowerBlock.uno b/samples/Uno/TowerBlock.uno new file mode 100644 index 00000000..a25d6849 --- /dev/null +++ b/samples/Uno/TowerBlock.uno @@ -0,0 +1,136 @@ +using Uno; +using Uno.Collections; +using Uno.Graphics; +using Uno.Scenes; +using Uno.Content; +using Uno.Content.Models; +using Uno.Physics.Box2D; + +using TowerBuilder.Box2DMath; + +namespace TowerBuilder +{ + public class TowerBlock : TestBed + { + Body floorBody, deleteBody, mouseBody; + + private List bodies = new List(); + private List bodiesToDelete = new List(); + + private ContactListener contactListener; + + protected override void OnInitializeTestBed() + { + World.Gravity = float2(0, -25.0f); + World.ContactListener = contactListener = new ContactListener(this); + + bodies.Clear(); + bodiesToDelete.Clear(); + + CreateFloor(); + CreateDeleteBody(); + CreateBox2(); + } + + void CreateFloor() + { + var bodyDef = new BodyDef(); + bodyDef.position = float2(0, -40.0f); + + floorBody = World.CreateBody(bodyDef); + + var shape = new PolygonShape(); + shape.SetAsBox(30.0f, 10.0f); + + var fixtureDef = new FixtureDef(); + fixtureDef.shape = shape; + fixtureDef.density = 1.0f; + + floorBody.CreateFixture(fixtureDef); + } + + void CreateDeleteBody() + { + var bodyDef = new BodyDef(); + bodyDef.position = float2(0, -44.0f); + + deleteBody = World.CreateBody(bodyDef); + + var shape = new PolygonShape(); + shape.SetAsBox(200.0f, 10.0f); + + var fixtureDef = new FixtureDef(); + fixtureDef.shape = shape; + fixtureDef.density = 1.0f; + + deleteBody.CreateFixture(fixtureDef); + } + + Random random = new Random((int) (Uno.Diagnostics.Clock.GetSeconds() * 1000000)); + void CreateBox2() + { + var bodyDef = new BodyDef(); + bodyDef.type = BodyType.Dynamic; + bodyDef.position = float2(random.NextFloat(-25f, 25f), 50.0f); + bodyDef.angularVelocity = random.NextFloat() * 40 - 20; + bodyDef.userData = float3(0, 0, 0); + + var body = World.CreateBody(bodyDef); + + var shape = new PolygonShape(); + shape.SetAsBox(0.75f, 0.75f); + + var fixtureDef = new FixtureDef(); + fixtureDef.shape = shape; + fixtureDef.density = 5.0f; + //fixtureDef.friction = 0.75f; + + body.CreateFixture(fixtureDef); + + bodies.Add(body); + } + + private int c = 0; + protected override void OnFixedUpdate() + { + base.OnFixedUpdate(); + + debug_log bodies.Count; + if(c++ % 8 == 0 && bodies.Count < 20) CreateBox2(); + + foreach(var body in bodiesToDelete) + { + World.DestroyBody(body); + bodies.Remove(body); + } + + bodiesToDelete.Clear(); + } + + public class ContactListener : IContactListener + { + private TowerBlock b; + public ContactListener(TowerBlock b) + { + this.b = b; + } + + public void BeginContact(Contact contact) + { + if(contact.GetFixtureA().GetBody() == b.deleteBody) + { + b.bodiesToDelete.Add(contact.GetFixtureB().GetBody()); + } + else if(contact.GetFixtureB().GetBody() == b.deleteBody) + { + b.bodiesToDelete.Add(contact.GetFixtureA().GetBody()); + } + } + + public void EndContact(Contact contact) {} + public void PreSolve(Contact contact, ref Manifold manifold) {} + public void PostSolve(Contact contact, ref ContactImpulse impulse) {} + } + + } +} From cc6106f31bf92de44f39eed40ac874f0663e3c73 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Mon, 22 Feb 2016 18:45:59 +0100 Subject: [PATCH 176/205] add sample ux-files --- samples/XML/MainView.ux | 57 +++++++++++++++++++++++++++++++++++++++++ samples/XML/MyApp.ux | 11 ++++++++ 2 files changed, 68 insertions(+) create mode 100644 samples/XML/MainView.ux create mode 100644 samples/XML/MyApp.ux diff --git a/samples/XML/MainView.ux b/samples/XML/MainView.ux new file mode 100644 index 00000000..d71edf1f --- /dev/null +++ b/samples/XML/MainView.ux @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + relativeNode + + + + + + + + RelativeTo="Size" + RelativeTo="ParentSize" + RelativeTo="Keyboard" + RelativeTo="PositionChange" + RelativeNode="relativeNode" + + + + + + + + + + + + + + + + + + + diff --git a/samples/XML/MyApp.ux b/samples/XML/MyApp.ux new file mode 100644 index 00000000..0e7b0088 --- /dev/null +++ b/samples/XML/MyApp.ux @@ -0,0 +1,11 @@ + + + + + + + This is an example of EdgeNavigator! + + + + From ab69fd01acfe0a5802a6a4b8d331d0ba6c7caed9 Mon Sep 17 00:00:00 2001 From: Eyal Dechter Date: Mon, 22 Feb 2016 15:03:26 -0500 Subject: [PATCH 177/205] Add .yap ext and yap interpreter for Prolog lang --- lib/linguist/languages.yml | 2 + samples/Prolog/queues.yap | 280 +++++++++++++++++++++++++++++++++++++ 2 files changed, 282 insertions(+) create mode 100644 samples/Prolog/queues.yap diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index b497d88b..aae87ce8 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2751,8 +2751,10 @@ Prolog: - .pl - .pro - .prolog + - .yap interpreters: - swipl + - yap tm_scope: source.prolog ace_mode: prolog diff --git a/samples/Prolog/queues.yap b/samples/Prolog/queues.yap new file mode 100644 index 00000000..b464152e --- /dev/null +++ b/samples/Prolog/queues.yap @@ -0,0 +1,280 @@ +% This file has been included as an YAP library by Vitor Santos Costa, 1999 + +% File : QUEUES.PL +% Author : R.A.O'Keefe +% Updated: Friday November 18th, 1983, 8:09:31 pm +% Purpose: define queue operations +% Needs : lib(lists) for append/3. + +/** @defgroup Queues Queues +@ingroup library +@{ + +The following queue manipulation routines are available once +included with the `use_module(library(queues))` command. Queues are +implemented with difference lists. + +*/ + +/** + + @pred make_queue(+ _Queue_) + + +Creates a new empty queue. It should only be used to create a new queue. + + +*/ + + +/** @pred empty_queue(+ _Queue_) + + +Tests whether the queue is empty. + + +*/ +/** @pred head_queue(+ _Queue_, ? _Head_) + + +Unifies Head with the first element of the queue. + + +*/ +/** @pred join_queue(+ _Element_, + _OldQueue_, - _NewQueue_) + + +Adds the new element at the end of the queue. + + +*/ +/** @pred jump_queue(+ _Element_, + _OldQueue_, - _NewQueue_) + + +Adds the new element at the front of the list. + + +*/ +/** @pred length_queue(+ _Queue_, - _Length_) + + +Counts the number of elements currently in the queue. + + +*/ +/** @pred list_join_queue(+ _List_, + _OldQueue_, - _NewQueue_) + + +Ads the new elements at the end of the queue. + + +*/ +/** @pred list_jump_queue(+ _List_, + _OldQueue_, + _NewQueue_) + + +Adds all the elements of _List_ at the front of the queue. + + +*/ +/** @pred list_to_queue(+ _List_, - _Queue_) + + +Creates a new queue with the same elements as _List._ + + +*/ +/** @pred queue_to_list(+ _Queue_, - _List_) + + +Creates a new list with the same elements as _Queue_. + + + + + */ +/** @pred serve_queue(+ _OldQueue_, + _Head_, - _NewQueue_) + + +Removes the first element of the queue for service. + + +*/ +:- module(queues, [ + make_queue/1, % create empty queue + join_queue/3, % add element to end of queue + list_join_queue/3, % add many elements to end of queue + jump_queue/3, % add element to front of queue + list_jump_queue/3, % add many elements to front of queue + head_queue/2, % look at first element of queue + serve_queue/3, % remove first element of queue + length_queue/2, % count elements of queue + empty_queue/1, % test whether queue is empty + list_to_queue/2, % convert list to queue + queue_to_list/2 % convert queue to list + ]). + +:- use_module(library(lists), [append/3]). + +/* +:- mode + make_queue(-), + join_queue(+, +, -), + list_join_queue(+, +, -), + jump_queue(+, +, -), + list_jump_queue(+, +, -), + head_queue(+, ?), + serve_queue(+, ?, -), + length_queue(+, ?), + length_queue(+, +, +, -), + empty_queue(+), + list_to_queue(+, -), + queue_to_list(+, -), + queue_to_list(+, +, -). +*/ + +/* In this package, a queue is represented as a term Front-Back, where + Front is a list and Back is a tail of that list, and is normally a + variable. join_queue will only work when the Back is a variable, + the other routines will accept any tail. The elements of the queue + are the list difference, that is, all the elements starting at Front + and stopping at Back. Examples: + + [a,b,c,d,e|Z]-Z has elements a,b,c,d,e + [a,b,c,d,e]-[d,e] has elements a,b,c + Z-Z has no elements + [1,2,3]-[1,2,3] has no elements +*/ + +% make_queue(Queue) +% creates a new empty queue. It will also match empty queues, but +% because Prolog doesn't do the occurs check, it will also match +% other queues, creating circular lists. So this should ONLY be +% used to make new queues. + +make_queue(X-X). + + + +% join_queue(Element, OldQueue, NewQueue) +% adds the new element at the end of the queue. The old queue is +% side-effected, so you *can't* do +% join_queue(1, OldQ, NewQ1), +% join_queue(2, OldQ, NewQ2). +% There isn't any easy way of doing that, sensible though it might +% be. You *can* do +% join_queue(1, OldQ, MidQ), +% join_queue(2, MidQ, NewQ). +% See list_join_queue. + +join_queue(Element, Front-[Element|Back], Front-Back). + + + +% list_join_queue(List, OldQueue, NewQueue) +% adds the new elements at the end of the queue. The elements are +% added in the same order that they appear in the list, e.g. +% list_join_queue([y,z], [a,b,c|M]-M, [a,b,c,y,z|N]-N). + +list_join_queue(List, Front-OldBack, Front-NewBack) :- + append(List, OldBack, NewBack). + + + +% jump_queue(Element, OldQueue, NewQueue) +% adds the new element at the front of the list. Unlike join_queue, +% jump_queue(1, OldQ, NewQ1), +% jump_queue(2, OldQ, NewQ2) +% *does* work, though if you add things at the end of NewQ1 they +% will also show up in NewQ2. Note that +% jump_queue(1, OldQ, MidQ), +% jump_queue(2, MidQ, NewQ) +% makes NewQ start 2, 1, ... + +jump_queue(Element, Front-Back, [Element|Front]-Back). + + + +% list_jump_queue(List, OldQueue, NewQueue) +% adds all the elements of List at the front of the queue. There are +% two ways we might do this. We could add all the elements one at a +% time, so that they would appear at the beginning of the queue in the +% opposite order to the order they had in the list, or we could add +% them in one lump, so that they have the same order in the queue as +% in the list. As you can easily add the elements one at a time if +% that is what you want, I have chosen the latter. + +list_jump_queue(List, OldFront-Back, NewFront-Back) :- + append(List, OldFront, NewFront). +% reverse(List, OldFront, NewFront). % for the other definition + + + +% head_queue(Queue, Head) +% unifies Head with the first element of the queue. The tricky part +% is that we might be at the end of a queue: Back-Back, with Back a +% variable, and in that case this predicate should not succeed, as we +% don't know what that element is or whether it exists yet. + +head_queue(Front-Back, Head) :- + Front \== Back, % the queue is not empty + Front = [Head|_]. + + + +% serve_queue(OldQueue, Head, NewQueue) +% removes the first element of the queue for service. + +serve_queue(OldFront-Back, Head, NewFront-Back) :- + OldFront \== Back, + OldFront = [Head|NewFront]. + + + +% empty_queue(Queue) +% tests whether the queue is empty. If the back of a queue were +% guaranteed to be a variable, we could have +% empty_queue(Front-Back) :- var(Front). +% but I don't see why you shouldn't be able to treat difference +% lists as queues if you want to. + +empty_queue(Front-Back) :- + Front == Back. + + + +% length_queue(Queue, Length) +% counts the number of elements currently in the queue. Note that +% we have to be careful in checking for the end of the list, we +% can't test for [] the way length(List) does. + +length_queue(Front-Back, Length) :- + length_queue(Front, Back, 0, N), + Length = N. + +length_queue(Front, Back, N, N) :- + Front == Back, !. +length_queue([_|Front], Back, K, N) :- + L is K+1, + length_queue(Front, Back, L, N). + + + +% list_to_queue(List, Queue) +% creates a new queue with the same elements as List. + +list_to_queue(List, Front-Back) :- + append(List, Back, Front). + + + +% queue_to_list(Queue, List) +% creates a new list with the same elements as Queue. + +queue_to_list(Front-Back, List) :- + queue_to_list(Front, Back, List). + +queue_to_list(Front, Back, Ans) :- + Front == Back, !, Ans = []. +queue_to_list([Head|Front], Back, [Head|Tail]) :- + queue_to_list(Front, Back, Tail). + From bfa7eced4469926fe2fe967f32dedb0eeddb03fc Mon Sep 17 00:00:00 2001 From: William Claude Tumeo Date: Fri, 26 Feb 2016 00:31:58 -0300 Subject: [PATCH 178/205] Try fix "Ren'Py being detected as Python" - Remove Ren'Py from Python group - Add .rpy to Python + sample --- lib/linguist/heuristics.rb | 8 ++++++ lib/linguist/languages.yml | 2 +- samples/Python/simpleclient.rpy | 49 +++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 samples/Python/simpleclient.rpy diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 0806ce1f..af6c5e83 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -321,6 +321,14 @@ module Linguist end end + disambiguate ".rpy" do |data| + if /(^(import|from)[\s\S])/m.match(data) + Language["Python"] + else + Language["Ren'Py"] + end + end + disambiguate ".rs" do |data| if /^(use |fn |mod |pub |macro_rules|impl|#!?\[)/.match(data) Language["Rust"] diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index e9c63ef1..4a348bc2 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2831,6 +2831,7 @@ Python: - .pyp - .pyt - .pyw + - .rpy - .tac - .wsgi - .xpy @@ -3004,7 +3005,6 @@ Redcode: Ren'Py: type: programming - group: Python aliases: - renpy color: "#ff7f7f" diff --git a/samples/Python/simpleclient.rpy b/samples/Python/simpleclient.rpy new file mode 100644 index 00000000..ceb5f991 --- /dev/null +++ b/samples/Python/simpleclient.rpy @@ -0,0 +1,49 @@ + +# Copyright (c) Twisted Matrix Laboratories. +# See LICENSE for details. + + +""" +An example client. Run simpleserv.py first before running this. +""" + +from twisted.internet import reactor, protocol + + +# a client protocol + +class EchoClient(protocol.Protocol): + """Once connected, send a message, then print the result.""" + + def connectionMade(self): + self.transport.write("hello, world!") + + def dataReceived(self, data): + "As soon as any data is received, write it back." + print "Server said:", data + self.transport.loseConnection() + + def connectionLost(self, reason): + print "connection lost" + +class EchoFactory(protocol.ClientFactory): + protocol = EchoClient + + def clientConnectionFailed(self, connector, reason): + print "Connection failed - goodbye!" + reactor.stop() + + def clientConnectionLost(self, connector, reason): + print "Connection lost - goodbye!" + reactor.stop() + + +# this connects the protocol to a server running on port 8000 +def main(): + f = EchoFactory() + reactor.connectTCP("localhost", 8000, f) + reactor.run() + +# this only runs if the module was *not* imported +if __name__ == '__main__': + main() From db994a119767f5f497a7f5fa674729b3d8c9d510 Mon Sep 17 00:00:00 2001 From: Farbod Salamat-Zadeh Date: Sat, 27 Feb 2016 00:42:03 +0000 Subject: [PATCH 179/205] Remove .txt extension for CSV format --- lib/linguist/languages.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 4fe4390e..4296c4df 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -481,7 +481,6 @@ CSV: tm_scope: none extensions: - .csv - - .txt Cap'n Proto: type: programming From 9bfbd0550c9d8761b434dec3864e13d1bbeb5f85 Mon Sep 17 00:00:00 2001 From: Farbod Salamat-Zadeh Date: Sat, 27 Feb 2016 14:32:50 +0000 Subject: [PATCH 180/205] Move cars.csv from test/fixtures/Data to samples/CSV --- {test/fixtures/Data => samples/CSV}/cars.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename {test/fixtures/Data => samples/CSV}/cars.csv (63%) diff --git a/test/fixtures/Data/cars.csv b/samples/CSV/cars.csv similarity index 63% rename from test/fixtures/Data/cars.csv rename to samples/CSV/cars.csv index 73280e55..3c504cd2 100644 --- a/test/fixtures/Data/cars.csv +++ b/samples/CSV/cars.csv @@ -1,3 +1,3 @@ Year,Make,Model,Length 1997,Ford,E350,2.34 -2000,Mercury,Cougar,2.38 \ No newline at end of file +2000,Mercury,Cougar,2.38 From 3be007526cf43cc0a91504fe86d83af7db3e663a Mon Sep 17 00:00:00 2001 From: Farbod Salamat-Zadeh Date: Sat, 27 Feb 2016 15:30:22 +0000 Subject: [PATCH 181/205] Fix fixture_blob("Data/cars.csv") Changes `fixture_blob("Data/cars.csv")` to `sample_blob("CSV/cars.csv")` --- test/test_file_blob.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_file_blob.rb b/test/test_file_blob.rb index 08e2e49b..ebb0b7fc 100644 --- a/test/test_file_blob.rb +++ b/test/test_file_blob.rb @@ -152,7 +152,7 @@ class TestBlob < Minitest::Test end def test_csv - assert fixture_blob("Data/cars.csv").csv? + assert sample_blob("CSV/cars.csv").csv? end def test_pdf From 40413dfcc709c847f2d0051c9f694b02d296c096 Mon Sep 17 00:00:00 2001 From: William Tumeo Date: Sat, 27 Feb 2016 23:55:53 -0300 Subject: [PATCH 182/205] Add `class` and `def` to regex --- lib/linguist/heuristics.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index af6c5e83..895bfa20 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -322,7 +322,7 @@ module Linguist end disambiguate ".rpy" do |data| - if /(^(import|from)[\s\S])/m.match(data) + if /(^(import|from|class|def)[\s\S])/m.match(data) Language["Python"] else Language["Ren'Py"] From 6b60e5e786d5bda9b34084c4321ce4637bb57c9d Mon Sep 17 00:00:00 2001 From: William Tumeo Date: Sat, 27 Feb 2016 23:57:46 -0300 Subject: [PATCH 183/205] Remove wrong line in the sample --- samples/Ren'Py/example.rpy | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/samples/Ren'Py/example.rpy b/samples/Ren'Py/example.rpy index 90c3c286..71e34b97 100644 --- a/samples/Ren'Py/example.rpy +++ b/samples/Ren'Py/example.rpy @@ -1421,7 +1421,4 @@ init: # $ renpy.pause(1.0) # hide text with dissolve # -# return - - -Return to the tutorial. +# return \ No newline at end of file From 8fea8a0b47fc547b7a9c4fad10e91aa0da9d1322 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Mon, 29 Feb 2016 07:53:48 -0700 Subject: [PATCH 184/205] Grammar update --- vendor/grammars/Sublime-Inform/.gitignore | 2 + .../Inform7/book.sublime-snippet | 6 + .../Inform7/chapter.sublime-snippet | 6 + .../Inform7/door.sublime-snippet | 7 + .../Inform7/inform7.JSON-tmLanguage | 34 ++ .../Sublime-Inform/Inform7/inform7.tmLanguage | 74 +++ .../Inform7/object.sublime-snippet | 8 + .../Inform7/part.sublime-snippet | 6 + .../Inform7/room.sublime-snippet | 7 + .../Inform7/scene.sublime-snippet | 11 + .../Inform7/section.sublime-snippet | 6 + .../Inform7/volume.sublime-snippet | 6 + vendor/grammars/Sublime-Inform/LICENSE.txt | 21 + vendor/grammars/Sublime-Inform/README.md | 8 + .../Commands/Save to CSS.tmCommand | 47 ++ .../Commands/Save to Minified CSS.tmCommand | 47 ++ .../Insert inline Image.tmDragCommand | 38 ++ .../Preferences/Comment.tmPreferences | 36 ++ vendor/grammars/less.tmbundle/README.md | 25 + .../less.tmbundle/Syntaxes/LESS.tmLanguage | 434 ++++++++++++++++++ vendor/grammars/less.tmbundle/info.plist | 26 ++ 21 files changed, 855 insertions(+) create mode 100644 vendor/grammars/Sublime-Inform/.gitignore create mode 100644 vendor/grammars/Sublime-Inform/Inform7/book.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/chapter.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/door.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/inform7.JSON-tmLanguage create mode 100755 vendor/grammars/Sublime-Inform/Inform7/inform7.tmLanguage create mode 100644 vendor/grammars/Sublime-Inform/Inform7/object.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/part.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/room.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/scene.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/section.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/Inform7/volume.sublime-snippet create mode 100644 vendor/grammars/Sublime-Inform/LICENSE.txt create mode 100644 vendor/grammars/Sublime-Inform/README.md create mode 100644 vendor/grammars/less.tmbundle/Commands/Save to CSS.tmCommand create mode 100644 vendor/grammars/less.tmbundle/Commands/Save to Minified CSS.tmCommand create mode 100644 vendor/grammars/less.tmbundle/DragCommands/Insert inline Image.tmDragCommand create mode 100644 vendor/grammars/less.tmbundle/Preferences/Comment.tmPreferences create mode 100644 vendor/grammars/less.tmbundle/README.md create mode 100644 vendor/grammars/less.tmbundle/Syntaxes/LESS.tmLanguage create mode 100644 vendor/grammars/less.tmbundle/info.plist diff --git a/vendor/grammars/Sublime-Inform/.gitignore b/vendor/grammars/Sublime-Inform/.gitignore new file mode 100644 index 00000000..9bea4330 --- /dev/null +++ b/vendor/grammars/Sublime-Inform/.gitignore @@ -0,0 +1,2 @@ + +.DS_Store diff --git a/vendor/grammars/Sublime-Inform/Inform7/book.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/book.sublime-snippet new file mode 100644 index 00000000..d00b609b --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/book.sublime-snippet @@ -0,0 +1,6 @@ + + + book + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/chapter.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/chapter.sublime-snippet new file mode 100644 index 00000000..344ae92d --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/chapter.sublime-snippet @@ -0,0 +1,6 @@ + + + chapter + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/door.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/door.sublime-snippet new file mode 100644 index 00000000..9504585b --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/door.sublime-snippet @@ -0,0 +1,7 @@ + + + door + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/inform7.JSON-tmLanguage b/vendor/grammars/Sublime-Inform/Inform7/inform7.JSON-tmLanguage new file mode 100644 index 00000000..e5b6e92b --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/inform7.JSON-tmLanguage @@ -0,0 +1,34 @@ +{ "name": "Inform7", + "scopeName": "source.Inform7", + "fileTypes": ["i7x"], + "patterns": [ + { "name": "keyword.control.Inform7", + "match": "\\b(Include|Release)\\b" + }, + { "name" : "comment.block.Inform7", + "begin" : "\\[", + "end" : "\\]", + "comment" : "All comments in Inform7 are delimited this way." + }, + { "name" : "string.quoted.double.Inform7", + "begin" : "\"", + "end" : "\"", + "patterns": [ + { "name" : "keyword.operator.Inform7", + "begin" : "\\[", + "end" : "\\]", + "comment" : "For logic inside of strings." + } + ] + }, + { "name" : "storage.type.Inform7", + "match" : "(Volume|Book|Chapter|Part|Section|Table)\\s+\\d?\\s+-?\\s+((?:\\w|\\s|-)*)", + "comment": "Matches headings for major sections in Inform7" + }, + { "name": "constant.numeric.Inform7", + "match": "([0-9])+", + "comment":"Gotta call out the numbers!" + } + ], + "uuid": "0c4cbdee-beb7-4ea6-af56-27246d479373" +} \ No newline at end of file diff --git a/vendor/grammars/Sublime-Inform/Inform7/inform7.tmLanguage b/vendor/grammars/Sublime-Inform/Inform7/inform7.tmLanguage new file mode 100755 index 00000000..5609885e --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/inform7.tmLanguage @@ -0,0 +1,74 @@ + + + + + fileTypes + + i7x + inform + ni + + name + Inform7 + patterns + + + match + \b(Include|Release)\b + name + keyword.control.Inform7 + + + begin + \[ + comment + All comments in Inform7 are delimited this way. + end + \] + name + comment.block.Inform7 + + + begin + " + end + " + name + string.quoted.double.Inform7 + patterns + + + begin + \[ + comment + For logic inside of strings. + end + \] + name + keyword.operator.Inform7 + + + + + comment + Matches headings for major sections in Inform7 + match + (Volume|Book|Chapter|Part|Section|Table)\s+\d?\s+-?\s+((?:\w|\s|-)*) + name + storage.type.Inform7 + + + comment + Gotta call out the numbers! + match + ([0-9])+ + name + constant.numeric.Inform7 + + + scopeName + source.Inform7 + uuid + 0c4cbdee-beb7-4ea6-af56-27246d479373 + + diff --git a/vendor/grammars/Sublime-Inform/Inform7/object.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/object.sublime-snippet new file mode 100644 index 00000000..65f040af --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/object.sublime-snippet @@ -0,0 +1,8 @@ + + + object + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/part.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/part.sublime-snippet new file mode 100644 index 00000000..9e161cca --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/part.sublime-snippet @@ -0,0 +1,6 @@ + + + part + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/room.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/room.sublime-snippet new file mode 100644 index 00000000..b6abef45 --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/room.sublime-snippet @@ -0,0 +1,7 @@ + + + room + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/scene.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/scene.sublime-snippet new file mode 100644 index 00000000..fd4be030 --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/scene.sublime-snippet @@ -0,0 +1,11 @@ + + + scene + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/section.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/section.sublime-snippet new file mode 100644 index 00000000..7ab043cb --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/section.sublime-snippet @@ -0,0 +1,6 @@ + + + section + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/Inform7/volume.sublime-snippet b/vendor/grammars/Sublime-Inform/Inform7/volume.sublime-snippet new file mode 100644 index 00000000..0721fcbf --- /dev/null +++ b/vendor/grammars/Sublime-Inform/Inform7/volume.sublime-snippet @@ -0,0 +1,6 @@ + + + volume + source.Inform7 + diff --git a/vendor/grammars/Sublime-Inform/LICENSE.txt b/vendor/grammars/Sublime-Inform/LICENSE.txt new file mode 100644 index 00000000..cda6f052 --- /dev/null +++ b/vendor/grammars/Sublime-Inform/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Nate Dickson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/grammars/Sublime-Inform/README.md b/vendor/grammars/Sublime-Inform/README.md new file mode 100644 index 00000000..3b907f1e --- /dev/null +++ b/vendor/grammars/Sublime-Inform/README.md @@ -0,0 +1,8 @@ +#Inform7 Package for Sublime Text 2 +This package has a lot of little files that make Inform7 easier to edit in Sublime Text 2. that's why it's called what it is, you see. +##Usage +Grab the zip file, unzip it, and put it in your ```Packages``` Directory. +That's pretty much it. Open an ```i7x``` file in Sublime Text 2 and it'll be all highlighted and there's a bunch of snippets you can use and all that. + +##Want to submit a pull request for this readme file? +Please, please do. \ No newline at end of file diff --git a/vendor/grammars/less.tmbundle/Commands/Save to CSS.tmCommand b/vendor/grammars/less.tmbundle/Commands/Save to CSS.tmCommand new file mode 100644 index 00000000..9f8e7561 --- /dev/null +++ b/vendor/grammars/less.tmbundle/Commands/Save to CSS.tmCommand @@ -0,0 +1,47 @@ + + + + + beforeRunningCommand + saveActiveFile + command + #!/usr/bin/env ruby18 + +file = ENV["TM_FILEPATH"] +target = file.sub(/\.less$/, ".css") +system("lessc \"#{file}\" \"#{target}\"") +puts "Compiled CSS to '#{target}'" + input + document + inputFormat + text + keyEquivalent + @b + name + Save to CSS + outputCaret + afterOutput + outputFormat + text + outputLocation + toolTip + requiredCommands + + + command + lessc + locations + + /opt/local/bin/lessc + /usr/local/bin/lessc + + + + scope + source.css.less + uuid + 78788223-5E5E-434E-98BE-17BCDF600611 + version + 2 + + diff --git a/vendor/grammars/less.tmbundle/Commands/Save to Minified CSS.tmCommand b/vendor/grammars/less.tmbundle/Commands/Save to Minified CSS.tmCommand new file mode 100644 index 00000000..fc8fe21f --- /dev/null +++ b/vendor/grammars/less.tmbundle/Commands/Save to Minified CSS.tmCommand @@ -0,0 +1,47 @@ + + + + + beforeRunningCommand + saveActiveFile + command + #!/usr/bin/env ruby18 + +file = ENV["TM_FILEPATH"] +target = file.sub(/\.less$/, ".css") +system("lessc -x \"#{file}\" \"#{target}\"") +puts "Compiled Minified CSS to '#{target}'" + input + document + inputFormat + text + keyEquivalent + ~@b + name + Save to Minified CSS + outputCaret + afterOutput + outputFormat + text + outputLocation + toolTip + requiredCommands + + + command + lessc + locations + + /opt/local/bin/lessc + /usr/local/bin/lessc + + + + scope + source.css.less + uuid + 448D3A8D-260E-4949-BA33-654886ECDCAF + version + 2 + + diff --git a/vendor/grammars/less.tmbundle/DragCommands/Insert inline Image.tmDragCommand b/vendor/grammars/less.tmbundle/DragCommands/Insert inline Image.tmDragCommand new file mode 100644 index 00000000..21ce88f4 --- /dev/null +++ b/vendor/grammars/less.tmbundle/DragCommands/Insert inline Image.tmDragCommand @@ -0,0 +1,38 @@ + + + + + beforeRunningCommand + nop + command + #!/usr/bin/env php +<?php +$path = getenv('TM_DROPPED_FILE'); +$path_parts = pathinfo($path); +$info = getimagesize($path); +list($width, $height) = $info; +$mime = $info['mime']; +$contents = base64_encode(file_get_contents($path)); + +echo "@gfx-{$path_parts['filename']}: \"data:{$mime};base64,{$contents}\";\n"; +echo "@gfx-{$path_parts['filename']}-width: {$width}px;\n"; +echo "@gfx-{$path_parts['filename']}-height: {$height}px;"; + draggedFileExtensions + + png + jpeg + jpg + gif + + input + selection + name + Insert inline Image + output + insertAsSnippet + scope + source.css.less + uuid + 7B0CA307-CC1C-4EE2-9F63-4825800ACDA7 + + diff --git a/vendor/grammars/less.tmbundle/Preferences/Comment.tmPreferences b/vendor/grammars/less.tmbundle/Preferences/Comment.tmPreferences new file mode 100644 index 00000000..1d8bf1fe --- /dev/null +++ b/vendor/grammars/less.tmbundle/Preferences/Comment.tmPreferences @@ -0,0 +1,36 @@ + + + + + name + Comments + scope + source.css.less + settings + + shellVariables + + + name + TM_COMMENT_START + value + // + + + name + TM_COMMENT_START_2 + value + /* + + + name + TM_COMMENT_END_2 + value + */ + + + + uuid + D0CC551B-751D-4A7C-A738-2513E3C7F285 + + diff --git a/vendor/grammars/less.tmbundle/README.md b/vendor/grammars/less.tmbundle/README.md new file mode 100644 index 00000000..ed6ac672 --- /dev/null +++ b/vendor/grammars/less.tmbundle/README.md @@ -0,0 +1,25 @@ +# Installation + +You can install this bundle in TextMate by opening the preferences and going to the bundles tab. After installation it will be automatically updated for you. + +# License (MIT) + +Copyright (c) 2010 Scott Kyle and Rasmus Andersson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/grammars/less.tmbundle/Syntaxes/LESS.tmLanguage b/vendor/grammars/less.tmbundle/Syntaxes/LESS.tmLanguage new file mode 100644 index 00000000..ac6ff8ba --- /dev/null +++ b/vendor/grammars/less.tmbundle/Syntaxes/LESS.tmLanguage @@ -0,0 +1,434 @@ + + + + + comment + LeSS + fileTypes + + less + + foldingStartMarker + /\*\*(?!\*)|\{\s*($|/\*(?!.*?\*/.*\S)) + foldingStopMarker + (?<!\*)\*\*/|^\s*\} + keyEquivalent + ^~L + name + LESS + patterns + + + match + \b(a|abbr|acronym|address|applet|article|area|audio|video|b|base|big|blockquote|body|br|button|caption|canvas|center|cite|code|col|colgroup|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figure|figcaption|form|frame|frameset|(h[1-6])|head|hr|html|i|iframe|img|input|ins|kbd|label|legend|li|link|map|mark|meta|menu|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|q|ruby|s|samp|script|select|small|span|strike|strong|style|sub|sup|summary|svg|table|tbody|td|textarea|tfoot|th|thead|title|tr|tt|u|ul|var|header|section|footer|aside|hgroup|time)\b + name + keyword.control.html.elements + + + begin + " + beginCaptures + + 0 + + name + punctuation.definition.string.begin.css + + + end + " + endCaptures + + 0 + + name + punctuation.definition.string.end.css + + + name + string.quoted.double.css + patterns + + + match + \\. + name + constant.character.escaped.css + + + + + begin + ' + beginCaptures + + 0 + + name + punctuation.definition.string.begin.css + + + end + ' + endCaptures + + 0 + + name + punctuation.definition.string.end.css + + + name + string.quoted.single.css + patterns + + + match + \\. + name + constant.character.escaped.css + + + + + captures + + 1 + + name + entity.other.attribute-name.class.css + + + match + (\.[a-zA-Z0-9_-]+) + + + begin + url\( + contentName + variable.parameter.url + end + \) + name + support.function.any-method.builtin.css + + + match + (#)([0-9a-fA-F]{3}|[0-9a-fA-F]{6})\b + name + constant.other.rgb-value.css + + + captures + + 0 + + name + entity.other.attribute-name.id + + + match + #[a-zA-Z0-9_:\(\)-]+ + name + meta.selector.css + + + begin + /\* + beginCaptures + + 0 + + name + punctuation.definition.comment.begin.css + + + end + \*/ + endCaptures + + 0 + + name + punctuation.definition.comment.end.css + + + name + comment.block.css + + + match + (-|\+)?\s*[0-9]+(\.[0-9]+)? + name + constant.numeric.css + + + match + (?<=[\d])(px|pt|cm|mm|in|em|ex|pc)\b|% + name + keyword.other.unit.css + + + captures + + 1 + + name + entity.other.attribute-name.pseudo-element.css + + + match + (:+(after|before|not|last-child|nth-of-type|nth-child|first-child|first-letter|first-line|selection|root)) + + + captures + + 1 + + name + entity.other.attribute-name.pseudo-class.css + + + match + (:+(active|hover|link|visited|focus)) + + + captures + + 1 + + name + punctuation.definition.entity.css + + 2 + + name + entity.other.attribute-name.attribute.css + + 3 + + name + punctuation.separator.operator.css + + 4 + + name + string.unquoted.attribute-value.css + + 5 + + name + string.quoted.double.attribute-value.css + + 6 + + name + punctuation.definition.string.begin.css + + 7 + + name + punctuation.definition.string.end.css + + + match + (?i)(\[)\s*(-?[_a-z\\[[:^ascii:]]][_a-z0-9\-\\[[:^ascii:]]]*)(?:\s*([~|^$*]?=)\s*(?:(-?[_a-z\\[[:^ascii:]]][_a-z0-9\-\\[[:^ascii:]]]*)|((?>(['"])(?:[^\\]|\\.)*?(\6)))))?\s*(\]) + name + meta.attribute-selector.css + + + captures + + 1 + + name + keyword.control.at-rule.import.css + + 2 + + name + punctuation.definition.keyword.css + + + match + ^\s*((@)import\b) + name + meta.at-rule.import.css + + + captures + + 1 + + name + support.type.property-name.css.vendor + + + match + (-(?:webkit|moz|khtml|o|icab|ms)-(?:background-size|border-radius|box-shadow|opacity|border-image))\s*: + + + captures + + 1 + + name + support.type.property-name.css + + + match + \b(azimuth|background-attachment|background-color|background-clip|background-image|background-position|background-repeat|background-size|background|behavior|border-bottom-color|border-bottom-style|border-bottom-width|border-bottom|border-collapse|border-color|border-left-color|border-left-style|border-left-width|border-left|border-right-color|border-right-style|border-right-width|border-right|border-spacing|border-style|border-top-color|border-top-style|border-top-width|border-top|border-width|border-radius|border|box-shadow|bottom|caption-side|clear|clip|color|content|counter-increment|counter-reset|cue-after|cue-before|cue|cursor|direction|display|elevation|empty-cells|filter|float|font-family|font-size-adjust|font-size|font-stretch|font-style|font-variant|font-weight|font|height|left|letter-spacing|line-height|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|marker-offset|margin|marks|max-height|max-width|min-height|min-width|opacity|orphans|outline-color|outline-style|outline-width|outline|overflow(-[xy])?|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page|pause-after|pause-before|pause|pitch-range|pitch|play-during|position|pre-wrap|quotes|richness|right|size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|stress|table-layout|text-align|text-decoration|text-indent|text-shadow|text-transform|top|unicode-bidi|vertical-align|visibility|voice-family|volume|white-space|widows|width|word-spacing|word-wrap|z-index|zoom) + + + match + \b(absolute|all-scroll|always|auto|baseline|below|bidi-override|block|bold|bolder|both|bottom|break-all|break-word|capitalize|center|char|circle|col-resize|collapse|crosshair|dashed|decimal|default|disabled|disc|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ellipsis|fixed|groove|hand|help|hidden|horizontal|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|inactive|inherit|inline-block|inline|inset|inside|inter-ideograph|inter-word|italic|justify|keep-all|left|lighter|line-edge|line-through|line|linear|list-item|loose|lower-alpha|lower-roman|lowercase|lr-tb|ltr|medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|solid|square|static|strict|super|sw-resize|table-footer-group|table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|transparent|underline|upper-alpha|upper-roman|uppercase|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|padding-box)\b + name + support.constant.property-value.css + + + match + (\b(?i:arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace)\b) + name + support.constant.font-name.css + + + comment + http://www.w3.org/TR/CSS21/syndata.html#value-def-color + match + \b(aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)\b + name + support.constant.color.w3c-standard-color-name.css + + + match + \b(saturate|desaturate|lighten|darken|grayscale)\b + name + support.function.any-method.builtin.less + + + match + \b(rgb|rgba|hsl|hsla|url)\b + name + support.function.any-method.builtin.css + + + captures + + 1 + + name + support.function.any-method.vendor.css + + + match + (-(?:webkit|moz|khtml|o|icab)-(?:gradient|linear-gradient)) + + + match + \b(color-stop|from|to)\b + name + support.function.any-method.webkit.gradient.css + + + captures + + 1 + + name + support.function.less + + + match + (\.[a-zA-Z0-9_-]+)\s*(;|\() + + + begin + (^[ \t]+)?(?=//) + beginCaptures + + 1 + + name + punctuation.whitespace.comment.leading.less + + + end + (?!\G) + patterns + + + begin + // + beginCaptures + + 0 + + name + punctuation.definition.comment.less + + + end + \n + name + comment.line.double-slash.less + + + + + match + @[a-zA-Z0-9_-][\w-]* + name + variable.other.less + + + match + \$|%|&|\*|\-\-|\-|\+\+|\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\|\||\?\:|\*=|(?<!\()/=|%=|\+=|\-=|&=|\^=|\/\b + name + keyword.operator.less + + + captures + + 1 + + name + punctuation.section.property-list.begin.css + + 2 + + name + punctuation.section.property-list.end.css + + + comment + Match empty braces to give proper ↩ action + match + (\{)(\}) + name + meta.brace.curly.less + + + match + \{|\} + name + meta.brace.curly.less + + + match + \(|\) + name + meta.brace.round.less + + + match + \[|\] + name + meta.brace.square.less + + + scopeName + source.css.less + uuid + 9343D324-75A1-4733-A5C0-5D1D4B6182D0 + + diff --git a/vendor/grammars/less.tmbundle/info.plist b/vendor/grammars/less.tmbundle/info.plist new file mode 100644 index 00000000..e555f0ba --- /dev/null +++ b/vendor/grammars/less.tmbundle/info.plist @@ -0,0 +1,26 @@ + + + + + contactEmailRot13 + zfurrgf@juvgrsnyyf.bet + contactName + Michael Sheets + description + Extends CSS with dynamic behavior such as variables, mixins, operations and functions. + mainMenu + + items + + 78788223-5E5E-434E-98BE-17BCDF600611 + 448D3A8D-260E-4949-BA33-654886ECDCAF + + submenus + + + name + LESS + uuid + D1D51EE5-E89F-4B14-8AE4-FC364E540B47 + + From 54fab9eb4ed6a3a9bfa36d1c28aaff2aaeea51a8 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Mon, 29 Feb 2016 07:55:43 -0700 Subject: [PATCH 185/205] Bumping to v4.7.6 --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index bc1707a9..7bb4af7b 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.7.5" + VERSION = "4.7.6" end From ae27c71d5a9416a0c85f8ca96f0e772355d4133d Mon Sep 17 00:00:00 2001 From: Michael Zhou Date: Mon, 29 Feb 2016 20:35:57 -0500 Subject: [PATCH 186/205] Add BUCK filename to Python in languages.yml BUCK is the filename for the build files of the Facebook Buck build system. BUCK files are valid Python files. Eg.: https://github.com/GerritCodeReview/gerrit/blob/master/BUCK Also add a missing sample for Pants / Bazel BUILD files. They are also valid Python files. --- lib/linguist/languages.yml | 3 ++- samples/Python/filenames/BUCK | 31 +++++++++++++++++++++++ samples/Python/filenames/BUILD | 45 ++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 samples/Python/filenames/BUCK create mode 100644 samples/Python/filenames/BUILD diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 49194cbf..a4f4d3a6 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -474,7 +474,7 @@ CSS: color: "#563d7c" extensions: - .css - + CSV: type: data ace_mode: text @@ -2854,6 +2854,7 @@ Python: - .wsgi - .xpy filenames: + - BUCK - BUILD - SConscript - SConstruct diff --git a/samples/Python/filenames/BUCK b/samples/Python/filenames/BUCK new file mode 100644 index 00000000..9657ff3a --- /dev/null +++ b/samples/Python/filenames/BUCK @@ -0,0 +1,31 @@ +include_defs('//tools/build.defs') + +gerrit_war(name = 'gerrit') +gerrit_war(name = 'gwtgerrit', ui = 'ui_dbg') +gerrit_war(name = 'headless', ui = None) +gerrit_war(name = 'chrome', ui = 'ui_chrome') +gerrit_war(name = 'firefox', ui = 'ui_firefox') +gerrit_war(name = 'safari', ui = 'ui_safari') +gerrit_war(name = 'polygerrit', ui = 'polygerrit') +gerrit_war(name = 'withdocs', docs = True) +gerrit_war(name = 'release', ui = 'ui_optdbg_r', docs = True, context = ['//plugins:core'], visibility = ['//tools/maven:']) + +API_DEPS = [ + '//gerrit-acceptance-framework:acceptance-framework', + '//gerrit-acceptance-framework:acceptance-framework-src', + '//gerrit-acceptance-framework:acceptance-framework-javadoc', + '//gerrit-extension-api:extension-api', + '//gerrit-extension-api:extension-api-src', + '//gerrit-extension-api:extension-api-javadoc', + '//gerrit-plugin-api:plugin-api', + '//gerrit-plugin-api:plugin-api-src', + '//gerrit-plugin-api:plugin-api-javadoc', + '//gerrit-plugin-gwtui:gwtui-api', + '//gerrit-plugin-gwtui:gwtui-api-src', + '//gerrit-plugin-gwtui:gwtui-api-javadoc', +] + +zip_file( + name = 'api', + srcs = API_DEPS, +) diff --git a/samples/Python/filenames/BUILD b/samples/Python/filenames/BUILD new file mode 100644 index 00000000..92057751 --- /dev/null +++ b/samples/Python/filenames/BUILD @@ -0,0 +1,45 @@ +package(default_visibility = ["//scripts/release:__pkg__"]) + +filegroup( + name = "git", + srcs = glob([".git/**"]), +) + +filegroup( + name = "dummy", + visibility = ["//visibility:public"], +) + +filegroup( + name = "srcs", + srcs = glob( + ["**"], + exclude = [ + "bazel-*/**", + "output/**", + ".*/**", + ], + ) + [ + "//examples:srcs", + "//scripts:srcs", + "//site:srcs", + "//src:srcs", + "//tools:srcs", + "//third_party:srcs", + ], + visibility = ["//visibility:private"], +) + +load("//tools/build_defs/pkg:pkg.bzl", "pkg_tar") + +pkg_tar( + name = "bazel-srcs", + files = [":srcs"], + strip_prefix = ".", + # Public but bazel-only visibility. + visibility = ["//:__subpackages__"], +) + +load("//tools/build_rules/go:def.bzl", "go_prefix") + +go_prefix("github.com/bazelbuild/bazel") From ca4ea03828b0444c046e6f5526b147a070a365ea Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 3 Mar 2016 19:15:09 -0500 Subject: [PATCH 187/205] Recognizing Jenkinsfile as Groovy source. --- lib/linguist/languages.yml | 2 ++ lib/linguist/vendor.yml | 3 ++ samples/Groovy/filenames/Jenkinsfile | 46 ++++++++++++++++++++++++++++ test/test_file_blob.rb | 3 ++ 4 files changed, 54 insertions(+) create mode 100644 samples/Groovy/filenames/Jenkinsfile diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 49194cbf..117f2f79 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1310,6 +1310,8 @@ Groovy: - .gvy interpreters: - groovy + filenames: + - Jenkinsfile Groovy Server Pages: type: programming diff --git a/lib/linguist/vendor.yml b/lib/linguist/vendor.yml index 294f312b..15001e98 100644 --- a/lib/linguist/vendor.yml +++ b/lib/linguist/vendor.yml @@ -302,3 +302,6 @@ # Android Google APIs - (^|/)\.google_apis/ + +# Jenkins Pipeline +- ^Jenkinsfile$ diff --git a/samples/Groovy/filenames/Jenkinsfile b/samples/Groovy/filenames/Jenkinsfile new file mode 100644 index 00000000..582306c4 --- /dev/null +++ b/samples/Groovy/filenames/Jenkinsfile @@ -0,0 +1,46 @@ +jettyUrl = 'http://localhost:8081/' + +def servers + +stage 'Dev' +node { + checkout scm + servers = load 'servers.groovy' + mvn '-o clean package' + dir('target') {stash name: 'war', includes: 'x.war'} +} + +stage 'QA' +parallel(longerTests: { + runTests(servers, 30) +}, quickerTests: { + runTests(servers, 20) +}) + +stage name: 'Staging', concurrency: 1 +node { + servers.deploy 'staging' +} + +input message: "Does ${jettyUrl}staging/ look good?" + +stage name: 'Production', concurrency: 1 +node { + sh "wget -O - -S ${jettyUrl}staging/" + echo 'Production server looks to be alive' + servers.deploy 'production' + echo "Deployed to ${jettyUrl}production/" +} + +def mvn(args) { + sh "${tool 'Maven 3.x'}/bin/mvn ${args}" +} + +def runTests(servers, duration) { + node { + checkout scm + servers.runWithServer {id -> + mvn "-o -f sometests test -Durl=${jettyUrl}${id}/ -Dduration=${duration}" + } + } +} diff --git a/test/test_file_blob.rb b/test/test_file_blob.rb index ebb0b7fc..1b83a0fb 100644 --- a/test/test_file_blob.rb +++ b/test/test_file_blob.rb @@ -522,6 +522,9 @@ class TestBlob < Minitest::Test assert sample_blob("myapp/My Template.xctemplate/___FILEBASENAME___.h").vendored? assert sample_blob("myapp/My Images.xcassets/some/stuff.imageset/Contents.json").vendored? assert !sample_blob("myapp/MyData.json").vendored? + + # Jenkins + assert sample_blob("Jenkinsfile").vendored? end def test_documentation From b2e3ea233468a1a30ac1b67a3980fea67838948b Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Tue, 8 Mar 2016 21:56:01 -0600 Subject: [PATCH 188/205] Adding ace_mode back for M4Sugar --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 27aaa75e..442117a0 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2024,6 +2024,7 @@ M4Sugar: filenames: - configure.ac tm_scope: none + ace_mode: text MAXScript: type: programming From 5b72b4d3533fd931b183756c262158c10540d670 Mon Sep 17 00:00:00 2001 From: Mike Linksvayer Date: Tue, 8 Mar 2016 21:05:55 -0800 Subject: [PATCH 189/205] move note about grammar repos from LICENSE to README.md --- LICENSE | 6 ------ README.md | 8 ++++++++ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/LICENSE b/LICENSE index 7981307b..f09a7d0a 100644 --- a/LICENSE +++ b/LICENSE @@ -1,9 +1,3 @@ -The language grammars included in this gem are covered by their repositories' -respective licenses. See https://github.com/github/linguist/blob/master/grammars.yml -to determine the repository for each grammar. - -All other files are covered by the following license: - Copyright (c) 2011-2014 GitHub, Inc. Permission is hereby granted, free of charge, to any person diff --git a/README.md b/README.md index c2c803a8..2a5e7520 100644 --- a/README.md +++ b/README.md @@ -194,3 +194,11 @@ If you are the current maintainer of this gem: 0. Merge github/linguist PR 0. Tag and push: `git tag vx.xx.xx; git push --tags` 0. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem` + +## License + +The language grammars included in this gem are covered by their repositories' +respective licenses. `grammars.yml` specifies the repository for each grammar. + +All other files are covered by the MIT license, see `LICENSE`. + From eacc48e8c7ad5c595b26268ab64fabae7eee7ea1 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Mon, 4 May 2015 09:29:38 +0200 Subject: [PATCH 190/205] Add .me to Groff file extensions. --- lib/linguist/languages.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 442117a0..6f0bf16e 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1290,6 +1290,7 @@ Groff: - '.8' - '.9' - .l + - .me - .ms - .n - .rno From 11a3b5b73cf0029e51e50b48a29bdb2ee3524ec7 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 9 Mar 2016 10:37:41 +0100 Subject: [PATCH 191/205] Support for Text extension .nb (Norwegian text) --- lib/linguist/languages.yml | 1 + samples/Text/aptitude-defaults.nb | 41 ++ samples/Text/tutor.nb | 973 ++++++++++++++++++++++++++++++ 3 files changed, 1015 insertions(+) create mode 100644 samples/Text/aptitude-defaults.nb create mode 100644 samples/Text/tutor.nb diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 442117a0..0171e1aa 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3572,6 +3572,7 @@ Text: extensions: - .txt - .fr + - .nb - .ncl tm_scope: none ace_mode: text diff --git a/samples/Text/aptitude-defaults.nb b/samples/Text/aptitude-defaults.nb new file mode 100644 index 00000000..67c37f59 --- /dev/null +++ b/samples/Text/aptitude-defaults.nb @@ -0,0 +1,41 @@ +Pakker uten en bestemt bolk\n Disse pakkene tilhører ingen bestemt bolk. Kanskje det er noe feil ved dem? +Virtuelle pakker\n Disse pakkene finnes ikke, de er navn som andre pakker bruker for å oppnå en eller annen egenskap. +Pakker som setter opp systemet ditt til å utføre en bestemt oppgave\n Pakkene i bolken «oppgaver» inneholder ingen filer, det kan hende de bare er avhengige av andre pakker. Disse pakkene gjør det mulig å installere pakker for en bestemt oppgave på en lett måte. +Administrative verktøy\n Pakkene i bolken «admin» gjør det mulig å utføre administrative oppgaver, som å installere programmer, opprette eller slette brukere, vise informasjon om systemet eller nettverkstrafikken osv. +Pakker som er laget av pakker i et annet format (rpm, tgz mm)\n Pakkene i bolken «alien» ble laget av programmet «alien» fra et annet format enn Debians eget pakkeformat, f.eks fra RPM-pakker +Debians grunnsystem\n Pakkene i bolken «grunnsystem» hører med til første del av Debian-installasjonen. +Programmer for faksmodem og andre kommunikasjonsenheter\n Pakkene i bolken «Kommunikasjon» brukes til å styre modemer og andre enheter på maskinen, deriblant programvare for styring av faksmodemer (for eksempel, PPP for oppringt internettforbindelse og programmer som opprinnelig er skrevet for dette, slik som zmodem og kermit), og programmer for å styre mobiltelefoner, snakke med FidoNet og kjøre et BBS. +Verktøy og programmer for programvareutvikling\n Pakker i seksjonen «utvikling» blir brukt til å skrive nye programmer og for å jobbe med videre med programmer som allerede er laget. Vanlige brukere som ikke kompilerer (setter sammen) sine egne programmer trenger neppe så mange programmer herfra.\n .\n Her finner du kompilatorer, avlusingsverktøy, skriveprogrammer som hjelper til med programmeringen, verktøy for håndtering av kildekode og andre ting som har med utvikling av programmer å gjøre. +Dokumentasjon og spesialiserte program for visning av dokumentasjon\n Pakker i «dok»-seksjonen dokumenterer deler av Debian-systemet eller viser fram dokumenter i forskjellige format. +Skriveprogram og tekstbehandlere\n Pakker i bolken «skriveprogram» lar deg redigere ren ASCII-tekst. Dette er nødvendigvis ikke tekstbehandlere, selv om du kan finne noen av dem her i denne bolken. +Program for å jobba med elektronikk og elektriske kretser\n Pakker i «elektronikk»-seksjonen inneholder verktøy for design av elektriske kretser, simulatorer og assemblere for mikrokontrollere og andre liknende programmer. +Programmer for innebygde systemer\nPakker i bolken «innebygd» er ment til å kjøre på innebygde systemer. Dette er spesialisert maskinvare med mye mindre datakraft enn en typisk skrivebordssystem, for eksempel en PDA, en mobiltelefon eller en Tivo. +Skrivebordssystemet GNOME\n GNOME er en samling programvare som danner et lettbrukt skrivbordsmiljø for Linux. Pakker i «gnome»-bolken er enten deler av GNOME-miljøet eller tett sammenvevd med det. +Spill, leketøy og andre programmer som bare er for gøy\n Pakker i «spill»-bolken er stort sett bare til for underholdningens skyld. +Verktøy for å lage, vise og redigere grafikkfiler\n Pakker i «grafikk»-bolken er programmer for visning av bildefiler, bildebehandlingsprogrammer, støtteprogrammer for forskjellig utstyr (som videokort, skanner og digitalt kamera) og programmeringsverktøy for å håndtere grafikk. +Programvare for radioamatører\n Pakker i «hamradio»-bolken er stort sett ment for radioamatører. +Programmer som kjører skriptspråk\n Pakker i «tolkeprogram»-bolken er programmer som kompilerer og kjører språk som Python, Perl og Ruby, og som sørger for standardbibliotek for disse språkene. +Skrivebordssystemet KDE\n KDE er en samling programvare som danner et lettbrukt skrivbordsmiljø for Linux. Pakker i «kde»-bolken er enten deler av KDE-miljøet eller tett sammenvevd med det. +Utviklingsfiler for biblioteker\n Pakker i «libdevel»-bolken inneholder filer som trengs for å lage programmer som bruker biblioteker i «libs»-bolken. Du trenger ikke pakker fra denne bolken hvis du ikke har tenkt å lage programmer selv. +Samling av programvarerutiner\n Pakker i «libs»-seksjonen sørger for nødvendige funksjoner som er felles for andre programmer på maskinen. Med svært få unntak skal det ikke værenødvendig å be om at slike pakker blir installert. Pakkesystemet sørger for å installere dem når de andre programmene trenger dem. +Perl-tolker og biblioteker\n Pakker i «perl»-bolken sørger for programmeringsspråket Perl og mange tredjeparts-biblioteker til Perl. Hvis du ikke er Perl-programmerer selv, så trenger du ikke uttrykkelig installere pakker fra denne bolken, pakkesystemet installerer dem selv hvis det er nødvendig. +Python-tolker og biblioteker\n Pakker i «python»-bolken sørger for programmeringsspråket Python og mange tredjeparts-biblioteker til det. Hvis du ikke er Python-programmerer selv, så trenger du ikke uttrykkelig installere pakker fra denne bolken, pakkesystemet installerer dem selv hvis det er nødvendig. +Program for å skrive, sende og omdirigere epostmeldinger\n Pakker i «epost»-bolken inneholder epostlesere, nisser som flytter eposten dit den skal, programvare for epostlister og filter for søppelpost. Det fins også diverse andre programmer som gjør noe med elektronisk post, men som ikke er så lette å plassere i grupper. +Numerisk analyse og andre matematikkrelaterte programmer\n Blant pakker i «matte»-bolken fins kalkulatorer, språk for matematiske utregninger, symbolsk algebra og programmer for å tegne ut matematiske objekter. +Ymse programvare\n Pakker i «ymse»-bolken er ofte vanskelige å klassifisere, men det betyr ikke at de ikke finnes. +Programmer for å koble til og tilby ulike tjenester i et nettverk\n Blant pakker i «nett»-bolken finner du klienter og tjenere for mange protokoller, verktøy for å manipulere og avluse lavnivå nettverksprotokoller, system for direkte meldingstjeneste og andre nettverksrelaterte programmer. +Klienter og tjenere for Usenet\n Pakker i bolken «nyheter» henger sammen med til det distribuerte nyhetssystemet Usenet. Seksjonen tjenere og leseprogrammer (klienter) for dette systemet. +Foreldede programbibliotek\n Pakker i bolken «gamle bibliotek» er foreldede og bør ikke brukes i ny programvare. De er tilgjengelige for at eldre programmer som er avhengige av programmene her fortsatt skal kunne virke.\n .\n Du skal normalt ikke behøve å be om å få installert pakker herfra. Pakkesystemet vil ta med disse pakkene når andre pakker krever det. +Programmer som etterlikner andre datasystemer og og programmer som hjelper deg med å lese fremmede filsystem\n Pakker i bolken «andreosfs» etterlikner maskinvare og operativsystem og tilbyr verktøy for å overføre data mellom ulike operativsystem og maskinvareplattformer. (For eksempel verktøy for å lese DOS-disketter, og verktøy til å kommunisere med håndholdte maskiner som Palm Pilot)\n .\n Programmer for å brenne CD-plater er også med i denne seksjonen. +Programvare for vitenskaplig arbeid\n Pakker i «vitenskap»-bolken er verktøy for astronomi, biologi og kjemi, pluss andre programmer man bruker i vitenskapelig arbeide. +Kommandoskall og alternative konsollmiljø\n Pakker i «skall» er programmer som tilbyr grensesnitt med kommandolinje. +Verktøy for å spille av og ta opp lyd\nI «lyd»-bolken finner du lydavspillere, opptakere, lydkomprimeringsprogram for mange format, miksere og lydstyring, program for MIDI-sekvenser og program for å lage noter. Her finner du også drivere for lydkort og programmer for lydprosessering. +TeX typografi-systemet\n Pakker i bolken «tex» er deler i et system for å produsere utskrifter og andre slags utdata med høy typografisk kvalitet. Det omfatter selve TeX, TeX-pakker, skriveprogrammer som hjelper deg med å lage dokumenter i TeX, verktøy for å gjøre om TeX og TeX utdatafiler til ulike andre format, TeX-skrifttyper og annen programvare knyttet TeX. +Tekstverktøy\n I bolken «tekst» finner du skriveprogrammer og tekstfiltere, stavekontroll, ordbøker og verktøy for å oversette mellom tegnkoding og tekst-filformater (for eksempel Unix og DOS) og programmer for å formatere, skrive ut og redigere som ren tekst. +Forskjellige systemverktøy\n Pakkene i bolken «verktøy» har oppgaver som faller utenfor de andre kategoriene. +Nettlesere, tjenere, mellomtjenere og andre verktøy\n I bolken «nett» finner du blant annet nettlesere, tjenere og mellomtjenere, programmer for å skrive CGI-skript eller nettbaserte programmer og andre programmer som har med verdensveven å gjøre. +Vindussystemet «X» og beslektede programmer\n Pakkene i bolken «X11» inneholder også grunnpakka for vindussystemet «X», vindusbehandlere, verktøy for X og andre programmer med en X-grensesnitt som ble plassert her fordi de ikke passet inn noen andre steder. +Debians hovedarkiv\n Selve Debian-distribusjonen består av pakker fra hovedbolken. Alle pakkene her er fri programvare.\n .\n For mer informasjon om hva Debian mener med «fri programvare», se http://www.debian.org/social_contract#guidelines + Programmer som avhenger av programvare utenfor Debian.\n Pakker i bolken«bidrag» er ikke med i Debian.\n\n Disse pakkene er fri programvare, men de avhenger av programmer som ikke er en del av Debian. Dette kan skyldes at de ikke er fri programvare og ligger i bolken «ufri» i pakkearkivet, og disse kan Debian slett ikke distribuere, eller - i noen sjeldne tilfeller - at ingen har laget en pakke av dette ennå.\n .\n For mer informasjon om hva Debian mener med «fri programvare», se http://www.debian.org/social_contract#guidelines +Programmer som ikke er fri programvare \n Pakkene i bolken «ufri» er ikke en del av Debian\n .\n Disse pakkene passet ikke med en eller flere av betingelsene i Debians retningslinjer for fri programvare (Debian Free Software Guidelines; se nedenfor). Du bør lese lisensen for programmene i denne bolken for å være sikker på at du har rett til å bruke dem slik du har tenkt.\n .\n For mer informasjon om hva Debian mener med «Fri programvare», se http://www.debian.org/social_contract#guidelines +Programmer som er lagret utenfor USA på grunn av eksportforbud.\n Det er stor sjanse for at pakkene i «utenfor USA» inneholder kryptografi, og noen få av dem inneholder patenterte algoritmer. På grunn av dette kan de ikke eksporteres ut av USA, og lagres derfor på en tjener i «den frie verden».\n .\n Merk: Debian-prosjektet er, etter samtale med eksperter på rettsvesenet om nye endringer i eksporteringsreglene, i ferd med å flette kryptografiske programmer inn i de USA-baserte arkivene. De fleste pakkene som før lå i denne bolken er derfor flyttet til «hoved». \ No newline at end of file diff --git a/samples/Text/tutor.nb b/samples/Text/tutor.nb new file mode 100644 index 00000000..242119c7 --- /dev/null +++ b/samples/Text/tutor.nb @@ -0,0 +1,973 @@ +=============================================================================== += V e l k o m m e n t i l i n n f ø r i n g e n i V i m -- Ver. 1.7 = +=============================================================================== + + Vim er en meget kraftig editor med mange kommandoer, alt for mange til å + kunne gå gjennom alle i en innføring som denne. Den er beregnet på å + sette deg inn i bruken av nok kommandoer så du vil være i stand til lett + å kunne bruke Vim som en editor til alle formål. + + Tiden som kreves for å gå gjennom denne innføringen tar ca. 25-30 + minutter, avhengig av hvor mye tid du bruker til eksperimentering. + + MERK: + Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne + filen som du kan øve deg på (hvis du kjørte Ŧvimtutorŧ-kommandoen, er + dette allerede en kopi). + + Det er viktig å huske at denne innføringen er beregnet på læring gjennom + bruk. Det betyr at du må utføre kommandoene for å lære dem skikkelig. + Hvis du bare leser teksten, vil du glemme kommandoene! + + Først av alt, sjekk at ŦCaps Lockŧ IKKE er aktiv og trykk Ŧjŧ-tasten for + å flytte markøren helt til leksjon 1.1 fyller skjermen. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.1: FLYTTING AV MARKØREN + + + ** For å flytte markøren, trykk tastene h, j, k, l som vist. ** + ^ + k Tips: h-tasten er til venstre og flytter til venstre. + < h l > l-tasten er til høyre og flytter til høyre. + j j-tasten ser ut som en pil som peker nedover. + v + 1. Flytt markøren rundt på skjermen til du har fått det inn i fingrene. + + 2. Hold inne nedovertasten (j) til den repeterer. + Nå vet du hvordan du beveger deg til neste leksjon. + + 3. Gå til leksjon 1.2 ved hjelp av nedovertasten. + +Merk: Hvis du blir usikker på noe du har skrevet, trykk for å gå til + normalmodus. Skriv deretter kommandoen du ønsket på nytt. + +Merk: Piltastene skal også virke. Men ved å bruke hjkl vil du være i stand til + å bevege markøren mye raskere når du er blitt vant til det. Helt sant! + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.2: AVSLUTTE VIM + + + !! MERK: Før du utfører noen av punktene nedenfor, les hele leksjonen!! + + 1. Trykk -tasten (for å forsikre deg om at du er i normalmodus). + + 2. Skriv: :q! . + Dette avslutter editoren og FORKASTER alle forandringer som du har gjort. + + 3. Når du ser kommandolinjen i skallet, skriv kommandoen som startet denne + innføringen. Den er: vimtutor + + 4. Hvis du er sikker på at du husker dette, utfør punktene 1 til 3 for å + avslutte og starte editoren på nytt. + +MERK: :q! forkaster alle forandringer som du gjorde. I løpet av noen + få leksjoner vil du lære hvordan du lagrer forandringene til en fil. + + 5. Flytt markøren ned til leksjon 1.3. + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.3: REDIGERING AV TEKST -- SLETTING + + + ** Trykk x for å slette tegnet under markøren. ** + + 1. Flytt markøren til den første linjen merket med --->. + + 2. For å ordne feilene på linjen, flytt markøren til den er oppå tegnet som + skal slettes. + + 3. Trykk tasten x for å slette det uønskede tegnet. + + 4. Repeter punkt 2 til 4 til setningen er lik den som er under. + +---> Hessstennnn brrråsnudddde ii gaaata. +---> Hesten bråsnudde i gata. + + 5. Nå som linjen er korrekt, gå til leksjon 1.4. + +MERK: Når du går gjennom innføringen, ikke bare prøv å huske kommandoene, men + bruk dem helt til de sitter. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.4: REDIGERING AV TEKST -- INNSETTING + + + ** Trykk i for å sette inn tekst. ** + + 1. Flytt markøren til den første linjen som er merket med --->. + + 2. For å gjøre den første linjen lik den andre, flytt markøren til den står + på tegnet ETTER posisjonen der teksten skal settes inn. + + 3. Trykk i og skriv inn teksten som mangler. + + 4. Etterhvert som hver feil er fikset, trykk for å returnere til + normalmodus. Repeter punkt 2 til 4 til setningen er korrekt. + +---> Det er tkst som mnglr . +---> Det er ganske mye tekst som mangler her. + + 5. Når du føler deg komfortabel med å sette inn tekst, gå til oppsummeringen + nedenfor. + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL + + + ** Trykk A for å legge til tekst. ** + + 1. Flytt markøren til den første linjen nedenfor merket --->. + Det har ikke noe å si hvor markøren er plassert på den linjen. + + 2. Trykk A og skriv inn det som skal legges til. + + 3. Når teksten er lagt til, trykk for å returnere til normalmodusen. + + 4. Flytt markøren til den andre linjen markert med ---> og repeter steg 2 og + 3 for å reparere denne setningen. + +---> Det mangler noe tekst p + Det mangler noe tekst på denne linjen. +---> Det mangler også litt tek + Det mangler også litt tekst på denne linjen. + + 5. Når du føler at du behersker å legge til tekst, gå til leksjon 1.6. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.6: REDIGERE EN FIL + + + ** Bruk :wq for å lagre en fil og avslutte. ** + + !! MERK: Før du utfører noen av stegene nedenfor, les hele denne leksjonen!! + + 1. Avslutt denne innføringen som du gjorde i leksjon 1.2: :q! + + 2. Skriv denne kommandoen på kommandolinja: vim tutor + Ŧvimŧ er kommandoen for å starte Vim-editoren, Ŧtutorŧ er navnet på fila + som du vil redigere. Bruk en fil som kan forandres. + + 3. Sett inn og slett tekst som du lærte i de foregående leksjonene. + + 4. Lagre filen med forandringene og avslutt Vim med: :wq + + 5. Start innføringen på nytt og flytt ned til oppsummeringen som følger. + + 6. Etter å ha lest og forstått stegene ovenfor: Sett i gang. + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 1 + + + 1. Markøren beveges ved hjelp av piltastene eller hjkl-tastene. + h (venstre) j (ned) k (opp) l (høyre) + + 2. For å starte Vim fra skall-kommandolinjen, skriv: vim FILNAVN + + 3. For å avslutte Vim, skriv: :q! for å forkaste endringer. + ELLER skriv: :wq for å lagre forandringene. + + 4. For å slette tegnet under markøren, trykk: x + + 5. For å sette inn eller legge til tekst, trykk: + i skriv innsatt tekst sett inn før markøren + A skriv tillagt tekst legg til på slutten av linjen + +MERK: Når du trykker går du til normalmodus eller du avbryter en uønsket + og delvis fullført kommando. + + Nå kan du gå videre til leksjon 2. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.1: SLETTEKOMMANDOER + + + ** Trykk dw for å slette et ord. ** + + 1. Trykk for å være sikker på at du er i normalmodus. + + 2. Flytt markøren til den første linjen nedenfor merket --->. + + 3. Flytt markøren til begynnelsen av ordet som skal slettes. + + 4. Trykk dw og ordet vil forsvinne. + +MERK: Bokstaven d vil komme til syne på den nederste linjen på skjermen når + du skriver den. Vim venter på at du skal skrive w . Hvis du ser et annet + tegn enn d har du skrevet noe feil; trykk og start på nytt. + +---> Det er agurk tre ord eple som ikke hører pære hjemme i denne setningen. +---> Det er tre ord som ikke hører hjemme i denne setningen. + + 5. Repeter punkt 3 og 4 til den første setningen er lik den andre. Gå + deretter til leksjon 2.2. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.2: FLERE SLETTEKOMMANDOER + + + ** Trykk d$ for å slette til slutten av linjen. ** + + 1. Trykk for å være sikker på at du er i normalmodus. + + 2. Flytt markøren til linjen nedenfor merket --->. + + 3. Flytt markøren til punktet der linjen skal kuttes (ETTER første punktum). + + 4. Trykk d$ for å slette alt til slutten av linjen. + +---> Noen skrev slutten på linjen en gang for mye. linjen en gang for mye. + + 5. Gå til leksjon 2.3 for å forstå hva som skjer. + + + + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.3: OM OPERATORER OG BEVEGELSER + + + Mange kommandoer som forandrer teksten er laget ut i fra en operator og en + bevegelse. Formatet for en slettekommando med sletteoperatoren d er: + + d bevegelse + + Der: + d - er sletteoperatoren. + bevegelse - er hva operatoren vil opere på (listet nedenfor). + + En kort liste med bevegelser: + w - til starten av det neste ordet, UNNTATT det første tegnet. + e - til slutten av det nåværende ordet, INKLUDERT det siste tegnet. + $ - til slutten av linjen, INKLUDERT det siste tegnet. + + Ved å skrive de vil altså alt fra markøren til slutten av ordet bli + slettet. + +MERK: Ved å skrive kun bevegelsen i normalmodusen uten en operator vil + markøren flyttes som spesifisert. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE + + + ** Ved å skrive et tall foran en bevegelse repeterer den så mange ganger. ** + + 1. Flytt markøren til starten av linjen markert ---> nedenfor. + + 2. Skriv 2w for å flytte markøren to ord framover. + + 3. Skriv 3e for å flytte markøren framover til slutten av det tredje + ordet. + + 4. Skriv 0 (null) for å flytte til starten av linjen. + + 5. Repeter steg 2 og 3 med forskjellige tall. + +---> Dette er en linje med noen ord som du kan bevege deg rundt på. + + 6. Gå videre til leksjon 2.5. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.5: BRUK AV ANTALL FOR Å SLETTE MER + + + ** Et tall sammen med en operator repeterer den så mange ganger. ** + + I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du + inn antall før bevegelsen for å slette mer: + d nummer bevegelse + + 1. Flytt markøren til det første ordet med STORE BOKSTAVER på linjen markert + med --->. + + 2. Skriv 2dw for å slette de to ordene med store bokstaver. + + 3. Repeter steg 1 og 2 med forskjelling antall for å slette de etterfølgende + ordene som har store bokstaver. + +---> Denne ABC DE linjen FGHI JK LMN OP er nå Q RS TUV litt mer lesbar. + +MERK: Et antall mellom operatoren d og bevegelsen virker på samme måte som å + bruke bevegelsen uten en operator. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.6: OPERERE PÅ LINJER + + + ** Trykk dd for å slette en hel linje. ** + + På grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at + det vil være lettere å rett og slett trykke to d-er for å slette en linje. + + 1. Flytt markøren til den andre linjen i verset nedenfor. + 2. Trykk dd å slette linjen. + 3. Flytt deretter til den fjerde linjen. + 4. Trykk 2dd for å slette to linjer. + +---> 1) Roser er røde, +---> 2) Gjørme er gøy, +---> 3) Fioler er blå, +---> 4) Jeg har en bil, +---> 5) Klokker viser tiden, +---> 6) Druer er søte +---> 7) Og du er likeså. + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.7: ANGRE-KOMMANDOEN + + + ** Trykk u for å angre siste kommando, U for å fikse en hel linje. ** + + 1. Flytt markøren til linjen nedenfor merket ---> og plasser den på den + første feilen. + 2. Trykk x for å slette det første uønskede tegnet. + 3. Trykk så u for å angre den siste utførte kommandoen. + 4. Deretter ordner du alle feilene på linjene ved å bruke kommandoen x . + 5. Trykk nå en stor U for å sette linjen tilbake til det den var + originalt. + 6. Trykk u noen ganger for å angre U og foregående kommandoer. + 7. Deretter trykker du CTRL-R (hold CTRL nede mens du trykker R) noen + ganger for å gjenopprette kommandoene (omgjøre angrekommandoene). + +---> RReparer feiilene påå denne linnnjen oog erssstatt dem meed angre. + + 8. Dette er meget nyttige kommandoer. Nå kan du gå til oppsummeringen av + leksjon 2. + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 2 + + + 1. For å slette fra markøren fram til det neste ordet, trykk: dw + 2. For å slette fra markøren til slutten av en linje, trykk: d$ + 3. For å slette en hel linje, trykk: dd + + 4. For å repetere en bevegelse, sett et nummer foran: 2w + 5. Formatet for en forandringskommando er: + operator [nummer] bevegelse + der: + operator - hva som skal gjøres, f.eks. d for å slette + [nummer] - et valgfritt antall for å repetere bevegelsen + bevegelse - hva kommandoen skal operere på, eksempelvis w (ord), + $ (til slutten av linjen) og så videre. + + 6. For å gå til starten av en linje, bruk en null: 0 + + 7. For å angre tidligere endringer, skriv: u (liten u) + For å angre alle forandringer på en linje, skriv: U (stor U) + For å omgjøre angringen, trykk: CTRL-R + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 3.1: ŦLIM INNŧ-KOMMANDOEN + + + ** Trykk p for å lime inn tidligere slettet tekst etter markøren ** + + 1. Flytt markøren til den første linjen med ---> nedenfor. + + 2. Trykk dd for å slette linjen og lagre den i et Vim-register. + + 3. Flytt markøren til c)-linjen, OVER posisjonen linjen skal settes inn. + + 4. Trykk p for å legge linjen under markøren. + + 5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkefølge. + +---> d) Kan du også lære? +---> b) Fioler er blå, +---> c) Intelligens må læres, +---> a) Roser er røde, + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 3.2: ŦERSTATTŧ-KOMMANDOEN + + + ** Trykk rx for å erstatte tegnet under markøren med x. ** + + 1. Flytt markøren til den første linjen nedenfor merket --->. + + 2. Flytt markøren så den står oppå den første feilen. + + 3. Trykk r og deretter tegnet som skal være der. + + 4. Repeter punkt 2 og 3 til den første linjen er lik den andre. + +---> Da dfnne lynjxn ble zkrevet, var det nøen som tjykket feite taster! +---> Da denne linjen ble skrevet, var det noen som trykket feile taster! + + 5. Gå videre til leksjon 3.2. + +MERK: Husk at du bør lære ved å BRUKE, ikke pugge. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 3.3: ŦFORANDREŧ-OPERATOREN + + + ** For å forandre til slutten av et ord, trykk ce . ** + + 1. Flytt markøren til den første linjen nedenfor som er merket --->. + + 2. Plasser markøren på u i Ŧlubjwrŧ. + + 3. Trykk ce og det korrekte ordet (i dette tilfellet, skriv Ŧinjenŧ). + + 4. Trykk og gå til det neste tegnet som skal forandres. + + 5. Repeter punkt 3 og 4 helt til den første setningen er lik den andre. + +---> Denne lubjwr har noen wgh som må forkwåp med Ŧforækzryasŧ-kommandoen. +---> Denne linjen har noen ord som må forandres med Ŧforandreŧ-kommandoen. + +Vær oppmerksom på at ce sletter ordet og går inn i innsettingsmodus. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 3.4: FLERE FORANDRINGER VED BRUK AV c + + + ** Forandringskommandoen blir brukt med de samme bevegelser som Ŧslettŧ. ** + + 1. Forandringsoperatoren fungerer på samme måte som Ŧslettŧ. Formatet er: + + c [nummer] bevegelse + + 2. Bevegelsene er de samme, som for eksempel w (ord) og $ (slutten av en + linje). + + 3. Gå til den første linjen nedenfor som er merket --->. + + 4. Flytt markøren til den første feilen. + + 5. Skriv c$ og skriv resten av linjen lik den andre og trykk . + +---> Slutten på denne linjen trenger litt hjelp for å gjøre den lik den neste. +---> Slutten på denne linjen trenger å bli rettet ved bruk av c$-kommandoen. + +MERK: Du kan bruke slettetasten for å rette feil mens du skriver. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 3 + + + 1. For å legge tilbake tekst som nettopp er blitt slettet, trykk p . Dette + limer inn den slettede teksten ETTER markøren (hvis en linje ble slettet + vil den bli limt inn på linjen under markøren). + + 2. For å erstatte et tegn under markøren, trykk r og deretter tegnet som + du vil ha der. + + 3. Forandringsoperatoren lar deg forandre fra markøren til dit bevegelsen + tar deg. Det vil si, skriv ce for å forandre fra markøren til slutten + av ordet, c$ for å forandre til slutten av linjen. + + 4. Formatet for Ŧforandreŧ er: + + c [nummer] bevegelse + +Nå kan du gå til neste leksjon. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 4.1: POSISJONERING AV MARKØREN OG FILSTATUS + + ** Trykk CTRL-G for å vise posisjonen i filen og filstatusen. + Trykk G for å gå til en spesifikk linje i filen. ** + + Merk: Les hele leksjonen før du utfører noen av punktene! + + 1. Hold nede Ctrl-tasten og trykk g . Vi kaller dette CTRL-G. En melding + vil komme til syne på bunnen av skjermen med filnavnet og posisjonen i + filen. Husk linjenummeret for bruk i steg 3. + +Merk: Du kan se markørposisjonen i nederste høyre hjørne av skjermen. Dette + skjer når Ŧrulerŧ-valget er satt (forklart i leksjon 6). + + 2. Trykk G for å gå til bunnen av filen. + Skriv gg for å gå til begynnelsen av filen. + + 3. Skriv inn linjenummeret du var på og deretter G . Dette vil føre deg + tilbake til linjen du var på da du først trykket CTRL-G. + + 4. Utfør steg 1 til 3 hvis du føler deg sikker på prosedyren. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 4.2: SØKEKOMMANDOEN + + ** Skriv / etterfulgt av en søkestreng som du vil lete etter. ** + + 1. Trykk / når du er i normalmodusen. Legg merke til at skråstreken og + markøren kommer til syne på bunnen av skjermen i likhet med + Ŧ:ŧ-kommandoene. + + 2. Skriv Ŧfeeeiilŧ og trykk . Dette er teksten du vil lete etter. + + 3. For å finne neste forekomst av søkestrengen, trykk n . + For å lete etter samme søketeksten i motsatt retning, trykk N . + + 4. For å lete etter en tekst bakover i filen, bruk ? istedenfor / . + + 5. For å gå tilbake til der du kom fra, trykk CTRL-O (Hold Ctrl nede mens + du trykker bokstaven o ). Repeter for å gå enda lengre tilbake. CTRL-I + går framover. + +---> Ŧfeeeiilŧ er ikke måten å skrive Ŧfeilŧ på, feeeiil er helt feil. +Merk: Når søkingen når slutten av filen, vil den fortsette fra starten unntatt + hvis Ŧwrapscanŧ-valget er resatt. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 4.3: FINN SAMSVARENDE PARENTESER + + + ** Trykk % for å finne en samsvarende ), ] eller } . ** + + 1. Plasser markøren på en (, [ eller { på linjen nedenfor merket --->. + + 2. Trykk % . + + 3. Markøren vil gå til den samsvarende parentesen eller hakeparentesen. + + 4. Trykk % for å flytte markøren til den andre samsvarende parentesen. + + 5. Flytt markøren til en annen (, ), [, ], { eller } og se hva % gjør. + +---> Dette ( er en testlinje med (, [ ] og { } i den )). + +Merk: Dette er veldig nyttig til feilsøking i programmer som har ubalansert + antall parenteser! + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 4.4: ERSTATT-KOMMANDOEN + + + ** Skriv :s/gammel/ny/g for å erstatte Ŧgammelŧ med Ŧnyŧ. ** + + 1. Flytt markøren til linjen nedenfor som er merket med --->. + + 2. Skriv :s/deen/den/ . Legg merke til at denne kommandoen bare + forandrer den første forekomsten av Ŧdeenŧ på linjen. + + 3. Skriv :s/deen/den/g . Når g-flagget legges til, betyr dette global + erstatning på linjen og erstatter alle forekomster av Ŧdeenŧ på linjen. + +---> deen som kan kaste deen tyngste steinen lengst er deen beste + + 4. For å erstatte alle forekomster av en tekststreng mellom to linjer, + skriv :#,#s/gammel/ny/g der #,# er linjenumrene på de to linjene for + linjeområdet erstatningen skal gjøres. + Skriv :%s/gammel/ny/g for å erstatte tekst i hele filen. + Skriv :%s/gammel/ny/gc for å finne alle forekomster i hele filen, og + deretter spørre om teksten skal erstattes eller + ikke. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 4 + + + 1. Ctrl-G viser nåværende posisjon i filen og filstatusen. + G går til slutten av filen. + nummer G går til det linjenummeret. + gg går til den første linjen. + + 2. Skriv / etterfulgt av en søketekst for å lete FRAMOVER etter teksten. + Skriv ? etterfulgt av en søketekst for å lete BAKOVER etter teksten. + Etter et søk kan du trykke n for å finne neste forekomst i den samme + retningen eller N for å lete i motsatt retning. + CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner. + + 3. Skriv % når markøren står på en (, ), [, ], { eller } for å finne den + som samsvarer. + + 4. Erstatte Ŧgammelŧ med første Ŧnyŧ på en linje: :s/gammel/ny + Erstatte alle Ŧgammelŧ med Ŧnyŧ på en linje: :s/gammel/ny/g + Erstatte tekst mellom to linjenumre: :#,#s/gammel/ny/g + Erstatte alle forekomster i en fil: :%s/gammel/ny/g + For å godkjenne hver erstatning, legg til Ŧcŧ: :%s/gammel/ny/gc +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 5.1: HVORDAN UTFØRE EN EKSTERN KOMMANDO + + + ** Skriv :! etterfulgt av en ekstern kommando for å utføre denne. ** + + 1. Skriv den velkjente kommandoen : for å plassere markøren på bunnen av + skjermen. Dette lar deg skrive en kommandolinjekommando. + + 2. Nå kan du skrive tegnet ! . Dette lar deg utføre en hvilken som helst + ekstern kommando. + + 3. Som et eksempel, skriv ls etter utropstegnet og trykk . Du vil + nå få en liste over filene i katalogen, akkurat som om du hadde kjørt + kommandoen direkte fra kommandolinjen i skallet. Eller bruk :!dir hvis + Ŧlsŧ ikke virker. + +MERK: Det er mulig å kjøre alle eksterne kommandoer på denne måten, også med + parametere. + +MERK: Alle Ŧ:ŧ-kommandoer må avsluttes med . Fra dette punktet er det + ikke alltid vi nevner det. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 5.2: MER OM LAGRING AV FILER + + + ** For å lagre endringene gjort i en tekst, skriv :w FILNAVN. ** + + 1. Skriv :!dir eller :!ls for å få en liste over filene i katalogen. Du + vet allerede at du må trykke etter dette. + + 2. Velg et filnavn på en fil som ikke finnes, som for eksempel TEST . + + 3. Skriv :w TEST (der TEST er filnavnet du velger). + + 4. Dette lagrer hele filen (denne innføringen) under navnet TEST . For å + sjekke dette, skriv :!dir eller :!ls igjen for å se innholdet av + katalogen. + +Merk: Hvis du nå hadde avsluttet Vim og startet på nytt igjen med Ŧvim TESTŧ, + ville filen vært en eksakt kopi av innføringen da du lagret den. + + 5. Fjern filen ved å skrive :!rm TEST hvis du er på et Unix-lignende + operativsystem, eller :!del TEST hvis du bruker MS-DOS. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES + + + ** For å lagre en del av en fil, skriv v bevegelse :w FILNAVN ** + + 1. Flytt markøren til denne linjen. + + 2. Trykk v og flytt markøren til det femte elementet nedenfor. Legg merke + til at teksten blir markert. + + 3. Trykk : (kolon). På bunnen av skjermen vil :'<,'> komme til syne. + + 4. Trykk w TEST , der TEST er et filnavn som ikke finnes enda. Kontroller + at du ser :'<,'>w TEST før du trykker Enter. + + 5. Vim vil skrive de valgte linjene til filen TEST. Bruk :!dir eller :!ls + for å se den. Ikke slett den enda! Vi vil bruke den i neste leksjon. + +MERK: Ved å trykke v startes visuelt valg. Du kan flytte markøren rundt for + å gjøre det valgte området større eller mindre. Deretter kan du bruke en + operator for å gjøre noe med teksten. For eksempel sletter d teksten. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 5.4: HENTING OG SAMMENSLÅING AV FILER + + + ** For å lese inn en annen fil inn i nåværende buffer, skriv :r FILNAVN ** + + 1. Plasser markøren like over denne linjen. + +MERK: Etter å ha utført steg 2 vil du se teksten fra leksjon 5.3. Gå deretter + NED for å se denne leksjonen igjen. + + 2. Hent TEST-filen ved å bruke kommandoen :r TEST der TEST er navnet på + filen du brukte. Filen du henter blir plassert nedenfor markørlinjen. + + 3. For å sjekke at filen ble hentet, gå tilbake og se at det er to kopier av + leksjon 5.3, originalen og denne versjonen. + +MERK: Du kan også lese utdataene av en ekstern kommando. For eksempel, :r !ls + leser utdataene av ls-kommandoen og legger dem nedenfor markøren. + + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 5 + + + 1. :!kommando utfører en ekstern kommandio. + + Noen nyttige eksempler er: + (MS-DOS) (Unix) + :!dir :!ls - List filene i katalogen. + :!del FILNAVN :!rm FILNAVN - Slett filen FILNAVN. + + 2. :w FILNAVN skriver den nåværende Vim-filen disken med navnet FILNAVN . + + 3. v bevegelse :w FILNAVN lagrer de visuelt valgte linjene til filen + FILNAVN. + + 4. :r FILNAVN henter filen FILNAVN og legger den inn nedenfor markøren. + + 5. :r !dir leser utdataene fra Ŧdirŧ-kommandoen og legger dem nedenfor + markørposisjonen. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 6.1: ŦÅPNE LINJEŧ-KOMMANDOEN + + + ** Skriv o for å Ŧåpne oppŧ for en ny linje etter markøren og gå til + innsettingsmodus ** + + 1. Flytt markøren til linjen nedenfor merket --->. + + 2. Skriv o (liten o) for å åpne opp en linje NEDENFOR markøren og gå inn i + innsettingsmodus. + + 3. Skriv litt tekst og trykk for å gå ut av innsettingsmodusen. + +---> Etter at o er skrevet blir markøren plassert på den tomme linjen. + + 4. For å åpne en ny linje OVER markøren, trykk rett og slett en stor O + istedenfor en liten o . Prøv dette på linjen nedenfor. + +---> Lag ny linje over denne ved å trykke O mens markøren er på denne linjen. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 6.2: ŦLEGG TILŧ-KOMMANDOEN + + + ** Skriv a for å legge til tekst ETTER markøren. ** + + 1. Flytt markøren til starten av linjen merket ---> nedenfor. + + 2. Trykk e til markøren er på slutten av Ŧliŧ. + + 3. Trykk a (liten a) for å legge til tekst ETTER markøren. + + 4. Fullfør ordet sånn som på linjen nedenfor. Trykk for å gå ut av + innsettingsmodusen. + + 5. Bruk e for å gå til det neste ufullstendige ordet og repeter steg 3 og + 4. + +---> Denne li lar deg øve på å leg til tek på en linje. +---> Denne linjen lar deg øve på å legge til tekst på en linje. + +Merk: a, i og A går alle til den samme innsettingsmodusen, den eneste + forskjellen er hvor tegnene blir satt inn. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 6.3: EN ANNEN MÅTE Å ERSTATTE PÅ + + + ** Skriv en stor R for å erstatte mer enn ett tegn. ** + + 1. Flytt markøren til den første linjen nedenfor merket --->. Flytt markøren + til begynnelsen av den første Ŧxxxŧ-en. + + 2. Trykk R og skriv inn tallet som står nedenfor på den andre linjen så + det erstatter xxx. + + 3. Trykk for å gå ut av erstatningsmodusen. Legg merke til at resten + av linjen forblir uforandret. + + 4. Repeter stegene for å erstatte den gjenværende xxx. + +---> Ved å legge 123 til xxx får vi xxx. +---> Ved å legge 123 til 456 får vi 579. + +MERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives + erstatter et eksisterende tegn. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 6.4: KOPIERE OG LIME INN TEKST + + + ** Bruk y-operatoren for å kopiere tekst og p for å lime den inn ** + + 1. Gå til linjen merket ---> nedenfor og plasser markøren etter Ŧa)ŧ. + + 2. Gå inn i visuell modus med v og flytt markøren til like før Ŧførsteŧ. + + 3. Trykk y for å kopiere (engelsk: Ŧyankŧ) den uthevede teksten. + + 4. Flytt markøren til slutten av den neste linjen: j$ + + 5. Trykk p for å lime inn teksten. Trykk deretter: a andre . + + 6. Bruk visuell modus for å velge Ŧ valget.ŧ, kopier det med y , gå til + slutten av den neste linjen med j$ og legg inn teksten der med p . + +---> a) Dette er det første valget. + b) + +Merk: Du kan også bruke y som en operator; yw kopierer ett ord. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 6.5: SETT VALG + + + ** Sett et valg så søk eller erstatning ignorerer store/små bokstaver. ** + + 1. Let etter Ŧignoreŧ ved å skrive: /ignore + Repeter flere ganger ved å trykke n . + + 2. Sett Ŧicŧ-valget (Ignore Case) ved å skrive: :set ic + + 3. Søk etter Ŧignoreŧ igjen ved å trykke n . + Legg merke til at både ŦIgnoreŧ og ŦIGNOREŧ blir funnet. + + 4. Sett Ŧhlsearchŧ- og Ŧincsearchŧ-valgene: :set hls is + + 5. Skriv søkekommandoen igjen og se hva som skjer: /ignore + + 6. For å slå av ignorering av store/små bokstaver, skriv: :set noic + +Merk: For å fjerne uthevingen av treff, skriv: :nohlsearch +Merk: Hvis du vil ignorere store/små bokstaver for kun en søkekommando, bruk + \c i uttrykket: /ignore\c +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 6 + + 1. Trykk o for å legge til en linje NEDENFOR markøren og gå inn i + innsettingsmodus. + Trykk O for å åpne en linje OVER markøren. + + 2. Skriv a for å sette inn tekst ETTER markøren. + Skriv A for å sette inn tekst etter slutten av linjen. + + 3. Kommandoen e går til slutten av et ord. + + 4. Operatoren y (Ŧyankŧ) kopierer tekst, p (Ŧpasteŧ) limer den inn. + + 5. Ved å trykke R går du inn i erstatningsmodus helt til trykkes. + + 6. Skriv Ŧ:set xxxŧ for å sette valget Ŧxxxŧ. Noen valg er: + Ŧicŧ Ŧignorecaseŧ ignorer store/små bokstaver under søk + Ŧisŧ Ŧincsearchŧ vis delvise treff for en søketekst + Ŧhlsŧ Ŧhlsearchŧ uthev alle søketreff + + 7. Legg til Ŧnoŧ foran valget for å slå det av: :set noic + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 7.1: FÅ HJELP + + + ** Bruk det innebygde hjelpesystemet. ** + + Vim har et omfattende innebygget hjelpesystem. For å starte det, prøv en av + disse måtene: + - Trykk Hjelp-tasten (hvis du har en) + - Trykk F1-tasten (hvis du har en) + - Skriv :help + + Les teksten i hjelpevinduet for å finne ut hvordan hjelpen virker. + Skriv CTRL-W CTRL-W for å hoppe fra et vindu til et annet + Skriv :q for å lukke hjelpevinduet. + + Du kan få hjelp for omtrent alle temaer om Vim ved å skrive et parameter til + Ŧ:helpŧ-kommandoen. Prøv disse (ikke glem å trykke ): + + :help w + :help c_CTRL-D + :help insert-index + :help user-manual +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 7.2: LAG ET OPPSTARTSSKRIPT + + + ** Slå på funksjoner i Vim ** + + Vim har mange flere funksjoner enn Vi, men flesteparten av dem er slått av + som standard. For å begynne å bruke flere funksjoner må du lage en + Ŧvimrcŧ-fil. + + 1. Start redigeringen av Ŧvimrcŧ-filen. Dette avhenger av systemet ditt: + :e ~/.vimrc for Unix + :e $VIM/_vimrc for MS Windows + + 2. Les inn eksempelfilen for Ŧvimrcŧ: + :r $VIMRUNTIME/vimrc_example.vim + + 3. Lagre filen med: + :w + + Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til + alle dine foretrukne oppsett i denne Ŧvimrcŧ-filen. + For mer informasjon, skriv :help vimrc-intro +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 7.3: FULLFØRING + + + ** Kommandolinjefullføring med CTRL-D og ** + + 1. Vær sikker på at Vim ikke er i Vi-kompatibel modus: :set nocp + + 2. Se hvilke filer som er i katalogen: :!ls eller :!dir + + 3. Skriv starten på en kommando: :e + + 4. Trykk CTRL-D og Vim vil vise en liste over kommandoer som starter med + Ŧeŧ. + + 5. Trykk og Vim vil fullføre kommandonavnet til Ŧ:editŧ. + + 6. Legg til et mellomrom og starten på et eksisterende filnavn: :edit FIL + + 7. Trykk . Vim vil fullføre navnet (hvis det er unikt). + +MERK: Fullføring fungerer for mange kommandoer. Prøv ved å trykke CTRL-D og + . Det er spesielt nyttig for bruk sammen med :help . +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 7 + + + 1. Skriv :help eller trykk eller for å åpne et hjelpevindu. + + 2. Skriv :help kommando for å få hjelp om kommando . + + 3. Trykk CTRL-W CTRL-W for å hoppe til et annet vindu. + + 4. Trykk :q for å lukke hjelpevinduet. + + 5. Opprett et vimrc-oppstartsskript for å lagre favorittvalgene dine. + + 6. Når du skriver en Ŧ:ŧ-kommando, trykk CTRL-D for å se mulige + fullføringer. Trykk for å bruke en fullføring. + + + + + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Her slutter innføringen i Vim. Den var ment som en rask oversikt over + editoren, akkurat nok til å la deg sette i gang med enkel bruk. Den er på + langt nær komplett, da Vim har mange flere kommandoer. Les bruksanvisningen + ved å skrive :help user-manual . + + For videre lesing og studier, kan denne boken anbefales: + ŦVim - Vi Improvedŧ av Steve Oualline + Utgiver: New Riders + Den første boken som er fullt og helt dedisert til Vim. Spesielt nyttig for + nybegynnere. Inneholder mange eksempler og illustrasjoner. + Se http://iccf-holland.org/click5.html + + Denne boken er eldre og handler mer om Vi enn Vim, men anbefales også: + ŦLearning the Vi Editorŧ av Linda Lamb + Utgiver: O'Reilly & Associates Inc. + Det er en god bok for å få vite omtrent hva som helst om Vi. + Den sjette utgaven inneholder også informasjon om Vim. + + Denne innføringen er skrevet av Michael C. Pierce og Robert K. Ware, + Colorado School of Mines med idéer av Charles Smith, Colorado State + University. E-mail: bware@mines.colorado.edu . + + Modifisert for Vim av Bram Moolenaar. + Oversatt av Øyvind A. Holm. E-mail: vimtutor _AT_ sunbase.org + Id: tutor.no 406 2007-03-18 22:48:36Z sunny + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vim: set ts=8 : From eeedd53f323aa5bd49f087a5476079f150e59a73 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 9 Mar 2016 10:38:47 +0100 Subject: [PATCH 192/205] Support for Text extension .no (Norwegian text) --- lib/linguist/languages.yml | 1 + samples/Text/tutor.no | 973 +++++++++++++++++++++++++++++++++++++ 2 files changed, 974 insertions(+) create mode 100644 samples/Text/tutor.no diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 0171e1aa..a78b40ae 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3574,6 +3574,7 @@ Text: - .fr - .nb - .ncl + - .no tm_scope: none ace_mode: text diff --git a/samples/Text/tutor.no b/samples/Text/tutor.no new file mode 100644 index 00000000..f9d49c2a --- /dev/null +++ b/samples/Text/tutor.no @@ -0,0 +1,973 @@ +=============================================================================== += V e l k o m m e n t i l i n n f ø r i n g e n i V i m -- Ver. 1.7 = +=============================================================================== + + Vim er en meget kraftig editor med mange kommandoer, alt for mange til å + kunne gå gjennom alle i en innføring som denne. Den er beregnet på å + sette deg inn i bruken av nok kommandoer så du vil være i stand til lett + å kunne bruke Vim som en editor til alle formål. + + Tiden som kreves for å gå gjennom denne innføringen tar ca. 25-30 + minutter, avhengig av hvor mye tid du bruker til eksperimentering. + + MERK: + Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne + filen som du kan øve deg på (hvis du kjørte «vimtutor»-kommandoen, er + dette allerede en kopi). + + Det er viktig å huske at denne innføringen er beregnet på læring gjennom + bruk. Det betyr at du må utføre kommandoene for å lære dem skikkelig. + Hvis du bare leser teksten, vil du glemme kommandoene! + + Først av alt, sjekk at «Caps Lock» IKKE er aktiv og trykk «j»-tasten for + å flytte markøren helt til leksjon 1.1 fyller skjermen. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.1: FLYTTING AV MARKØREN + + + ** For å flytte markøren, trykk tastene h, j, k, l som vist. ** + ^ + k Tips: h-tasten er til venstre og flytter til venstre. + < h l > l-tasten er til høyre og flytter til høyre. + j j-tasten ser ut som en pil som peker nedover. + v + 1. Flytt markøren rundt på skjermen til du har fått det inn i fingrene. + + 2. Hold inne nedovertasten (j) til den repeterer. + Nå vet du hvordan du beveger deg til neste leksjon. + + 3. Gå til leksjon 1.2 ved hjelp av nedovertasten. + +Merk: Hvis du blir usikker på noe du har skrevet, trykk for å gå til + normalmodus. Skriv deretter kommandoen du ønsket på nytt. + +Merk: Piltastene skal også virke. Men ved å bruke hjkl vil du være i stand til + å bevege markøren mye raskere når du er blitt vant til det. Helt sant! + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.2: AVSLUTTE VIM + + + !! MERK: Før du utfører noen av punktene nedenfor, les hele leksjonen!! + + 1. Trykk -tasten (for å forsikre deg om at du er i normalmodus). + + 2. Skriv: :q! . + Dette avslutter editoren og FORKASTER alle forandringer som du har gjort. + + 3. Når du ser kommandolinjen i skallet, skriv kommandoen som startet denne + innføringen. Den er: vimtutor + + 4. Hvis du er sikker på at du husker dette, utfør punktene 1 til 3 for å + avslutte og starte editoren på nytt. + +MERK: :q! forkaster alle forandringer som du gjorde. I løpet av noen + få leksjoner vil du lære hvordan du lagrer forandringene til en fil. + + 5. Flytt markøren ned til leksjon 1.3. + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.3: REDIGERING AV TEKST -- SLETTING + + + ** Trykk x for å slette tegnet under markøren. ** + + 1. Flytt markøren til den første linjen merket med --->. + + 2. For å ordne feilene på linjen, flytt markøren til den er oppå tegnet som + skal slettes. + + 3. Trykk tasten x for å slette det uønskede tegnet. + + 4. Repeter punkt 2 til 4 til setningen er lik den som er under. + +---> Hessstennnn brrråsnudddde ii gaaata. +---> Hesten bråsnudde i gata. + + 5. Nå som linjen er korrekt, gå til leksjon 1.4. + +MERK: Når du går gjennom innføringen, ikke bare prøv å huske kommandoene, men + bruk dem helt til de sitter. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.4: REDIGERING AV TEKST -- INNSETTING + + + ** Trykk i for å sette inn tekst. ** + + 1. Flytt markøren til den første linjen som er merket med --->. + + 2. For å gjøre den første linjen lik den andre, flytt markøren til den står + på tegnet ETTER posisjonen der teksten skal settes inn. + + 3. Trykk i og skriv inn teksten som mangler. + + 4. Etterhvert som hver feil er fikset, trykk for å returnere til + normalmodus. Repeter punkt 2 til 4 til setningen er korrekt. + +---> Det er tkst som mnglr . +---> Det er ganske mye tekst som mangler her. + + 5. Når du føler deg komfortabel med å sette inn tekst, gå til oppsummeringen + nedenfor. + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL + + + ** Trykk A for å legge til tekst. ** + + 1. Flytt markøren til den første linjen nedenfor merket --->. + Det har ikke noe å si hvor markøren er plassert på den linjen. + + 2. Trykk A og skriv inn det som skal legges til. + + 3. Når teksten er lagt til, trykk for å returnere til normalmodusen. + + 4. Flytt markøren til den andre linjen markert med ---> og repeter steg 2 og + 3 for å reparere denne setningen. + +---> Det mangler noe tekst p + Det mangler noe tekst på denne linjen. +---> Det mangler også litt tek + Det mangler også litt tekst på denne linjen. + + 5. Når du føler at du behersker å legge til tekst, gå til leksjon 1.6. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 1.6: REDIGERE EN FIL + + + ** Bruk :wq for å lagre en fil og avslutte. ** + + !! MERK: Før du utfører noen av stegene nedenfor, les hele denne leksjonen!! + + 1. Avslutt denne innføringen som du gjorde i leksjon 1.2: :q! + + 2. Skriv denne kommandoen på kommandolinja: vim tutor + «vim» er kommandoen for å starte Vim-editoren, «tutor» er navnet på fila + som du vil redigere. Bruk en fil som kan forandres. + + 3. Sett inn og slett tekst som du lærte i de foregående leksjonene. + + 4. Lagre filen med forandringene og avslutt Vim med: :wq + + 5. Start innføringen på nytt og flytt ned til oppsummeringen som følger. + + 6. Etter å ha lest og forstått stegene ovenfor: Sett i gang. + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 1 + + + 1. Markøren beveges ved hjelp av piltastene eller hjkl-tastene. + h (venstre) j (ned) k (opp) l (høyre) + + 2. For å starte Vim fra skall-kommandolinjen, skriv: vim FILNAVN + + 3. For å avslutte Vim, skriv: :q! for å forkaste endringer. + ELLER skriv: :wq for å lagre forandringene. + + 4. For å slette tegnet under markøren, trykk: x + + 5. For å sette inn eller legge til tekst, trykk: + i skriv innsatt tekst sett inn før markøren + A skriv tillagt tekst legg til på slutten av linjen + +MERK: Når du trykker går du til normalmodus eller du avbryter en uønsket + og delvis fullført kommando. + + Nå kan du gå videre til leksjon 2. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.1: SLETTEKOMMANDOER + + + ** Trykk dw for å slette et ord. ** + + 1. Trykk for å være sikker på at du er i normalmodus. + + 2. Flytt markøren til den første linjen nedenfor merket --->. + + 3. Flytt markøren til begynnelsen av ordet som skal slettes. + + 4. Trykk dw og ordet vil forsvinne. + +MERK: Bokstaven d vil komme til syne på den nederste linjen på skjermen når + du skriver den. Vim venter på at du skal skrive w . Hvis du ser et annet + tegn enn d har du skrevet noe feil; trykk og start på nytt. + +---> Det er agurk tre ord eple som ikke hører pære hjemme i denne setningen. +---> Det er tre ord som ikke hører hjemme i denne setningen. + + 5. Repeter punkt 3 og 4 til den første setningen er lik den andre. Gå + deretter til leksjon 2.2. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.2: FLERE SLETTEKOMMANDOER + + + ** Trykk d$ for å slette til slutten av linjen. ** + + 1. Trykk for å være sikker på at du er i normalmodus. + + 2. Flytt markøren til linjen nedenfor merket --->. + + 3. Flytt markøren til punktet der linjen skal kuttes (ETTER første punktum). + + 4. Trykk d$ for å slette alt til slutten av linjen. + +---> Noen skrev slutten på linjen en gang for mye. linjen en gang for mye. + + 5. Gå til leksjon 2.3 for å forstå hva som skjer. + + + + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.3: OM OPERATORER OG BEVEGELSER + + + Mange kommandoer som forandrer teksten er laget ut i fra en operator og en + bevegelse. Formatet for en slettekommando med sletteoperatoren d er: + + d bevegelse + + Der: + d - er sletteoperatoren. + bevegelse - er hva operatoren vil opere på (listet nedenfor). + + En kort liste med bevegelser: + w - til starten av det neste ordet, UNNTATT det første tegnet. + e - til slutten av det nåværende ordet, INKLUDERT det siste tegnet. + $ - til slutten av linjen, INKLUDERT det siste tegnet. + + Ved å skrive de vil altså alt fra markøren til slutten av ordet bli + slettet. + +MERK: Ved å skrive kun bevegelsen i normalmodusen uten en operator vil + markøren flyttes som spesifisert. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE + + + ** Ved å skrive et tall foran en bevegelse repeterer den så mange ganger. ** + + 1. Flytt markøren til starten av linjen markert ---> nedenfor. + + 2. Skriv 2w for å flytte markøren to ord framover. + + 3. Skriv 3e for å flytte markøren framover til slutten av det tredje + ordet. + + 4. Skriv 0 (null) for å flytte til starten av linjen. + + 5. Repeter steg 2 og 3 med forskjellige tall. + +---> Dette er en linje med noen ord som du kan bevege deg rundt på. + + 6. Gå videre til leksjon 2.5. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.5: BRUK AV ANTALL FOR Å SLETTE MER + + + ** Et tall sammen med en operator repeterer den så mange ganger. ** + + I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du + inn antall før bevegelsen for å slette mer: + d nummer bevegelse + + 1. Flytt markøren til det første ordet med STORE BOKSTAVER på linjen markert + med --->. + + 2. Skriv 2dw for å slette de to ordene med store bokstaver. + + 3. Repeter steg 1 og 2 med forskjelling antall for å slette de etterfølgende + ordene som har store bokstaver. + +---> Denne ABC DE linjen FGHI JK LMN OP er nå Q RS TUV litt mer lesbar. + +MERK: Et antall mellom operatoren d og bevegelsen virker på samme måte som å + bruke bevegelsen uten en operator. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.6: OPERERE PÅ LINJER + + + ** Trykk dd for å slette en hel linje. ** + + På grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at + det vil være lettere å rett og slett trykke to d-er for å slette en linje. + + 1. Flytt markøren til den andre linjen i verset nedenfor. + 2. Trykk dd å slette linjen. + 3. Flytt deretter til den fjerde linjen. + 4. Trykk 2dd for å slette to linjer. + +---> 1) Roser er røde, +---> 2) Gjørme er gøy, +---> 3) Fioler er blå, +---> 4) Jeg har en bil, +---> 5) Klokker viser tiden, +---> 6) Druer er søte +---> 7) Og du er likeså. + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 2.7: ANGRE-KOMMANDOEN + + + ** Trykk u for å angre siste kommando, U for å fikse en hel linje. ** + + 1. Flytt markøren til linjen nedenfor merket ---> og plasser den på den + første feilen. + 2. Trykk x for å slette det første uønskede tegnet. + 3. Trykk så u for å angre den siste utførte kommandoen. + 4. Deretter ordner du alle feilene på linjene ved å bruke kommandoen x . + 5. Trykk nå en stor U for å sette linjen tilbake til det den var + originalt. + 6. Trykk u noen ganger for å angre U og foregående kommandoer. + 7. Deretter trykker du CTRL-R (hold CTRL nede mens du trykker R) noen + ganger for å gjenopprette kommandoene (omgjøre angrekommandoene). + +---> RReparer feiilene påå denne linnnjen oog erssstatt dem meed angre. + + 8. Dette er meget nyttige kommandoer. Nå kan du gå til oppsummeringen av + leksjon 2. + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 2 + + + 1. For å slette fra markøren fram til det neste ordet, trykk: dw + 2. For å slette fra markøren til slutten av en linje, trykk: d$ + 3. For å slette en hel linje, trykk: dd + + 4. For å repetere en bevegelse, sett et nummer foran: 2w + 5. Formatet for en forandringskommando er: + operator [nummer] bevegelse + der: + operator - hva som skal gjøres, f.eks. d for å slette + [nummer] - et valgfritt antall for å repetere bevegelsen + bevegelse - hva kommandoen skal operere på, eksempelvis w (ord), + $ (til slutten av linjen) og så videre. + + 6. For å gå til starten av en linje, bruk en null: 0 + + 7. For å angre tidligere endringer, skriv: u (liten u) + For å angre alle forandringer på en linje, skriv: U (stor U) + For å omgjøre angringen, trykk: CTRL-R + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 3.1: «LIM INN»-KOMMANDOEN + + + ** Trykk p for å lime inn tidligere slettet tekst etter markøren ** + + 1. Flytt markøren til den første linjen med ---> nedenfor. + + 2. Trykk dd for å slette linjen og lagre den i et Vim-register. + + 3. Flytt markøren til c)-linjen, OVER posisjonen linjen skal settes inn. + + 4. Trykk p for å legge linjen under markøren. + + 5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkefølge. + +---> d) Kan du også lære? +---> b) Fioler er blå, +---> c) Intelligens må læres, +---> a) Roser er røde, + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 3.2: «ERSTATT»-KOMMANDOEN + + + ** Trykk rx for å erstatte tegnet under markøren med x. ** + + 1. Flytt markøren til den første linjen nedenfor merket --->. + + 2. Flytt markøren så den står oppå den første feilen. + + 3. Trykk r og deretter tegnet som skal være der. + + 4. Repeter punkt 2 og 3 til den første linjen er lik den andre. + +---> Da dfnne lynjxn ble zkrevet, var det nøen som tjykket feite taster! +---> Da denne linjen ble skrevet, var det noen som trykket feile taster! + + 5. Gå videre til leksjon 3.2. + +MERK: Husk at du bør lære ved å BRUKE, ikke pugge. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 3.3: «FORANDRE»-OPERATOREN + + + ** For å forandre til slutten av et ord, trykk ce . ** + + 1. Flytt markøren til den første linjen nedenfor som er merket --->. + + 2. Plasser markøren på u i «lubjwr». + + 3. Trykk ce og det korrekte ordet (i dette tilfellet, skriv «injen»). + + 4. Trykk og gå til det neste tegnet som skal forandres. + + 5. Repeter punkt 3 og 4 helt til den første setningen er lik den andre. + +---> Denne lubjwr har noen wgh som må forkwåp med «forækzryas»-kommandoen. +---> Denne linjen har noen ord som må forandres med «forandre»-kommandoen. + +Vær oppmerksom på at ce sletter ordet og går inn i innsettingsmodus. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 3.4: FLERE FORANDRINGER VED BRUK AV c + + + ** Forandringskommandoen blir brukt med de samme bevegelser som «slett». ** + + 1. Forandringsoperatoren fungerer på samme måte som «slett». Formatet er: + + c [nummer] bevegelse + + 2. Bevegelsene er de samme, som for eksempel w (ord) og $ (slutten av en + linje). + + 3. Gå til den første linjen nedenfor som er merket --->. + + 4. Flytt markøren til den første feilen. + + 5. Skriv c$ og skriv resten av linjen lik den andre og trykk . + +---> Slutten på denne linjen trenger litt hjelp for å gjøre den lik den neste. +---> Slutten på denne linjen trenger å bli rettet ved bruk av c$-kommandoen. + +MERK: Du kan bruke slettetasten for å rette feil mens du skriver. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 3 + + + 1. For å legge tilbake tekst som nettopp er blitt slettet, trykk p . Dette + limer inn den slettede teksten ETTER markøren (hvis en linje ble slettet + vil den bli limt inn på linjen under markøren). + + 2. For å erstatte et tegn under markøren, trykk r og deretter tegnet som + du vil ha der. + + 3. Forandringsoperatoren lar deg forandre fra markøren til dit bevegelsen + tar deg. Det vil si, skriv ce for å forandre fra markøren til slutten + av ordet, c$ for å forandre til slutten av linjen. + + 4. Formatet for «forandre» er: + + c [nummer] bevegelse + +Nå kan du gå til neste leksjon. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 4.1: POSISJONERING AV MARKØREN OG FILSTATUS + + ** Trykk CTRL-G for å vise posisjonen i filen og filstatusen. + Trykk G for å gå til en spesifikk linje i filen. ** + + Merk: Les hele leksjonen før du utfører noen av punktene! + + 1. Hold nede Ctrl-tasten og trykk g . Vi kaller dette CTRL-G. En melding + vil komme til syne på bunnen av skjermen med filnavnet og posisjonen i + filen. Husk linjenummeret for bruk i steg 3. + +Merk: Du kan se markørposisjonen i nederste høyre hjørne av skjermen. Dette + skjer når «ruler»-valget er satt (forklart i leksjon 6). + + 2. Trykk G for å gå til bunnen av filen. + Skriv gg for å gå til begynnelsen av filen. + + 3. Skriv inn linjenummeret du var på og deretter G . Dette vil føre deg + tilbake til linjen du var på da du først trykket CTRL-G. + + 4. Utfør steg 1 til 3 hvis du føler deg sikker på prosedyren. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 4.2: SØKEKOMMANDOEN + + ** Skriv / etterfulgt av en søkestreng som du vil lete etter. ** + + 1. Trykk / når du er i normalmodusen. Legg merke til at skråstreken og + markøren kommer til syne på bunnen av skjermen i likhet med + «:»-kommandoene. + + 2. Skriv «feeeiil» og trykk . Dette er teksten du vil lete etter. + + 3. For å finne neste forekomst av søkestrengen, trykk n . + For å lete etter samme søketeksten i motsatt retning, trykk N . + + 4. For å lete etter en tekst bakover i filen, bruk ? istedenfor / . + + 5. For å gå tilbake til der du kom fra, trykk CTRL-O (Hold Ctrl nede mens + du trykker bokstaven o ). Repeter for å gå enda lengre tilbake. CTRL-I + går framover. + +---> «feeeiil» er ikke måten å skrive «feil» på, feeeiil er helt feil. +Merk: Når søkingen når slutten av filen, vil den fortsette fra starten unntatt + hvis «wrapscan»-valget er resatt. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 4.3: FINN SAMSVARENDE PARENTESER + + + ** Trykk % for å finne en samsvarende ), ] eller } . ** + + 1. Plasser markøren på en (, [ eller { på linjen nedenfor merket --->. + + 2. Trykk % . + + 3. Markøren vil gå til den samsvarende parentesen eller hakeparentesen. + + 4. Trykk % for å flytte markøren til den andre samsvarende parentesen. + + 5. Flytt markøren til en annen (, ), [, ], { eller } og se hva % gjør. + +---> Dette ( er en testlinje med (, [ ] og { } i den )). + +Merk: Dette er veldig nyttig til feilsøking i programmer som har ubalansert + antall parenteser! + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 4.4: ERSTATT-KOMMANDOEN + + + ** Skriv :s/gammel/ny/g for å erstatte «gammel» med «ny». ** + + 1. Flytt markøren til linjen nedenfor som er merket med --->. + + 2. Skriv :s/deen/den/ . Legg merke til at denne kommandoen bare + forandrer den første forekomsten av «deen» på linjen. + + 3. Skriv :s/deen/den/g . Når g-flagget legges til, betyr dette global + erstatning på linjen og erstatter alle forekomster av «deen» på linjen. + +---> deen som kan kaste deen tyngste steinen lengst er deen beste + + 4. For å erstatte alle forekomster av en tekststreng mellom to linjer, + skriv :#,#s/gammel/ny/g der #,# er linjenumrene på de to linjene for + linjeområdet erstatningen skal gjøres. + Skriv :%s/gammel/ny/g for å erstatte tekst i hele filen. + Skriv :%s/gammel/ny/gc for å finne alle forekomster i hele filen, og + deretter spørre om teksten skal erstattes eller + ikke. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 4 + + + 1. Ctrl-G viser nåværende posisjon i filen og filstatusen. + G går til slutten av filen. + nummer G går til det linjenummeret. + gg går til den første linjen. + + 2. Skriv / etterfulgt av en søketekst for å lete FRAMOVER etter teksten. + Skriv ? etterfulgt av en søketekst for å lete BAKOVER etter teksten. + Etter et søk kan du trykke n for å finne neste forekomst i den samme + retningen eller N for å lete i motsatt retning. + CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner. + + 3. Skriv % når markøren står på en (, ), [, ], { eller } for å finne den + som samsvarer. + + 4. Erstatte «gammel» med første «ny» på en linje: :s/gammel/ny + Erstatte alle «gammel» med «ny» på en linje: :s/gammel/ny/g + Erstatte tekst mellom to linjenumre: :#,#s/gammel/ny/g + Erstatte alle forekomster i en fil: :%s/gammel/ny/g + For å godkjenne hver erstatning, legg til «c»: :%s/gammel/ny/gc +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 5.1: HVORDAN UTFØRE EN EKSTERN KOMMANDO + + + ** Skriv :! etterfulgt av en ekstern kommando for å utføre denne. ** + + 1. Skriv den velkjente kommandoen : for å plassere markøren på bunnen av + skjermen. Dette lar deg skrive en kommandolinjekommando. + + 2. Nå kan du skrive tegnet ! . Dette lar deg utføre en hvilken som helst + ekstern kommando. + + 3. Som et eksempel, skriv ls etter utropstegnet og trykk . Du vil + nå få en liste over filene i katalogen, akkurat som om du hadde kjørt + kommandoen direkte fra kommandolinjen i skallet. Eller bruk :!dir hvis + «ls» ikke virker. + +MERK: Det er mulig å kjøre alle eksterne kommandoer på denne måten, også med + parametere. + +MERK: Alle «:»-kommandoer må avsluttes med . Fra dette punktet er det + ikke alltid vi nevner det. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 5.2: MER OM LAGRING AV FILER + + + ** For å lagre endringene gjort i en tekst, skriv :w FILNAVN. ** + + 1. Skriv :!dir eller :!ls for å få en liste over filene i katalogen. Du + vet allerede at du må trykke etter dette. + + 2. Velg et filnavn på en fil som ikke finnes, som for eksempel TEST . + + 3. Skriv :w TEST (der TEST er filnavnet du velger). + + 4. Dette lagrer hele filen (denne innføringen) under navnet TEST . For å + sjekke dette, skriv :!dir eller :!ls igjen for å se innholdet av + katalogen. + +Merk: Hvis du nå hadde avsluttet Vim og startet på nytt igjen med «vim TEST», + ville filen vært en eksakt kopi av innføringen da du lagret den. + + 5. Fjern filen ved å skrive :!rm TEST hvis du er på et Unix-lignende + operativsystem, eller :!del TEST hvis du bruker MS-DOS. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES + + + ** For å lagre en del av en fil, skriv v bevegelse :w FILNAVN ** + + 1. Flytt markøren til denne linjen. + + 2. Trykk v og flytt markøren til det femte elementet nedenfor. Legg merke + til at teksten blir markert. + + 3. Trykk : (kolon). På bunnen av skjermen vil :'<,'> komme til syne. + + 4. Trykk w TEST , der TEST er et filnavn som ikke finnes enda. Kontroller + at du ser :'<,'>w TEST før du trykker Enter. + + 5. Vim vil skrive de valgte linjene til filen TEST. Bruk :!dir eller :!ls + for å se den. Ikke slett den enda! Vi vil bruke den i neste leksjon. + +MERK: Ved å trykke v startes visuelt valg. Du kan flytte markøren rundt for + å gjøre det valgte området større eller mindre. Deretter kan du bruke en + operator for å gjøre noe med teksten. For eksempel sletter d teksten. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 5.4: HENTING OG SAMMENSLÅING AV FILER + + + ** For å lese inn en annen fil inn i nåværende buffer, skriv :r FILNAVN ** + + 1. Plasser markøren like over denne linjen. + +MERK: Etter å ha utført steg 2 vil du se teksten fra leksjon 5.3. Gå deretter + NED for å se denne leksjonen igjen. + + 2. Hent TEST-filen ved å bruke kommandoen :r TEST der TEST er navnet på + filen du brukte. Filen du henter blir plassert nedenfor markørlinjen. + + 3. For å sjekke at filen ble hentet, gå tilbake og se at det er to kopier av + leksjon 5.3, originalen og denne versjonen. + +MERK: Du kan også lese utdataene av en ekstern kommando. For eksempel, :r !ls + leser utdataene av ls-kommandoen og legger dem nedenfor markøren. + + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 5 + + + 1. :!kommando utfører en ekstern kommandio. + + Noen nyttige eksempler er: + (MS-DOS) (Unix) + :!dir :!ls - List filene i katalogen. + :!del FILNAVN :!rm FILNAVN - Slett filen FILNAVN. + + 2. :w FILNAVN skriver den nåværende Vim-filen disken med navnet FILNAVN . + + 3. v bevegelse :w FILNAVN lagrer de visuelt valgte linjene til filen + FILNAVN. + + 4. :r FILNAVN henter filen FILNAVN og legger den inn nedenfor markøren. + + 5. :r !dir leser utdataene fra «dir»-kommandoen og legger dem nedenfor + markørposisjonen. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 6.1: «ÅPNE LINJE»-KOMMANDOEN + + + ** Skriv o for å «åpne opp» for en ny linje etter markøren og gå til + innsettingsmodus ** + + 1. Flytt markøren til linjen nedenfor merket --->. + + 2. Skriv o (liten o) for å åpne opp en linje NEDENFOR markøren og gå inn i + innsettingsmodus. + + 3. Skriv litt tekst og trykk for å gå ut av innsettingsmodusen. + +---> Etter at o er skrevet blir markøren plassert på den tomme linjen. + + 4. For å åpne en ny linje OVER markøren, trykk rett og slett en stor O + istedenfor en liten o . Prøv dette på linjen nedenfor. + +---> Lag ny linje over denne ved å trykke O mens markøren er på denne linjen. + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 6.2: «LEGG TIL»-KOMMANDOEN + + + ** Skriv a for å legge til tekst ETTER markøren. ** + + 1. Flytt markøren til starten av linjen merket ---> nedenfor. + + 2. Trykk e til markøren er på slutten av «li». + + 3. Trykk a (liten a) for å legge til tekst ETTER markøren. + + 4. Fullfør ordet sånn som på linjen nedenfor. Trykk for å gå ut av + innsettingsmodusen. + + 5. Bruk e for å gå til det neste ufullstendige ordet og repeter steg 3 og + 4. + +---> Denne li lar deg øve på å leg til tek på en linje. +---> Denne linjen lar deg øve på å legge til tekst på en linje. + +Merk: a, i og A går alle til den samme innsettingsmodusen, den eneste + forskjellen er hvor tegnene blir satt inn. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 6.3: EN ANNEN MÅTE Å ERSTATTE PÅ + + + ** Skriv en stor R for å erstatte mer enn ett tegn. ** + + 1. Flytt markøren til den første linjen nedenfor merket --->. Flytt markøren + til begynnelsen av den første «xxx»-en. + + 2. Trykk R og skriv inn tallet som står nedenfor på den andre linjen så + det erstatter xxx. + + 3. Trykk for å gå ut av erstatningsmodusen. Legg merke til at resten + av linjen forblir uforandret. + + 4. Repeter stegene for å erstatte den gjenværende xxx. + +---> Ved å legge 123 til xxx får vi xxx. +---> Ved å legge 123 til 456 får vi 579. + +MERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives + erstatter et eksisterende tegn. + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 6.4: KOPIERE OG LIME INN TEKST + + + ** Bruk y-operatoren for å kopiere tekst og p for å lime den inn ** + + 1. Gå til linjen merket ---> nedenfor og plasser markøren etter «a)». + + 2. Gå inn i visuell modus med v og flytt markøren til like før «første». + + 3. Trykk y for å kopiere (engelsk: «yank») den uthevede teksten. + + 4. Flytt markøren til slutten av den neste linjen: j$ + + 5. Trykk p for å lime inn teksten. Trykk deretter: a andre . + + 6. Bruk visuell modus for å velge « valget.», kopier det med y , gå til + slutten av den neste linjen med j$ og legg inn teksten der med p . + +---> a) Dette er det første valget. + b) + +Merk: Du kan også bruke y som en operator; yw kopierer ett ord. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 6.5: SETT VALG + + + ** Sett et valg så søk eller erstatning ignorerer store/små bokstaver. ** + + 1. Let etter «ignore» ved å skrive: /ignore + Repeter flere ganger ved å trykke n . + + 2. Sett «ic»-valget (Ignore Case) ved å skrive: :set ic + + 3. Søk etter «ignore» igjen ved å trykke n . + Legg merke til at både «Ignore» og «IGNORE» blir funnet. + + 4. Sett «hlsearch»- og «incsearch»-valgene: :set hls is + + 5. Skriv søkekommandoen igjen og se hva som skjer: /ignore + + 6. For å slå av ignorering av store/små bokstaver, skriv: :set noic + +Merk: For å fjerne uthevingen av treff, skriv: :nohlsearch +Merk: Hvis du vil ignorere store/små bokstaver for kun en søkekommando, bruk + \c i uttrykket: /ignore\c +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 6 + + 1. Trykk o for å legge til en linje NEDENFOR markøren og gå inn i + innsettingsmodus. + Trykk O for å åpne en linje OVER markøren. + + 2. Skriv a for å sette inn tekst ETTER markøren. + Skriv A for å sette inn tekst etter slutten av linjen. + + 3. Kommandoen e går til slutten av et ord. + + 4. Operatoren y («yank») kopierer tekst, p («paste») limer den inn. + + 5. Ved å trykke R går du inn i erstatningsmodus helt til trykkes. + + 6. Skriv «:set xxx» for å sette valget «xxx». Noen valg er: + «ic» «ignorecase» ignorer store/små bokstaver under søk + «is» «incsearch» vis delvise treff for en søketekst + «hls» «hlsearch» uthev alle søketreff + + 7. Legg til «no» foran valget for å slå det av: :set noic + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 7.1: FÅ HJELP + + + ** Bruk det innebygde hjelpesystemet. ** + + Vim har et omfattende innebygget hjelpesystem. For å starte det, prøv en av + disse måtene: + - Trykk Hjelp-tasten (hvis du har en) + - Trykk F1-tasten (hvis du har en) + - Skriv :help + + Les teksten i hjelpevinduet for å finne ut hvordan hjelpen virker. + Skriv CTRL-W CTRL-W for å hoppe fra et vindu til et annet + Skriv :q for å lukke hjelpevinduet. + + Du kan få hjelp for omtrent alle temaer om Vim ved å skrive et parameter til + «:help»-kommandoen. Prøv disse (ikke glem å trykke ): + + :help w + :help c_CTRL-D + :help insert-index + :help user-manual +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 7.2: LAG ET OPPSTARTSSKRIPT + + + ** Slå på funksjoner i Vim ** + + Vim har mange flere funksjoner enn Vi, men flesteparten av dem er slått av + som standard. For å begynne å bruke flere funksjoner må du lage en + «vimrc»-fil. + + 1. Start redigeringen av «vimrc»-filen. Dette avhenger av systemet ditt: + :e ~/.vimrc for Unix + :e $VIM/_vimrc for MS Windows + + 2. Les inn eksempelfilen for «vimrc»: + :r $VIMRUNTIME/vimrc_example.vim + + 3. Lagre filen med: + :w + + Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til + alle dine foretrukne oppsett i denne «vimrc»-filen. + For mer informasjon, skriv :help vimrc-intro +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Leksjon 7.3: FULLFØRING + + + ** Kommandolinjefullføring med CTRL-D og ** + + 1. Vær sikker på at Vim ikke er i Vi-kompatibel modus: :set nocp + + 2. Se hvilke filer som er i katalogen: :!ls eller :!dir + + 3. Skriv starten på en kommando: :e + + 4. Trykk CTRL-D og Vim vil vise en liste over kommandoer som starter med + «e». + + 5. Trykk og Vim vil fullføre kommandonavnet til «:edit». + + 6. Legg til et mellomrom og starten på et eksisterende filnavn: :edit FIL + + 7. Trykk . Vim vil fullføre navnet (hvis det er unikt). + +MERK: Fullføring fungerer for mange kommandoer. Prøv ved å trykke CTRL-D og + . Det er spesielt nyttig for bruk sammen med :help . +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + OPPSUMMERING AV LEKSJON 7 + + + 1. Skriv :help eller trykk eller for å åpne et hjelpevindu. + + 2. Skriv :help kommando for å få hjelp om kommando . + + 3. Trykk CTRL-W CTRL-W for å hoppe til et annet vindu. + + 4. Trykk :q for å lukke hjelpevinduet. + + 5. Opprett et vimrc-oppstartsskript for å lagre favorittvalgene dine. + + 6. Når du skriver en «:»-kommando, trykk CTRL-D for å se mulige + fullføringer. Trykk for å bruke en fullføring. + + + + + + + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + Her slutter innføringen i Vim. Den var ment som en rask oversikt over + editoren, akkurat nok til å la deg sette i gang med enkel bruk. Den er på + langt nær komplett, da Vim har mange flere kommandoer. Les bruksanvisningen + ved å skrive :help user-manual . + + For videre lesing og studier, kan denne boken anbefales: + «Vim - Vi Improved» av Steve Oualline + Utgiver: New Riders + Den første boken som er fullt og helt dedisert til Vim. Spesielt nyttig for + nybegynnere. Inneholder mange eksempler og illustrasjoner. + Se http://iccf-holland.org/click5.html + + Denne boken er eldre og handler mer om Vi enn Vim, men anbefales også: + «Learning the Vi Editor» av Linda Lamb + Utgiver: O'Reilly & Associates Inc. + Det er en god bok for å få vite omtrent hva som helst om Vi. + Den sjette utgaven inneholder også informasjon om Vim. + + Denne innføringen er skrevet av Michael C. Pierce og Robert K. Ware, + Colorado School of Mines med idéer av Charles Smith, Colorado State + University. E-mail: bware@mines.colorado.edu . + + Modifisert for Vim av Bram Moolenaar. + Oversatt av Øyvind A. Holm. E-mail: vimtutor _AT_ sunbase.org + Id: tutor.no 406 2007-03-18 22:48:36Z sunny + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +vim: set ts=8 : From 3ccb548b6d3aa4353921ebacfa05b9b8aad586f8 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Wed, 9 Mar 2016 11:29:25 +0100 Subject: [PATCH 193/205] Support for YAML .sublime-syntax extension --- lib/linguist/languages.yml | 1 + samples/YAML/HexInspect.sublime-syntax | 29 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 samples/YAML/HexInspect.sublime-syntax diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 442117a0..abe558a4 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3963,6 +3963,7 @@ YAML: - .yml - .reek - .rviz + - .sublime-syntax - .syntax - .yaml - .yaml-tmlanguage diff --git a/samples/YAML/HexInspect.sublime-syntax b/samples/YAML/HexInspect.sublime-syntax new file mode 100644 index 00000000..76f97bd1 --- /dev/null +++ b/samples/YAML/HexInspect.sublime-syntax @@ -0,0 +1,29 @@ +%YAML 1.2 +--- +# http://www.sublimetext.com/docs/3/syntax.html +name: Hex Inspect +file_extensions: [] +hidden: true +scope: source.inspect +contexts: + main: + - match: '([\w\-]+)\s*(:)\s*' + captures: + 1: support.function.key.inspect + 2: support.function.punctuation.inspect + push: + - meta_scope: item.inspect + - match: '([\d\-\w]+)' + captures: + 1: data.inspect + pop: true + - match: '^(\s*[\w\-\s]+)\s*(:)\s*' + captures: + 1: keyword.title.inspect + 2: keyword.title-punctuation.inspect + push: + - meta_scope: item.inspect + - match: $ + pop: true + - match: '[\w\s]+' + scope: title-info.inspect From 8cd80801e81072f3ccd085c596b6a1e702baad4f Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Wed, 9 Mar 2016 06:15:41 -0600 Subject: [PATCH 194/205] Fixing indentation --- lib/linguist/heuristics.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 895bfa20..5c27ca03 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -322,9 +322,9 @@ module Linguist end disambiguate ".rpy" do |data| - if /(^(import|from|class|def)[\s\S])/m.match(data) + if /(^(import|from|class|def)[\s\S])/m.match(data) Language["Python"] - else + else Language["Ren'Py"] end end From b032886c21d8397ca0be56fa91b5454e2f16d7c1 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Tue, 12 May 2015 13:22:10 +0200 Subject: [PATCH 195/205] Add .me and other text filenames. click.me by Bram Moolenaar; VIM license. --- lib/linguist/languages.yml | 11 +++++++++++ samples/Text/filenames/README.me | 1 + samples/Text/filenames/click.me | 9 +++++++++ samples/Text/filenames/delete.me | 1 + samples/Text/filenames/keep.me | 1 + samples/Text/filenames/read.me | 1 + samples/Text/filenames/test.me | 1 + 7 files changed, 25 insertions(+) create mode 100644 samples/Text/filenames/README.me create mode 100644 samples/Text/filenames/click.me create mode 100644 samples/Text/filenames/delete.me create mode 100644 samples/Text/filenames/keep.me create mode 100644 samples/Text/filenames/read.me create mode 100644 samples/Text/filenames/test.me diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 6f0bf16e..ae730da5 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3574,6 +3574,17 @@ Text: - .txt - .fr - .ncl + filenames: + - COPYING + - INSTALL + - LICENSE + - NEWS + - README.me + - click.me + - delete.me + - keep.me + - read.me + - test.me tm_scope: none ace_mode: text diff --git a/samples/Text/filenames/README.me b/samples/Text/filenames/README.me new file mode 100644 index 00000000..82a79018 --- /dev/null +++ b/samples/Text/filenames/README.me @@ -0,0 +1 @@ +Please read me. diff --git a/samples/Text/filenames/click.me b/samples/Text/filenames/click.me new file mode 100644 index 00000000..c2ed4691 --- /dev/null +++ b/samples/Text/filenames/click.me @@ -0,0 +1,9 @@ + +To run the "Conway's game of life" macros: + + 1. Type ":so life.vim". This loads the macros. + 2. Type "g" to run the macros. + 3. Type CTRL-C to interrupt. + 4. Type ":q!" to get out. + +See life.vim for more advanced usage. diff --git a/samples/Text/filenames/delete.me b/samples/Text/filenames/delete.me new file mode 100644 index 00000000..8f0b7e42 --- /dev/null +++ b/samples/Text/filenames/delete.me @@ -0,0 +1 @@ +Delete me. diff --git a/samples/Text/filenames/keep.me b/samples/Text/filenames/keep.me new file mode 100644 index 00000000..23913ab5 --- /dev/null +++ b/samples/Text/filenames/keep.me @@ -0,0 +1 @@ +Keep me. diff --git a/samples/Text/filenames/read.me b/samples/Text/filenames/read.me new file mode 100644 index 00000000..a6e6af0d --- /dev/null +++ b/samples/Text/filenames/read.me @@ -0,0 +1 @@ +Read me now! diff --git a/samples/Text/filenames/test.me b/samples/Text/filenames/test.me new file mode 100644 index 00000000..58ebd8a9 --- /dev/null +++ b/samples/Text/filenames/test.me @@ -0,0 +1 @@ +Test me. From 6f8a7d1070dfd847ab12a6ba093cd1c7e589b65b Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Tue, 12 May 2015 14:04:29 +0200 Subject: [PATCH 196/205] Exclude 'filenames' from all_fixtures. --- test/test_heuristics.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index 702320e9..7021e20b 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -13,7 +13,8 @@ class TestHeuristcs < Minitest::Test end def all_fixtures(language_name, file="*") - Dir.glob("#{samples_path}/#{language_name}/#{file}") + Dir.glob("#{samples_path}/#{language_name}/#{file}") - + ["#{samples_path}/#{language_name}/filenames"] end def test_no_match From 56ee61b17ce3cf712837e15eb9b6ad289118c45c Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Wed, 9 Mar 2016 12:46:43 +0000 Subject: [PATCH 197/205] make .hlsl the primary extension for HLSL When I submitted the HLSL-language, I accidentally missed that the first extension was the primary one (as is documented in the source code, which I unfortunately missed), and instead alphabetized the whole list. The primary extension should be .hlsl, so let's remedy this. --- lib/linguist/languages.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 7ee17bb0..7e682d6f 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -1326,9 +1326,9 @@ HCL: HLSL: type: programming extensions: + - .hlsl - .fx - .fxh - - .hlsl - .hlsli ace_mode: text tm_scope: none From 6af499e3525a69f95b896793ae9138641d00fea6 Mon Sep 17 00:00:00 2001 From: Peter Jas Date: Sun, 6 Mar 2016 20:18:57 +0000 Subject: [PATCH 198/205] Classification of props file * Initially treat as XML * Disambiguate from ini (key-value pair style with `=`) * If the file is neither XML-style nor INI, classify as SQL --- lib/linguist/heuristics.rb | 8 ++++++++ lib/linguist/languages.yml | 1 + samples/XML/Default.props | 29 +++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 samples/XML/Default.props diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 0806ce1f..b8e9c2fb 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -313,6 +313,14 @@ module Linguist end end + disambiguate ".props" do |data| + if /^(\s*)( + + + + + + + + Windows Phone Silverlight 8.1 + 6.3 + v120 + + <_PlatformToolsetFriendlyNameFor_v120>Windows Phone Silverlight 8.1 (v120) + <_PlatformToolsetShortNameFor_v120>Windows Phone Silverlight 8.1 + + + + + From 6812a2270698282c5f1e7ef3459ac63bbc050e10 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Thu, 10 Mar 2016 06:50:48 -0600 Subject: [PATCH 199/205] Slimming down Terra samples --- samples/Terra/abouttocompile.t | 22 -- samples/Terra/addlanguage1.t | 17 - samples/Terra/aggregatearr.t | 18 - samples/Terra/ainline.t | 24 -- samples/Terra/alignment.t | 7 - samples/Terra/and.t | 9 - samples/Terra/anon.t | 26 -- samples/Terra/anon3.t | 18 - samples/Terra/anonstruct.t | 12 - samples/Terra/anonstruct2.t | 7 - samples/Terra/antiquote1.t | 12 - samples/Terra/antiquote2.t | 13 - samples/Terra/antiquote3.t | 16 - samples/Terra/antiquote4.t | 11 - samples/Terra/antiquote5.t | 21 - samples/Terra/array.t | 60 --- samples/Terra/arraylit.t | 29 -- samples/Terra/arrayt2.t | 82 ---- samples/Terra/arrptr.t | 5 - samples/Terra/asm.t | 28 -- samples/Terra/atoi.t | 7 - samples/Terra/avxhadd.t | 32 -- samples/Terra/badname.t | 4 - samples/Terra/benchmark_fannkuchredux.t | 148 ------- samples/Terra/bf.t | 60 --- samples/Terra/blankexp.t | 7 - samples/Terra/blockescape.t | 23 -- samples/Terra/blocking.t | 57 --- samples/Terra/blocking2-fixed.t | 68 ---- samples/Terra/blocking2.t | 81 ---- samples/Terra/blocking3.t | 85 ----- samples/Terra/bounce.t | 23 -- samples/Terra/bug.t | 20 - samples/Terra/bug2.t | 20 - samples/Terra/bug3.t | 15 - samples/Terra/bug4.t | 14 - samples/Terra/calc.t | 33 -- samples/Terra/call.t | 53 --- samples/Terra/callbackcache.t | 9 - samples/Terra/canon.t | 45 --- samples/Terra/canon2.t | 41 -- samples/Terra/cast.t | 11 - samples/Terra/cbool.t | 13 - samples/Terra/cconv.t | 488 ------------------------ samples/Terra/cfgbug.t | 14 - samples/Terra/clanginfo.t | 1 - samples/Terra/class.t | 235 ------------ samples/Terra/class2.t | 45 --- samples/Terra/class3.t | 36 -- samples/Terra/class4.t | 22 -- samples/Terra/class5.t | 54 --- samples/Terra/class6.t | 66 ---- samples/Terra/classifyfloatstructs.t | 137 ------- samples/Terra/clean.t | 17 - samples/Terra/cnames.t | 25 -- samples/Terra/cnamespace.t | 24 -- samples/Terra/cnamespaces.t | 32 -- samples/Terra/compilecallback.t | 16 - samples/Terra/completec.t | 13 - samples/Terra/conflict.t | 12 - samples/Terra/constant.t | 35 -- samples/Terra/constant2.t | 21 - samples/Terra/constructor.t | 12 - samples/Terra/coverage.t | 47 --- samples/Terra/coverage2.t | 209 ---------- samples/Terra/coverage3.t | 107 ------ samples/Terra/crash1.t | 1 - samples/Terra/crash2.t | 1 - samples/Terra/cstruct.t | 20 - samples/Terra/cstruct2.t | 8 - samples/Terra/cudaagg.t | 56 --- samples/Terra/cudaaggregate.t | 45 --- samples/Terra/cudaatomic.t | 39 -- samples/Terra/cudaconst2.t | 14 - samples/Terra/cudaglobal.t | 48 --- samples/Terra/cudahello.t | 30 -- samples/Terra/cudaoffline.t | 65 ---- samples/Terra/cudaoo.t | 20 - samples/Terra/cudaprintf.t | 50 --- samples/Terra/cudashared.t | 47 --- samples/Terra/cudatest.t | 47 --- samples/Terra/cudatex.t | 59 --- samples/Terra/cunion.t | 34 -- samples/Terra/cunion2.t | 35 -- samples/Terra/customline.t | 10 - samples/Terra/customtable.t | 10 - samples/Terra/cvar.t | 9 - samples/Terra/debugcallback.t | 23 -- samples/Terra/declerrors.t | 29 -- samples/Terra/decltwice.t | 18 - samples/Terra/def1.t | 16 - samples/Terra/defaultoperator.t | 9 - samples/Terra/defer.t | 111 ------ samples/Terra/deferbreak.t | 35 -- samples/Terra/defercond.t | 82 ---- samples/Terra/defergoto.t | 35 -- samples/Terra/dgemm.t | 143 ------- samples/Terra/dgemm2.t | 163 -------- samples/Terra/dgemm3.t | 213 ----------- samples/Terra/dgemmpaper.t | 75 ---- samples/Terra/diffuse.t | 237 ------------ samples/Terra/dynlib.t | 47 --- samples/Terra/eager.t | 10 - samples/Terra/emptycalls.t | 31 -- samples/Terra/emptyname.t | 5 - samples/Terra/emptystruct.t | 30 -- samples/Terra/enumc.t | 14 - samples/Terra/evenodd.t | 20 - samples/Terra/examplecompiler1.t | 41 -- samples/Terra/examplelanguage1.t | 7 - samples/Terra/exampleparser1.t | 22 -- samples/Terra/exittest.t | 9 - samples/Terra/explicitcast.t | 11 - samples/Terra/exportdynamic.t | 9 - samples/Terra/expvec.t | 34 -- samples/Terra/f2.t | 17 - samples/Terra/fact.t | 16 - samples/Terra/fakeasm.t | 31 -- samples/Terra/falsespec.t | 8 - samples/Terra/fastcall.t | 24 -- samples/Terra/fib.t | 26 -- samples/Terra/fib2.t | 27 -- samples/Terra/fnames.t | 5 - samples/Terra/fncalltest.t | 16 - samples/Terra/fnpointer.t | 24 -- samples/Terra/fnptr.t | 7 - samples/Terra/fnptrc.t | 25 -- samples/Terra/foo.t | 1 - samples/Terra/for.t | 31 -- samples/Terra/for2.t | 31 -- samples/Terra/forbreak.t | 17 - samples/Terra/forlist.t | 24 -- samples/Terra/forlist2.t | 37 -- samples/Terra/forp.t | 21 - samples/Terra/forsym.t | 24 -- samples/Terra/forwardtodef.t | 7 - samples/Terra/functionnoproto.t | 6 - samples/Terra/gctest.t | 18 - samples/Terra/gemm.t | 207 ---------- samples/Terra/getmethod.t | 19 - samples/Terra/gettype.t | 18 - samples/Terra/globals.t | 26 -- samples/Terra/goto.t | 16 - samples/Terra/goto2.t | 18 - samples/Terra/gvarfault.t | 24 -- samples/Terra/hasbeenfrozen.t | 33 -- samples/Terra/hello.t | 8 - samples/Terra/hello2.t | 10 - samples/Terra/hexf.t | 9 - samples/Terra/huge.t | 7 - samples/Terra/ifelse.t | 17 - samples/Terra/includec.t | 42 -- samples/Terra/includetwice.t | 21 - samples/Terra/incomplete.t | 32 -- samples/Terra/incomplete2.t | 25 -- samples/Terra/incomplete3.t | 29 -- samples/Terra/incomplete4.t | 22 -- samples/Terra/incomplete5.t | 65 ---- samples/Terra/incompletetypetest.t | 13 - samples/Terra/incompletetypetest2.t | 13 - samples/Terra/incompletetypetest3.t | 13 - samples/Terra/indexing64.t | 10 - samples/Terra/indexingbug.t | 31 -- samples/Terra/interface.t | 33 -- samples/Terra/interface2.t | 38 -- samples/Terra/intrinsic.t | 21 - samples/Terra/isvolatile.t | 7 - samples/Terra/labelbug.t | 5 - samples/Terra/latelink.t | 24 -- samples/Terra/lazycstring.t | 21 - samples/Terra/lazylog.t | 61 --- samples/Terra/leaktest.t | 27 -- samples/Terra/let1.t | 15 - samples/Terra/let2.t | 64 ---- samples/Terra/linkllvm.t | 13 - samples/Terra/localenv.t | 46 --- samples/Terra/localenv2.t | 7 - samples/Terra/logical.t | 33 -- samples/Terra/luabridge.t | 18 - samples/Terra/luabridge2.t | 92 ----- samples/Terra/luabridgefn.t | 23 -- samples/Terra/luabridgerec.t | 10 - samples/Terra/luabridgeunion.t | 14 - samples/Terra/luaterramethod.t | 40 -- samples/Terra/lvaluepointer.t | 10 - samples/Terra/lvaluequote.t | 22 -- samples/Terra/lvaluetreelist.t | 9 - samples/Terra/macro.t | 50 --- samples/Terra/macro2.t | 14 - samples/Terra/macro3.t | 14 - samples/Terra/macrokey.t | 9 - samples/Terra/macrolet.t | 17 - samples/Terra/macroselect.t | 11 - samples/Terra/macrotest.t | 9 - samples/Terra/malloc.t | 23 -- samples/Terra/mathlib.t | 9 - samples/Terra/metatype.t | 16 - samples/Terra/method.t | 42 -- samples/Terra/methodantiquote.t | 18 - samples/Terra/methodmissing.t | 17 - samples/Terra/methodrvalue.t | 18 - samples/Terra/methodsugar.t | 15 - samples/Terra/missingfields.t | 14 - samples/Terra/mixed.t | 13 - samples/Terra/multiconstructor.t | 17 - samples/Terra/multimacro.t | 17 - samples/Terra/multiterra.t | 79 ---- samples/Terra/names.t | 16 - samples/Terra/nestedcalls.t | 11 - samples/Terra/nestextract.t | 40 -- samples/Terra/nestnoerror.t | 17 - samples/Terra/new.t | 14 - samples/Terra/nillocal.t | 6 - samples/Terra/niltype.t | 9 - samples/Terra/nojit.t | 20 - samples/Terra/nolengthop.t | 2 - samples/Terra/nonprototypec.t | 12 - samples/Terra/nontemporal.t | 7 - samples/Terra/numliteral.t | 14 - samples/Terra/objc.t | 25 -- samples/Terra/objc2.t | 42 -- samples/Terra/objtest.t | 45 --- samples/Terra/offsetcalc.t | 33 -- samples/Terra/opaquealloc.t | 19 - samples/Terra/or.t | 9 - samples/Terra/ordercomplete.t | 25 -- samples/Terra/output.t | 16 - samples/Terra/overload.t | 17 - samples/Terra/overload2.t | 15 - samples/Terra/overload3.t | 15 - samples/Terra/overloadcall.t | 12 - samples/Terra/overloadmethod.t | 24 -- samples/Terra/overloadmethod2.t | 17 - samples/Terra/overloadmethod3.t | 18 - samples/Terra/overloadproduct.t | 65 ---- samples/Terra/overloadrecv.t | 20 - samples/Terra/painfulrecstruct.t | 22 -- samples/Terra/paren.t | 5 - samples/Terra/parsecrash.t | 7 - samples/Terra/parsefail.t | 35 -- samples/Terra/parsefail2.t | 5 - samples/Terra/pattern.t | 43 --- samples/Terra/point.t | 13 - samples/Terra/pointerarith.t | 31 -- samples/Terra/pointerlike.t | 7 - samples/Terra/pow.t | 28 -- samples/Terra/ppltalk.t | 18 - samples/Terra/ppnil.t | 4 - samples/Terra/pratttest1.t | 4 - samples/Terra/prec.t | 4 - samples/Terra/prec2.t | 2 - samples/Terra/pretty.t | 69 ---- samples/Terra/printd.t | 5 - samples/Terra/printfarray.t | 12 - samples/Terra/printfloat.t | 7 - samples/Terra/proxystruct.t | 19 - samples/Terra/pt.t | 18 - samples/Terra/pthreads.t | 47 --- samples/Terra/quote.t | 10 - samples/Terra/quote10.t | 13 - samples/Terra/quote2.t | 9 - samples/Terra/quote3.t | 13 - samples/Terra/quote4.t | 9 - samples/Terra/quote5.t | 20 - samples/Terra/quote6.t | 12 - samples/Terra/quote7.t | 23 -- samples/Terra/quote8.t | 19 - samples/Terra/quote9.t | 19 - samples/Terra/quoteblock.t | 12 - samples/Terra/quoteenv.t | 25 -- samples/Terra/quoteselect.t | 12 - samples/Terra/rd.t | 1 - samples/Terra/receivercasts.t | 22 -- samples/Terra/recfn.t | 10 - samples/Terra/recoverfromerror.t | 15 - samples/Terra/recstruct.t | 33 -- samples/Terra/recstruct2.t | 17 - samples/Terra/rename.t | 8 - samples/Terra/renaming.t | 21 - samples/Terra/requiretwice.t | 3 - samples/Terra/rvaluerecv.t | 30 -- samples/Terra/scope.t | 13 - samples/Terra/selectoverload.t | 25 -- samples/Terra/setname.t | 7 - samples/Terra/setter.t | 39 -- samples/Terra/sgemm-old.t | 205 ---------- samples/Terra/sgemm.t | 162 -------- samples/Terra/sgemm3.t | 124 ------ samples/Terra/sgemmkernel.t | 164 -------- samples/Terra/shallowfreeze.t | 24 -- samples/Terra/sharedlib.t | 22 -- samples/Terra/shift.t | 7 - samples/Terra/signext.t | 12 - samples/Terra/simple.t | 6 - samples/Terra/simpleadd.t | 15 - samples/Terra/simpleapply.t | 19 - samples/Terra/simpleglobal.t | 19 - samples/Terra/simplerec.t | 25 -- samples/Terra/simplestruct.t | 10 - samples/Terra/simplevec.t | 12 - samples/Terra/sintable.t | 17 - samples/Terra/special.t | 61 --- samples/Terra/speed.t | 30 -- samples/Terra/splitprimary.t | 19 - samples/Terra/ssimple.t | 477 ----------------------- samples/Terra/staticmethod.t | 9 - samples/Terra/stattest.t | 13 - samples/Terra/stencil.t | 134 ------- samples/Terra/strerror.t | 9 - samples/Terra/string.t | 15 - samples/Terra/struct.t | 50 --- samples/Terra/structarg.t | 9 - samples/Terra/structcast.t | 38 -- samples/Terra/structconstructor.t | 9 - samples/Terra/structrvalue.t | 16 - samples/Terra/structsyntax.t | 14 - samples/Terra/sugar.t | 15 - samples/Terra/sumlanguage1.t | 2 - samples/Terra/sumlanguage2.t | 4 - samples/Terra/symbolmangling.t | 4 - samples/Terra/symbolvar.t | 11 - samples/Terra/symbolvar2.t | 16 - samples/Terra/symbolvar3.t | 16 - samples/Terra/symbolvar4.t | 16 - samples/Terra/symbolvar5.t | 16 - samples/Terra/symbolvar6.t | 16 - samples/Terra/symbolvar7.t | 15 - samples/Terra/symparam.t | 9 - samples/Terra/symparam2.t | 9 - samples/Terra/symparam3.t | 15 - samples/Terra/template.t | 6 - samples/Terra/terracast.t | 15 - samples/Terra/terralua.t | 32 -- samples/Terra/terraluamethod.t | 16 - samples/Terra/terranew.t | 19 - samples/Terra/testdebug.t | 57 --- samples/Terra/testimport.t | 6 - samples/Terra/testlang1.t | 21 - samples/Terra/testlang2.t | 4 - samples/Terra/testlog.t | 8 - samples/Terra/testrequire.t | 14 - samples/Terra/teststd.t | 45 --- samples/Terra/testvector.t | 57 --- samples/Terra/torturechain.t | 67 ---- samples/Terra/toterraexpression.t | 8 - samples/Terra/twolang.t | 23 -- samples/Terra/typeexp.t | 9 - samples/Terra/union.t | 26 -- samples/Terra/unm.t | 20 - samples/Terra/unpacktuple.t | 30 -- samples/Terra/unsafesym.t | 14 - samples/Terra/unstrict.t | 5 - samples/Terra/usercast.t | 24 -- samples/Terra/varargcstring.t | 2 - samples/Terra/vars.t | 23 -- samples/Terra/vars2.t | 17 - samples/Terra/vec.t | 27 -- samples/Terra/vecarith.t | 138 ------- samples/Terra/veclit.t | 29 -- samples/Terra/vecobj.t | 54 --- samples/Terra/vecptr.t | 4 - samples/Terra/vecsize.t | 5 - samples/Terra/vtablerec.t | 30 -- samples/Terra/zeroargs.t | 5 - samples/Terra/zeroreturn.t | 18 - samples/Terra/zeroreturn2.t | 17 - 366 files changed, 11582 deletions(-) delete mode 100644 samples/Terra/abouttocompile.t delete mode 100755 samples/Terra/addlanguage1.t delete mode 100644 samples/Terra/aggregatearr.t delete mode 100644 samples/Terra/ainline.t delete mode 100644 samples/Terra/alignment.t delete mode 100644 samples/Terra/and.t delete mode 100644 samples/Terra/anon.t delete mode 100644 samples/Terra/anon3.t delete mode 100644 samples/Terra/anonstruct.t delete mode 100644 samples/Terra/anonstruct2.t delete mode 100644 samples/Terra/antiquote1.t delete mode 100644 samples/Terra/antiquote2.t delete mode 100644 samples/Terra/antiquote3.t delete mode 100644 samples/Terra/antiquote4.t delete mode 100644 samples/Terra/antiquote5.t delete mode 100644 samples/Terra/array.t delete mode 100644 samples/Terra/arraylit.t delete mode 100644 samples/Terra/arrayt2.t delete mode 100644 samples/Terra/arrptr.t delete mode 100644 samples/Terra/asm.t delete mode 100644 samples/Terra/atoi.t delete mode 100644 samples/Terra/avxhadd.t delete mode 100644 samples/Terra/badname.t delete mode 100644 samples/Terra/benchmark_fannkuchredux.t delete mode 100644 samples/Terra/bf.t delete mode 100644 samples/Terra/blankexp.t delete mode 100644 samples/Terra/blockescape.t delete mode 100644 samples/Terra/blocking.t delete mode 100644 samples/Terra/blocking2-fixed.t delete mode 100644 samples/Terra/blocking2.t delete mode 100644 samples/Terra/blocking3.t delete mode 100644 samples/Terra/bounce.t delete mode 100644 samples/Terra/bug.t delete mode 100644 samples/Terra/bug2.t delete mode 100644 samples/Terra/bug3.t delete mode 100644 samples/Terra/bug4.t delete mode 100644 samples/Terra/calc.t delete mode 100644 samples/Terra/call.t delete mode 100644 samples/Terra/callbackcache.t delete mode 100644 samples/Terra/canon.t delete mode 100644 samples/Terra/canon2.t delete mode 100644 samples/Terra/cast.t delete mode 100644 samples/Terra/cbool.t delete mode 100644 samples/Terra/cconv.t delete mode 100644 samples/Terra/cfgbug.t delete mode 100644 samples/Terra/clanginfo.t delete mode 100644 samples/Terra/class.t delete mode 100644 samples/Terra/class2.t delete mode 100644 samples/Terra/class3.t delete mode 100644 samples/Terra/class4.t delete mode 100644 samples/Terra/class5.t delete mode 100644 samples/Terra/class6.t delete mode 100644 samples/Terra/classifyfloatstructs.t delete mode 100644 samples/Terra/clean.t delete mode 100644 samples/Terra/cnames.t delete mode 100644 samples/Terra/cnamespace.t delete mode 100644 samples/Terra/cnamespaces.t delete mode 100644 samples/Terra/compilecallback.t delete mode 100644 samples/Terra/completec.t delete mode 100644 samples/Terra/conflict.t delete mode 100644 samples/Terra/constant.t delete mode 100644 samples/Terra/constant2.t delete mode 100644 samples/Terra/constructor.t delete mode 100644 samples/Terra/coverage.t delete mode 100644 samples/Terra/coverage2.t delete mode 100644 samples/Terra/coverage3.t delete mode 100644 samples/Terra/crash1.t delete mode 100644 samples/Terra/crash2.t delete mode 100644 samples/Terra/cstruct.t delete mode 100644 samples/Terra/cstruct2.t delete mode 100644 samples/Terra/cudaagg.t delete mode 100644 samples/Terra/cudaaggregate.t delete mode 100644 samples/Terra/cudaatomic.t delete mode 100644 samples/Terra/cudaconst2.t delete mode 100644 samples/Terra/cudaglobal.t delete mode 100644 samples/Terra/cudahello.t delete mode 100644 samples/Terra/cudaoffline.t delete mode 100644 samples/Terra/cudaoo.t delete mode 100644 samples/Terra/cudaprintf.t delete mode 100644 samples/Terra/cudashared.t delete mode 100644 samples/Terra/cudatest.t delete mode 100644 samples/Terra/cudatex.t delete mode 100644 samples/Terra/cunion.t delete mode 100644 samples/Terra/cunion2.t delete mode 100644 samples/Terra/customline.t delete mode 100644 samples/Terra/customtable.t delete mode 100644 samples/Terra/cvar.t delete mode 100644 samples/Terra/debugcallback.t delete mode 100644 samples/Terra/declerrors.t delete mode 100644 samples/Terra/decltwice.t delete mode 100755 samples/Terra/def1.t delete mode 100644 samples/Terra/defaultoperator.t delete mode 100644 samples/Terra/defer.t delete mode 100644 samples/Terra/deferbreak.t delete mode 100644 samples/Terra/defercond.t delete mode 100644 samples/Terra/defergoto.t delete mode 100644 samples/Terra/dgemm.t delete mode 100644 samples/Terra/dgemm2.t delete mode 100644 samples/Terra/dgemm3.t delete mode 100644 samples/Terra/dgemmpaper.t delete mode 100644 samples/Terra/diffuse.t delete mode 100644 samples/Terra/dynlib.t delete mode 100644 samples/Terra/eager.t delete mode 100644 samples/Terra/emptycalls.t delete mode 100644 samples/Terra/emptyname.t delete mode 100644 samples/Terra/emptystruct.t delete mode 100644 samples/Terra/enumc.t delete mode 100644 samples/Terra/evenodd.t delete mode 100755 samples/Terra/examplecompiler1.t delete mode 100755 samples/Terra/examplelanguage1.t delete mode 100644 samples/Terra/exampleparser1.t delete mode 100644 samples/Terra/exittest.t delete mode 100644 samples/Terra/explicitcast.t delete mode 100644 samples/Terra/exportdynamic.t delete mode 100644 samples/Terra/expvec.t delete mode 100644 samples/Terra/f2.t delete mode 100644 samples/Terra/fact.t delete mode 100644 samples/Terra/fakeasm.t delete mode 100644 samples/Terra/falsespec.t delete mode 100644 samples/Terra/fastcall.t delete mode 100644 samples/Terra/fib.t delete mode 100644 samples/Terra/fib2.t delete mode 100644 samples/Terra/fnames.t delete mode 100644 samples/Terra/fncalltest.t delete mode 100644 samples/Terra/fnpointer.t delete mode 100644 samples/Terra/fnptr.t delete mode 100644 samples/Terra/fnptrc.t delete mode 100644 samples/Terra/foo.t delete mode 100644 samples/Terra/for.t delete mode 100644 samples/Terra/for2.t delete mode 100644 samples/Terra/forbreak.t delete mode 100644 samples/Terra/forlist.t delete mode 100644 samples/Terra/forlist2.t delete mode 100644 samples/Terra/forp.t delete mode 100644 samples/Terra/forsym.t delete mode 100644 samples/Terra/forwardtodef.t delete mode 100644 samples/Terra/functionnoproto.t delete mode 100644 samples/Terra/gctest.t delete mode 100644 samples/Terra/gemm.t delete mode 100644 samples/Terra/getmethod.t delete mode 100644 samples/Terra/gettype.t delete mode 100644 samples/Terra/globals.t delete mode 100644 samples/Terra/goto.t delete mode 100644 samples/Terra/goto2.t delete mode 100644 samples/Terra/gvarfault.t delete mode 100644 samples/Terra/hasbeenfrozen.t delete mode 100644 samples/Terra/hello.t delete mode 100644 samples/Terra/hello2.t delete mode 100644 samples/Terra/hexf.t delete mode 100644 samples/Terra/huge.t delete mode 100644 samples/Terra/ifelse.t delete mode 100644 samples/Terra/includec.t delete mode 100644 samples/Terra/includetwice.t delete mode 100644 samples/Terra/incomplete.t delete mode 100644 samples/Terra/incomplete2.t delete mode 100644 samples/Terra/incomplete3.t delete mode 100644 samples/Terra/incomplete4.t delete mode 100644 samples/Terra/incomplete5.t delete mode 100644 samples/Terra/incompletetypetest.t delete mode 100644 samples/Terra/incompletetypetest2.t delete mode 100644 samples/Terra/incompletetypetest3.t delete mode 100644 samples/Terra/indexing64.t delete mode 100644 samples/Terra/indexingbug.t delete mode 100644 samples/Terra/interface.t delete mode 100644 samples/Terra/interface2.t delete mode 100644 samples/Terra/intrinsic.t delete mode 100644 samples/Terra/isvolatile.t delete mode 100644 samples/Terra/labelbug.t delete mode 100644 samples/Terra/latelink.t delete mode 100644 samples/Terra/lazycstring.t delete mode 100644 samples/Terra/lazylog.t delete mode 100644 samples/Terra/leaktest.t delete mode 100644 samples/Terra/let1.t delete mode 100644 samples/Terra/let2.t delete mode 100644 samples/Terra/linkllvm.t delete mode 100644 samples/Terra/localenv.t delete mode 100644 samples/Terra/localenv2.t delete mode 100644 samples/Terra/logical.t delete mode 100644 samples/Terra/luabridge.t delete mode 100644 samples/Terra/luabridge2.t delete mode 100644 samples/Terra/luabridgefn.t delete mode 100644 samples/Terra/luabridgerec.t delete mode 100644 samples/Terra/luabridgeunion.t delete mode 100644 samples/Terra/luaterramethod.t delete mode 100644 samples/Terra/lvaluepointer.t delete mode 100644 samples/Terra/lvaluequote.t delete mode 100644 samples/Terra/lvaluetreelist.t delete mode 100644 samples/Terra/macro.t delete mode 100644 samples/Terra/macro2.t delete mode 100644 samples/Terra/macro3.t delete mode 100644 samples/Terra/macrokey.t delete mode 100644 samples/Terra/macrolet.t delete mode 100644 samples/Terra/macroselect.t delete mode 100644 samples/Terra/macrotest.t delete mode 100644 samples/Terra/malloc.t delete mode 100644 samples/Terra/mathlib.t delete mode 100644 samples/Terra/metatype.t delete mode 100644 samples/Terra/method.t delete mode 100644 samples/Terra/methodantiquote.t delete mode 100644 samples/Terra/methodmissing.t delete mode 100644 samples/Terra/methodrvalue.t delete mode 100644 samples/Terra/methodsugar.t delete mode 100644 samples/Terra/missingfields.t delete mode 100644 samples/Terra/mixed.t delete mode 100644 samples/Terra/multiconstructor.t delete mode 100644 samples/Terra/multimacro.t delete mode 100644 samples/Terra/multiterra.t delete mode 100644 samples/Terra/names.t delete mode 100644 samples/Terra/nestedcalls.t delete mode 100644 samples/Terra/nestextract.t delete mode 100644 samples/Terra/nestnoerror.t delete mode 100644 samples/Terra/new.t delete mode 100644 samples/Terra/nillocal.t delete mode 100644 samples/Terra/niltype.t delete mode 100644 samples/Terra/nojit.t delete mode 100644 samples/Terra/nolengthop.t delete mode 100644 samples/Terra/nonprototypec.t delete mode 100644 samples/Terra/nontemporal.t delete mode 100644 samples/Terra/numliteral.t delete mode 100644 samples/Terra/objc.t delete mode 100644 samples/Terra/objc2.t delete mode 100644 samples/Terra/objtest.t delete mode 100644 samples/Terra/offsetcalc.t delete mode 100644 samples/Terra/opaquealloc.t delete mode 100644 samples/Terra/or.t delete mode 100644 samples/Terra/ordercomplete.t delete mode 100644 samples/Terra/output.t delete mode 100644 samples/Terra/overload.t delete mode 100644 samples/Terra/overload2.t delete mode 100644 samples/Terra/overload3.t delete mode 100644 samples/Terra/overloadcall.t delete mode 100644 samples/Terra/overloadmethod.t delete mode 100644 samples/Terra/overloadmethod2.t delete mode 100644 samples/Terra/overloadmethod3.t delete mode 100644 samples/Terra/overloadproduct.t delete mode 100644 samples/Terra/overloadrecv.t delete mode 100644 samples/Terra/painfulrecstruct.t delete mode 100644 samples/Terra/paren.t delete mode 100644 samples/Terra/parsecrash.t delete mode 100644 samples/Terra/parsefail.t delete mode 100644 samples/Terra/parsefail2.t delete mode 100644 samples/Terra/pattern.t delete mode 100644 samples/Terra/point.t delete mode 100644 samples/Terra/pointerarith.t delete mode 100644 samples/Terra/pointerlike.t delete mode 100644 samples/Terra/pow.t delete mode 100644 samples/Terra/ppltalk.t delete mode 100644 samples/Terra/ppnil.t delete mode 100755 samples/Terra/pratttest1.t delete mode 100644 samples/Terra/prec.t delete mode 100644 samples/Terra/prec2.t delete mode 100644 samples/Terra/pretty.t delete mode 100644 samples/Terra/printd.t delete mode 100644 samples/Terra/printfarray.t delete mode 100644 samples/Terra/printfloat.t delete mode 100644 samples/Terra/proxystruct.t delete mode 100644 samples/Terra/pt.t delete mode 100644 samples/Terra/pthreads.t delete mode 100644 samples/Terra/quote.t delete mode 100644 samples/Terra/quote10.t delete mode 100644 samples/Terra/quote2.t delete mode 100644 samples/Terra/quote3.t delete mode 100644 samples/Terra/quote4.t delete mode 100644 samples/Terra/quote5.t delete mode 100644 samples/Terra/quote6.t delete mode 100644 samples/Terra/quote7.t delete mode 100644 samples/Terra/quote8.t delete mode 100644 samples/Terra/quote9.t delete mode 100644 samples/Terra/quoteblock.t delete mode 100644 samples/Terra/quoteenv.t delete mode 100644 samples/Terra/quoteselect.t delete mode 100644 samples/Terra/rd.t delete mode 100644 samples/Terra/receivercasts.t delete mode 100644 samples/Terra/recfn.t delete mode 100644 samples/Terra/recoverfromerror.t delete mode 100644 samples/Terra/recstruct.t delete mode 100644 samples/Terra/recstruct2.t delete mode 100644 samples/Terra/rename.t delete mode 100644 samples/Terra/renaming.t delete mode 100644 samples/Terra/requiretwice.t delete mode 100644 samples/Terra/rvaluerecv.t delete mode 100644 samples/Terra/scope.t delete mode 100644 samples/Terra/selectoverload.t delete mode 100644 samples/Terra/setname.t delete mode 100644 samples/Terra/setter.t delete mode 100644 samples/Terra/sgemm-old.t delete mode 100644 samples/Terra/sgemm.t delete mode 100644 samples/Terra/sgemm3.t delete mode 100644 samples/Terra/sgemmkernel.t delete mode 100644 samples/Terra/shallowfreeze.t delete mode 100644 samples/Terra/sharedlib.t delete mode 100644 samples/Terra/shift.t delete mode 100644 samples/Terra/signext.t delete mode 100644 samples/Terra/simple.t delete mode 100644 samples/Terra/simpleadd.t delete mode 100644 samples/Terra/simpleapply.t delete mode 100644 samples/Terra/simpleglobal.t delete mode 100644 samples/Terra/simplerec.t delete mode 100644 samples/Terra/simplestruct.t delete mode 100644 samples/Terra/simplevec.t delete mode 100644 samples/Terra/sintable.t delete mode 100644 samples/Terra/special.t delete mode 100644 samples/Terra/speed.t delete mode 100644 samples/Terra/splitprimary.t delete mode 100644 samples/Terra/ssimple.t delete mode 100644 samples/Terra/staticmethod.t delete mode 100644 samples/Terra/stattest.t delete mode 100644 samples/Terra/stencil.t delete mode 100644 samples/Terra/strerror.t delete mode 100644 samples/Terra/string.t delete mode 100644 samples/Terra/struct.t delete mode 100644 samples/Terra/structarg.t delete mode 100644 samples/Terra/structcast.t delete mode 100644 samples/Terra/structconstructor.t delete mode 100644 samples/Terra/structrvalue.t delete mode 100644 samples/Terra/structsyntax.t delete mode 100644 samples/Terra/sugar.t delete mode 100755 samples/Terra/sumlanguage1.t delete mode 100755 samples/Terra/sumlanguage2.t delete mode 100644 samples/Terra/symbolmangling.t delete mode 100644 samples/Terra/symbolvar.t delete mode 100644 samples/Terra/symbolvar2.t delete mode 100644 samples/Terra/symbolvar3.t delete mode 100644 samples/Terra/symbolvar4.t delete mode 100644 samples/Terra/symbolvar5.t delete mode 100644 samples/Terra/symbolvar6.t delete mode 100644 samples/Terra/symbolvar7.t delete mode 100644 samples/Terra/symparam.t delete mode 100644 samples/Terra/symparam2.t delete mode 100644 samples/Terra/symparam3.t delete mode 100644 samples/Terra/template.t delete mode 100644 samples/Terra/terracast.t delete mode 100644 samples/Terra/terralua.t delete mode 100644 samples/Terra/terraluamethod.t delete mode 100644 samples/Terra/terranew.t delete mode 100644 samples/Terra/testdebug.t delete mode 100644 samples/Terra/testimport.t delete mode 100755 samples/Terra/testlang1.t delete mode 100755 samples/Terra/testlang2.t delete mode 100644 samples/Terra/testlog.t delete mode 100644 samples/Terra/testrequire.t delete mode 100644 samples/Terra/teststd.t delete mode 100644 samples/Terra/testvector.t delete mode 100644 samples/Terra/torturechain.t delete mode 100644 samples/Terra/toterraexpression.t delete mode 100644 samples/Terra/twolang.t delete mode 100644 samples/Terra/typeexp.t delete mode 100644 samples/Terra/union.t delete mode 100644 samples/Terra/unm.t delete mode 100644 samples/Terra/unpacktuple.t delete mode 100644 samples/Terra/unsafesym.t delete mode 100644 samples/Terra/unstrict.t delete mode 100644 samples/Terra/usercast.t delete mode 100644 samples/Terra/varargcstring.t delete mode 100644 samples/Terra/vars.t delete mode 100644 samples/Terra/vars2.t delete mode 100644 samples/Terra/vec.t delete mode 100644 samples/Terra/vecarith.t delete mode 100644 samples/Terra/veclit.t delete mode 100644 samples/Terra/vecobj.t delete mode 100644 samples/Terra/vecptr.t delete mode 100644 samples/Terra/vecsize.t delete mode 100644 samples/Terra/vtablerec.t delete mode 100644 samples/Terra/zeroargs.t delete mode 100644 samples/Terra/zeroreturn.t delete mode 100644 samples/Terra/zeroreturn2.t diff --git a/samples/Terra/abouttocompile.t b/samples/Terra/abouttocompile.t deleted file mode 100644 index f6f9f6c8..00000000 --- a/samples/Terra/abouttocompile.t +++ /dev/null @@ -1,22 +0,0 @@ -struct A { - a : int; - b : int; -} - -function A.metamethods.__getentries(self) - print("GET ENTRIES") - for i,e in ipairs(self.entries) do - e.field = "foo"..e.field - end - return self.entries -end - -terra foo() - var a : A - a.fooa = 3 - a.foob = 4 - return a.fooa + a.foob -end - - -assert(foo() == 7) \ No newline at end of file diff --git a/samples/Terra/addlanguage1.t b/samples/Terra/addlanguage1.t deleted file mode 100755 index ad383d9e..00000000 --- a/samples/Terra/addlanguage1.t +++ /dev/null @@ -1,17 +0,0 @@ -do -import "lib/addlanguage" -local a = 4 -local b = add a,3,4+5,(function() terra one() return a end return one() end)() end -local inception = add add 3,4,a end,4 end -local test = require("test") - - -test.eq(b,20) -test.eq(inception,15) -end - -do -import "lib/addlanguage" -local c = add 4,5 end -assert(9 == c) -end \ No newline at end of file diff --git a/samples/Terra/aggregatearr.t b/samples/Terra/aggregatearr.t deleted file mode 100644 index b54f3dc3..00000000 --- a/samples/Terra/aggregatearr.t +++ /dev/null @@ -1,18 +0,0 @@ - - -a = terralib.new(int[4]) - -terra foo() - a[3] = 4 -end - -foo() -assert(4 == a[3]) - - -terra bar() - a = array(5,6,7,8) -end - -bar() -assert(a[3] == 8) diff --git a/samples/Terra/ainline.t b/samples/Terra/ainline.t deleted file mode 100644 index 4f6dcabe..00000000 --- a/samples/Terra/ainline.t +++ /dev/null @@ -1,24 +0,0 @@ - -C = terralib.includec("stdio.h") -terra foo() - C.printf("hello, world\n") - C.printf("hello, world\n") - C.printf("hello, world\n") - C.printf("hello, world\n") - C.printf("hello, world\n") - C.printf("hello, world\n") - C.printf("hello, world\n") - C.printf("hello, world\n") - C.printf("hello, world\n") - C.printf("hello, world\n") -end - -foo:getdefinitions()[1]:setinlined(true) - -terra bar() - foo() - return 4 -end - -bar:compile() -bar:disas() diff --git a/samples/Terra/alignment.t b/samples/Terra/alignment.t deleted file mode 100644 index 08b648f8..00000000 --- a/samples/Terra/alignment.t +++ /dev/null @@ -1,7 +0,0 @@ -local alignment = 16 -local aligned = terralib.aligned -terra foobar(a : &float) - terralib.attrstore(a,terralib.attrload(a+3,{ align = alignment }), { align = alignment }) -end - -foobar:disas() \ No newline at end of file diff --git a/samples/Terra/and.t b/samples/Terra/and.t deleted file mode 100644 index 87ea0284..00000000 --- a/samples/Terra/and.t +++ /dev/null @@ -1,9 +0,0 @@ -local test = require("test") - -terra foo(a : double, b : double, c : double) : bool - return a < b and b < c -end - -test.eq(foo(1,2,3),true) -test.eq(foo(1,2,1),false) -test.eq(foo(2,1,2),false) \ No newline at end of file diff --git a/samples/Terra/anon.t b/samples/Terra/anon.t deleted file mode 100644 index c5d3315f..00000000 --- a/samples/Terra/anon.t +++ /dev/null @@ -1,26 +0,0 @@ -local test = require("test") - -local Num = int - -local fib = -terra(a : Num) : Num - var i,c,p = 0,1,1 - while i < a do - c,p = c + p,c - i = i + 1 - end - return c -end - -function fib2(a) - local i,c,p = 0,1,1 - while i < a do - c,p = c + p,c - i = i + 1 - end - return c -end -for i = 0,10 do - print(fib(i)) - test.eq(fib(i),fib2(i)) -end \ No newline at end of file diff --git a/samples/Terra/anon3.t b/samples/Terra/anon3.t deleted file mode 100644 index 5d37c7c7..00000000 --- a/samples/Terra/anon3.t +++ /dev/null @@ -1,18 +0,0 @@ -C,T = terralib.includecstring [[ - struct D { - struct { int a; struct { int c; } c; } b; - } c; - typedef struct {int c;} B; - typedef struct { - struct { int a; } a; - struct { int b; } b; - B c; - } A; -]] - -terra foo(a : &C.A) - var c = a.a - var b = a.b.b - return c.a + b + a.c.c; -end -foo:compile() \ No newline at end of file diff --git a/samples/Terra/anonstruct.t b/samples/Terra/anonstruct.t deleted file mode 100644 index 5f661249..00000000 --- a/samples/Terra/anonstruct.t +++ /dev/null @@ -1,12 +0,0 @@ - -local C = tuple(int,tuple(int,int)) -terra anon() - var c : tuple(int,tuple(int,int)) = { 1, {2,3} } - var d : C = c - d._0 = 2 - return d._0 + c._1._0 + c._1._1 -end - -test = require("test") - -test.eq(anon(),7) \ No newline at end of file diff --git a/samples/Terra/anonstruct2.t b/samples/Terra/anonstruct2.t deleted file mode 100644 index 156e2a8b..00000000 --- a/samples/Terra/anonstruct2.t +++ /dev/null @@ -1,7 +0,0 @@ - -struct A { a : &A } - -terra foo() - var a : A -end -foo() \ No newline at end of file diff --git a/samples/Terra/antiquote1.t b/samples/Terra/antiquote1.t deleted file mode 100644 index 8bddcf3e..00000000 --- a/samples/Terra/antiquote1.t +++ /dev/null @@ -1,12 +0,0 @@ - - -function omgfunc() - return 2 -end - -terra foo() - return 1 + [{omgfunc()}] + [omgfunc()] -end - -local test = require("test") -test.eq(foo(),5) \ No newline at end of file diff --git a/samples/Terra/antiquote2.t b/samples/Terra/antiquote2.t deleted file mode 100644 index 7ad4f86d..00000000 --- a/samples/Terra/antiquote2.t +++ /dev/null @@ -1,13 +0,0 @@ - - -function omgfunc() - return 4 -end - -local what = `[ {2,3} ] -terra foo() - return [{3,`[ {2,3} ]}] -end - -local test = require("test") -test.meq({3,2,3},foo()) diff --git a/samples/Terra/antiquote3.t b/samples/Terra/antiquote3.t deleted file mode 100644 index 1d34ef7e..00000000 --- a/samples/Terra/antiquote3.t +++ /dev/null @@ -1,16 +0,0 @@ - - -function omgfunc() - return 2 -end - -a = global(0) - -terra foo() - [quote a = a + 1 end]; - [{quote a = a + 1 end,quote a = a + 1 end}] - return a -end - -local test = require("test") -test.eq(foo(),3) \ No newline at end of file diff --git a/samples/Terra/antiquote4.t b/samples/Terra/antiquote4.t deleted file mode 100644 index d6585edc..00000000 --- a/samples/Terra/antiquote4.t +++ /dev/null @@ -1,11 +0,0 @@ - - -terra foo() - var a = 4 - return [a] -end - -foo:printpretty() - -local test = require("test") -test.eq(foo(),4) \ No newline at end of file diff --git a/samples/Terra/antiquote5.t b/samples/Terra/antiquote5.t deleted file mode 100644 index 9ebbbed4..00000000 --- a/samples/Terra/antiquote5.t +++ /dev/null @@ -1,21 +0,0 @@ - - -function makeloop(N,body) - return quote - for i = 0, N do - body - end - end -end - - -terra stuff() - var a = 0; - [makeloop(10,quote - a = a + 1 - end)] - return a -end - - -print(stuff()) \ No newline at end of file diff --git a/samples/Terra/array.t b/samples/Terra/array.t deleted file mode 100644 index 28040709..00000000 --- a/samples/Terra/array.t +++ /dev/null @@ -1,60 +0,0 @@ - -terra bar() - var a : int[2] - a[0] = 1 - a[1] = 2 - return a -end - -terra foo() - var a : int[4] - a[1], a[2] = 4,2 - return a[1] + a[2] -end - -terra foo2() - var b = bar() - return b[0] + b[1] -end - -terra foo3() - return (bar())[0] -end - -terra foo4() - var a : int[4] - a[3] = 7 - var b = &a[0] - b[2] = 8 - return b[2] + b[3] -end - -terra bar2(a : &int) - a[1] = 100 - return a[0] -end - -terra foo5() - var a : int[4] - bar2(a) - return a[1] -end - -terra foo6() - return bar2(bar()) -end - - -terra foo7() - var a = array(1,2,3,4) - return a[1]+a[2] -end -local test = require("test") - -test.eq(6,foo()) -test.eq(3,foo2()) -test.eq(1,foo3()) -test.eq(15,foo4()) -test.eq(100,foo5()) -test.eq(1,foo6()) -test.eq(5,foo7()) \ No newline at end of file diff --git a/samples/Terra/arraylit.t b/samples/Terra/arraylit.t deleted file mode 100644 index 3731a367..00000000 --- a/samples/Terra/arraylit.t +++ /dev/null @@ -1,29 +0,0 @@ - -terra foo() - var a = array(1,2,3) - return a[0] + a[1] + a[2] -end - -terra foo2() - var a = array(1,2.5,3) - return a[1] -end -terra what() - return 3,4.5 -end -local expand = macro(function(a) return {`a._0,`a._1} end) -terra foo3() - var w = what() - var a = array(1,2.5,expand(w)) - return a[3] -end -terra foo4() - var a = array("what","magic","is","this") - return a[1][1] -end - -local test = require("test") -test.eq(foo(),6) -test.eq(foo2(),2.5) -test.eq(foo3(),4.5) -test.eq(foo4(),97) \ No newline at end of file diff --git a/samples/Terra/arrayt2.t b/samples/Terra/arrayt2.t deleted file mode 100644 index 8b6c9f2f..00000000 --- a/samples/Terra/arrayt2.t +++ /dev/null @@ -1,82 +0,0 @@ -local f = assert(io.popen("uname", 'r')) -local s = assert(f:read('*a')) -f:close() - -if s~="Darwin\n" then - print("Warning, not running test b/c this isn't a mac") - return -end - -C = terralib.includecstring [[ - #include - #include -]] -local arraytypes = {} -function Array(T) - if arraytypes[T] then return arraytypes[T] end - local struct ArrayImpl { - data : &T; - N : int; - } - arraytypes[T] = ArrayImpl - terra ArrayImpl:init(N : int) - self.data = [&T](C.malloc(N*sizeof(T))) - self.N = N - end - terra ArrayImpl:free() - C.free(self.data) - end - ArrayImpl.metamethods.__apply = macro(function(self,idx) - return `self.data[idx] - end) - ArrayImpl.metamethods.__methodmissing = macro(function(methodname,selfexp,...) - local args = terralib.newlist {...} - local params = args:map(function(a) return symbol(a:gettype()) end) - local terra elemfn(a : &T, [params]) - return a:[methodname](params) - end - local RT = elemfn:gettype().returntype - return quote - var self = selfexp - var r : Array(RT) - r:init(self.N) - for i = 0,r.N do - r.data[i] = elemfn(&self.data[i],args) - end - in - r - end - end) - return ArrayImpl -end - -local OC = require("lib/objc") -local IO = terralib.includec("stdio.h") - -struct Rect { - a : double, - b : double, - c : double, - d : double -} - -terra str(data : &uint8) - return OC.NSString:stringWithUTF8String(data) -end - -terra main() - OC.NSAutoreleasePool:new() - var app = OC.NSApplication:sharedApplication() - var rec = Rect {0,0,200,200} - var windows : Array(OC.ID) - windows:init(2) - windows(0) = OC.NSWindow - windows(1) = OC.NSWindow - windows = windows:alloc():initWithContentRect_styleMask_backing_defer(rec,1,2,false) - windows:makeKeyAndOrderFront(nil) - IO.printf("entering run loop\n") - app:run() -end - -terralib.linklibrary("/System/Library/Frameworks/Cocoa.framework/Cocoa") -main:compile() diff --git a/samples/Terra/arrptr.t b/samples/Terra/arrptr.t deleted file mode 100644 index 55b6a918..00000000 --- a/samples/Terra/arrptr.t +++ /dev/null @@ -1,5 +0,0 @@ -a = &int[4] -a = (&int)[4] -local test = require("test") -test.eq(false,a:ispointer()) -test.eq(true,a:isarray()) \ No newline at end of file diff --git a/samples/Terra/asm.t b/samples/Terra/asm.t deleted file mode 100644 index 803b6882..00000000 --- a/samples/Terra/asm.t +++ /dev/null @@ -1,28 +0,0 @@ -local a = ... -if not a then - --force MCJIT - os.execute("../terra -m asm.t true") - return -end - -C = terralib.includec("stdio.h") - -struct Vendor { - maxV : int; - b : int; - c : int; - d : int; -} - -terra foo() - var r = terralib.asm(Vendor,"cpuid","={eax},={ebx},={ecx},={edx},{eax},~{dirflag},~{fpsr},~{flags}",false,0) - r.c,r.d = r.d,r.c - C.printf("%.12s\n", &r.b) -end -foo() - - -terra addone(a : int) - return terralib.asm(int,"addl $$1,$1","=r,0",true,a) -end -assert(addone(3) == 4) \ No newline at end of file diff --git a/samples/Terra/atoi.t b/samples/Terra/atoi.t deleted file mode 100644 index 929f9672..00000000 --- a/samples/Terra/atoi.t +++ /dev/null @@ -1,7 +0,0 @@ -c = terralib.includec("stdlib.h") - -terra what() - return c.atoi("52") -end - -print(what()) diff --git a/samples/Terra/avxhadd.t b/samples/Terra/avxhadd.t deleted file mode 100644 index d1e762b7..00000000 --- a/samples/Terra/avxhadd.t +++ /dev/null @@ -1,32 +0,0 @@ -local haddavx = terralib.intrinsic("llvm.x86.avx.hadd.ps.256", { vector(float,8), vector(float,8) } -> vector(float,8)) - -terra hadd(v : vector(float,8)) - var v1 = haddavx(v,v) - var v2 = haddavx(v1,v1) - return v2[0] + v2[4] -end - -ffi = require("ffi") - -local stdio = terralib.includec("stdio.h") - -terra foobar(a : &float) - return hadd(@[&vector(float,8)](a)) -end - -dat = ffi.new("float[?] __attribute__((aligned(32)))",8) - -for i = 1,8 do - dat[i-1] = i -end - -if terralib.llvmversion == 31 then - print("ignoring...") -else - foobar:compile() - local test = require("test") - test.eq(foobar(dat),36) -end - ---terralib.saveobj("avxhadd",{main = foobar}) ---os.execute("./avxhadd") \ No newline at end of file diff --git a/samples/Terra/badname.t b/samples/Terra/badname.t deleted file mode 100644 index a2436c12..00000000 --- a/samples/Terra/badname.t +++ /dev/null @@ -1,4 +0,0 @@ ---tostring on a type should never error, so we assign it its original name if it does -struct A {} -A.metamethods.__typename = error -print(A) \ No newline at end of file diff --git a/samples/Terra/benchmark_fannkuchredux.t b/samples/Terra/benchmark_fannkuchredux.t deleted file mode 100644 index 2ec27e6e..00000000 --- a/samples/Terra/benchmark_fannkuchredux.t +++ /dev/null @@ -1,148 +0,0 @@ ---[[ - The Computer Language Benchmarks Game - http://shootout.alioth.debian.org/ - - contributed by Ledrug Katz - - ]] - - -local C = { - printf = terralib.externfunction("printf", terralib.types.funcpointer(rawstring,int,true)), - exit = terralib.externfunction("exit", int -> {}), - atoi = terralib.externfunction("atoi", rawstring -> int) -} - --- this depends highly on the platform. It might be faster to use --- char type on 32-bit systems; it might be faster to use unsigned. - -elem = int - -s = global(elem[16]) -t = global(elem[16]) - -maxflips = global(int) -max_n = global(int) -odd = global(bool) -checksum = global(int) - -terra flip() - var i = max_n - var x : &elem = t - var y : &elem = s - var c : elem - - while i > 0 do - i = i - 1 - @x = @y - x = x + 1 - y = y + 1 - end - - i = 1 - - repeat - x = t - y = t + t[0] - while x < y do - c = @x - @x = @y - x = x + 1 - @y = c - y = y - 1 - end - i = i + 1 - until t[t[0]] == 0 - --C.printf("flip %d\n",i); - return i -end - - -terra rotate(n : int) - var c = s[0] - for i = 0,n do - s[i] = s[i+1] - end - s[n] = c - --C.printf("rotate(%d) %d\n",n,c); -end - - -terra tk(n : int) - var i = 0 - var f : int - var c : elem[16] - - for i = 0,16 do - c[i] = 0 - end - - while i < n do - rotate(i) - if c[i] >= i then - c[i] = 0 - i = i + 1 - goto continue - end - - c[i] = c[i] + 1 - i = 1 - odd = not odd - if s[0] ~= 0 then - if s[s[0]] ~= 0 then - f = flip() - else - f = 1 - end - if f > maxflips then - maxflips = f - end - --C.printf("f = %d\n",f) - if odd then - checksum = checksum - f - else - checksum = checksum + f - end - end - ::continue:: - end - -end - - -terra doit(N : int) - maxflips = 0 - odd = false - checksum = 0 - max_n = N - if max_n < 3 or max_n > 15 then - C.printf("range: must be 3 <= n <= 12\n") - C.exit(1) - end - - for i = 0,max_n do - s[i] = i - end - tk(max_n) - C.printf("%d\nPfannkuchen(%d) = %d\n", checksum, max_n, maxflips) - return checksum -end - -terra main(argc : int, v : &&int8) - if argc < 2 then - C.printf("usage: %s number\n", v[0]) - C.exit(1); - end - - doit(C.atoi(v[1])) - return 0 -end - -local test = require("test") - -doit:compile() -print(test.time(function() - test.eq(doit(10),73196) -end)) - -terralib.saveobj("benchmark_fannkuchredux", { main = main } ) diff --git a/samples/Terra/bf.t b/samples/Terra/bf.t deleted file mode 100644 index 84b99b5a..00000000 --- a/samples/Terra/bf.t +++ /dev/null @@ -1,60 +0,0 @@ - -local C = terralib.includec("stdio.h") - -local function compile(code,N) - local function body(data,ptr) - local stmts = terralib.newlist() - local jumpstack = {} - for i = 1,#code do - local c = code:sub(i,i) - local stmt - if c == ">" then - stmt = quote ptr = ptr + 1 end - elseif c == "<" then - stmt = quote ptr = ptr - 1 end - elseif c == "+" then - stmt = quote data[ptr] = data[ptr] + 1 end - elseif c == "-" then - stmt = quote data[ptr] = data[ptr] - 1 end - elseif c == "." then - stmt = quote C.putchar(data[ptr]) end - elseif c == "," then - stmt = quote data[ptr] = C.getchar() end - elseif c == "[" then - local target = { before = symbol(), after = symbol() } - table.insert(jumpstack,target) - stmt = quote - ::[target.before]:: - if data[ptr] == 0 then - goto [target.after] - end - end - elseif c == "]" then - local target = table.remove(jumpstack) - assert(target) - stmt = quote - goto [target.before] - :: [target.after] :: - end - else - error("unknown character "..c) - end - stmts:insert(stmt) - end - return stmts - end - return terra() - var data : int[N] - for i = 0, N do - data[i] = 0 - end - var ptr = 0; - [ body(data,ptr) ] - end -end - -local helloworld = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>." - -local fn = compile(helloworld,256) - -fn() \ No newline at end of file diff --git a/samples/Terra/blankexp.t b/samples/Terra/blankexp.t deleted file mode 100644 index e53242c1..00000000 --- a/samples/Terra/blankexp.t +++ /dev/null @@ -1,7 +0,0 @@ -local a = quote - while false do end -end -terra foo() - return a -end -foo() \ No newline at end of file diff --git a/samples/Terra/blockescape.t b/samples/Terra/blockescape.t deleted file mode 100644 index eb475932..00000000 --- a/samples/Terra/blockescape.t +++ /dev/null @@ -1,23 +0,0 @@ -terra foo() - var c = 3 - escape - local a = 1 - for i = 1,10 do - emit quote c = c + a end - end - end - return c -end - -assert(foo() == 13) - -terra foo2() - return escape emit(1) end -end - -assert(1 == foo2()) - -a = terralib.newlist() -a:insert quote - foo() -end \ No newline at end of file diff --git a/samples/Terra/blocking.t b/samples/Terra/blocking.t deleted file mode 100644 index 8ee19e3e..00000000 --- a/samples/Terra/blocking.t +++ /dev/null @@ -1,57 +0,0 @@ -function symmat(name,I,...) - if not I then return symbol(name) end - local r = {} - for i = 1,I do - r[i] = symmat(name..tostring(i),...) - end - return r -end - -terra min(a : int, b : int) - return terralib.select(a < b, a, b) -end - -function blockedloop(bounds,sizes,bodyfn) - local indexes = symmat("i",#sizes,#bounds) - --local makeloop --bug local function doesn't add to set of live variables... - local function makeloop(s,b) - if s > #sizes then - return bodyfn(unpack(indexes[#sizes])) - elseif b > #bounds then - return makeloop(s + 1, 1) - else - local topbound = bounds[b] - local blocksize = sizes[s] - local begin,bound - if s == 1 then - begin,bound = 0, topbound - else - begin,bound = indexes[s-1][b], sizes[s-1] - end - local step = sizes[s] - return quote - for [indexes[s][b]] = begin,min(begin+bound,topbound),step do - [ makeloop(s,b+1) ] - end - end - end - end - return makeloop(1,1) -end - -IO = terralib.includec("stdio.h") - -terra main() - - var M,N = 30,40; - - [blockedloop({M,N}, {10,1}, function(m,n) - return quote - IO.printf("%d %d\n",m,n) - end - end)] - -end - -main:printpretty() -main() \ No newline at end of file diff --git a/samples/Terra/blocking2-fixed.t b/samples/Terra/blocking2-fixed.t deleted file mode 100644 index 10ff5a6d..00000000 --- a/samples/Terra/blocking2-fixed.t +++ /dev/null @@ -1,68 +0,0 @@ -C = terralib.includec("stdio.h") - -terra min(a: int, b: int) : int - if a < b then return a - else return b end -end -std = terralib.includec("stdlib.h") -function Image(PixelType) - local struct ImageImpl { - data : &PixelType, - N : int - } - terra ImageImpl:init(N: int): {} --returns nothing - self.data = [&PixelType]( - std.malloc(N*N*sizeof(PixelType))) - self.N = N - end - terra ImageImpl:get(x: int, y: int) : PixelType - return self.data[x*self.N + y] - end - - - terra ImageImpl:set(x: int, y: int, v : PixelType) - self.data[x*self.N + y] = v - end - terra ImageImpl:save(i : rawstring) - for i = 0, 2 do for j = 0, 2 do - C.printf("%d %d %f\n", i,j,self:get(i,j)) - end end - end - terra ImageImpl:load(i : rawstring) self:init(16) - for i = 0, 4 do for j = 0, 4 do - self:set(i,j,(i*4+j)%3) - --C.printf("%f\n",self:get(i,j)) - end end - end - terra ImageImpl:free() end - - --omitted methods for: set, save, load, free - return ImageImpl -end -GreyscaleImage = Image(float) -terra laplace(img: &GreyscaleImage, - out: &GreyscaleImage) : {} - --shrink result, do not calculate boundaries - var newN = img.N - 2 - out:init(newN) - for i = 0,newN do - for j = 0,newN do - var v = img:get(i+0,j+1) + img:get(i+2,j+1) - + img:get(i+1,j+2) + img:get(i+1,j+0) - - 4 * img:get(i+1,j+1) - out:set(i,j,v) - end - end -end -terra runlaplace(input: rawstring, - output: rawstring) : {} - var i: GreyscaleImage, o : GreyscaleImage - i:load(input) - laplace(&i,&o) - o:save(output) - i:free(); o:free() -end - -runlaplace("myinput","myoutput") - terralib.saveobj("runlaplace.o", - {runlaplace = runlaplace}) diff --git a/samples/Terra/blocking2.t b/samples/Terra/blocking2.t deleted file mode 100644 index 2b0b3b71..00000000 --- a/samples/Terra/blocking2.t +++ /dev/null @@ -1,81 +0,0 @@ -terra min(a : int, b : int) - return terralib.select(a < b, a, b) -end -function blockedloop(N,blocksizes,bodyfn) - local function generatelevel(n,ii,jj,bb) - if n > #blocksizes then - return bodyfn(ii,jj) - end - local blocksize = blocksizes[n] - return quote - for i = ii,min(ii+bb,N),blocksize do - for j = jj,min(jj+bb,N),blocksize do - [ generatelevel(n+1,i,j,blocksize) ] - end - end - end - end - return generatelevel(1,0,0,N) -end - -IO = terralib.includec("stdio.h") -stdlib = terralib.includec("stdlib.h") - -terra main() - - var a : int[8][8] - var c = 0 - var N = 8 - [blockedloop(N, {4,2,1}, function(i,j) - return quote - --IO.printf("%d %d\n",i,j) - a[i][j] = c - c = c + 1 - end - end)] - for i = 0,N do - for j = 0,N do - IO.printf("%d\t",a[i][j]) - end - IO.printf("\n") - end -end - -main() - - - -function Image(Spectrum) - local struct ImageImpl { - data : &Spectrum, - N : int - } - terra ImageImpl:init(N : int) - self.data = [&float](stdlib.malloc(N*N*sizeof(Spectrum))) - self.N = N - end - ImageImpl.methods.pixel = macro(function(self,x,y) - return `self.data[x*self.N + y] - end) - return ImageImpl -end - -GreyScaleImage = Image(float) - -terra laplace(input : &GreyScaleImage, output : &GreyScaleImage) - var newN = input.N - 2 --shrink result since we do not calculate boundaries - output:init(newN); - [blockedloop(newN,{32,1},function(i,j) - return quote - output:pixel(i,j) = - input:pixel(i+0,j+1) - + input:pixel(i+2,j+1) - + input:pixel(i+1,j+2) - + input:pixel(i+1,j+0) - - 4 * input:pixel(i+1,j+1) - end - end)] -end - -laplace:compile() -laplace:printpretty() \ No newline at end of file diff --git a/samples/Terra/blocking3.t b/samples/Terra/blocking3.t deleted file mode 100644 index c7b99b98..00000000 --- a/samples/Terra/blocking3.t +++ /dev/null @@ -1,85 +0,0 @@ -C = terralib.includec("stdio.h") - -function blockedloop(N,blocksizes,bodyfn) - local function generatelevel(n,ii,jj,bb) - if n > #blocksizes then - return bodyfn(ii,jj) - end - local blocksize = blocksizes[n] - return quote - for i = ii,min(ii+bb,N),blocksize do - for j = jj,min(jj+bb,N),blocksize do - [ generatelevel(n+1,i,j,blocksize) ] - end - end - end - end - return generatelevel(1,0,0,N) -end - -terra min(a: int, b: int) : int - if a < b then return a - else return b end -end -std = terralib.includec("stdlib.h") -function Image(PixelType) - local struct ImageImpl { - data : &PixelType, - N : int - } - terra ImageImpl:init(N: int): {} --returns nothing - self.data = - [&PixelType](std.malloc(N*N*sizeof(PixelType))) - self.N = N - end - terra ImageImpl:get(x: int, y: int) : PixelType - return self.data[x*self.N + y] - end - - - terra ImageImpl:set(x: int, y: int, v : PixelType) - self.data[x*self.N + y] = v - end - terra ImageImpl:save(i : rawstring) - for i = 0, 8 do for j = 0, 8 do - C.printf("%d %d %f\n", i,j,self:get(i,j)) - end end - end - terra ImageImpl:load(i : rawstring) self:init(16) - for i = 0, 10 do for j = 0, 10 do - self:set(i,j,(i*4+j)%3) - --C.printf("%f\n",self:get(i,j)) - end end - end - terra ImageImpl:free() end - - --omitted methods for: set, save, load, free - return ImageImpl -end -GreyscaleImage = Image(float) -terra laplace(img: &GreyscaleImage, - out: &GreyscaleImage) : {} - --shrink result, do not calculate boundaries - var newN = img.N - 2 - out:init(newN); - [blockedloop(newN,{4,2,1}, function(i,j) - return quote - var v = img:get(i+0,j+1) + img:get(i+2,j+1) - + img:get(i+1,j+2) + img:get(i+1,j+0) - - 4 * img:get(i+1,j+1) - out:set(i,j,v) - end - end)] -end -terra runlaplace(input: rawstring, - output: rawstring) : {} - var i: GreyscaleImage, o : GreyscaleImage - i:load(input) - laplace(&i,&o) - o:save(output) - i:free(); o:free() -end - -runlaplace("myinput","myoutput") - terralib.saveobj("runlaplace.o", - {runlaplace = runlaplace}) diff --git a/samples/Terra/bounce.t b/samples/Terra/bounce.t deleted file mode 100644 index 85e7400c..00000000 --- a/samples/Terra/bounce.t +++ /dev/null @@ -1,23 +0,0 @@ -local io = terralib.includec("stdio.h") - -struct Count { value : int } -function luafn(a) - print("lua:",a.value) - a.value = a.value + 1 - terrafn(a) -end -terra terrafn(a : &Count) - io.printf("terra: %d\n",a.value) - if a.value < 100 then - luafn(a) - end - return a.value -end - -terra begin() - var c = Count {0} - return terrafn(&c) -end - -local test = require("test") -test.eq(begin(),100) \ No newline at end of file diff --git a/samples/Terra/bug.t b/samples/Terra/bug.t deleted file mode 100644 index 5d2f860d..00000000 --- a/samples/Terra/bug.t +++ /dev/null @@ -1,20 +0,0 @@ -local f = assert(io.popen("uname", 'r')) -local s = assert(f:read('*a')) -f:close() - -if s~="Darwin\n" then - print("Warning, not running test b/c this isn't a mac") -else - - -local OC = require("lib/objc") -local OCR = terralib.includec("objc/runtime.h") - -terra main() - var nsobject = OC.NSObject - OCR.objc_allocateClassPair([&OCR.objc_class](nsobject.data),nil,0) -end - -main:compile() - -end \ No newline at end of file diff --git a/samples/Terra/bug2.t b/samples/Terra/bug2.t deleted file mode 100644 index 91b77cbd..00000000 --- a/samples/Terra/bug2.t +++ /dev/null @@ -1,20 +0,0 @@ -ffi = require("ffi") -cstdio = terralib.includec("stdio.h") - -local vec4 = &vector(float,4) - -local align = terralib.aligned -terra lol( w : &float, out : &float) - var a = terralib.attrload(vec4(w),{align = 4}) - terralib.attrstore(vec4(out), a, {align = 4}) -end - -dat = ffi.new("float[?]",32) -for i=0,31 do dat[i]=i end -datO = ffi.new("float[?]",32) - -lol:compile() -lol:disas() - -lol(dat, datO) - diff --git a/samples/Terra/bug3.t b/samples/Terra/bug3.t deleted file mode 100644 index e58be1df..00000000 --- a/samples/Terra/bug3.t +++ /dev/null @@ -1,15 +0,0 @@ - - -local S = terralib.types.newstruct("mystruct") - -struct A { - v : int -} - -S.entries:insert( { type = A, field = "what" } ) -terra foo() - var v : S - return v.what.v -end - -foo:compile() diff --git a/samples/Terra/bug4.t b/samples/Terra/bug4.t deleted file mode 100644 index 2690b028..00000000 --- a/samples/Terra/bug4.t +++ /dev/null @@ -1,14 +0,0 @@ -c = terralib.includecstring [[ - #include - #include -]] -struct exception { slug : int8[60]; code : int; msg : int8[960]; } -EXC_INFO = terralib.new(exception) -terra bar() c.memcpy(EXC_INFO.slug + 0, 'foobar', 7); c.printf('%s\n', EXC_INFO.slug + 0); end -bar() - -terra zoo() EXC_INFO.slug[0] = 65; EXC_INFO.slug[1] = 0; c.printf('%s\n', EXC_INFO.slug + 0); end -zoo() - -terra zoo2() EXC_INFO.slug[0] = 65; EXC_INFO.slug[1] = 0; return EXC_INFO.slug[0] end -assert(zoo2() == 65) \ No newline at end of file diff --git a/samples/Terra/calc.t b/samples/Terra/calc.t deleted file mode 100644 index 2167f2b8..00000000 --- a/samples/Terra/calc.t +++ /dev/null @@ -1,33 +0,0 @@ -function makecalcfn(inst) - local stk = {} - for i,v in ipairs(inst) do - if type(v) == "number" then - table.insert(stk,`v) - else - local b = table.remove(stk) - local a = table.remove(stk) - - if v == "+" then - table.insert(stk,`a + b) - elseif v == "-" then - table.insert(stk,`a - b) - elseif v == "*" then - table.insert(stk,`a * b) - elseif v == "/" then - table.insert(stk,`a / b) - end - end - end - - local result = table.remove(stk) - - local terra wrapper() - return result - end - - return wrapper -end - -local calcfn = makecalcfn({5,4,"*",5,"-",3,"+"}) -local test = require("test") -test.eq(calcfn(),18) diff --git a/samples/Terra/call.t b/samples/Terra/call.t deleted file mode 100644 index 4bf49c62..00000000 --- a/samples/Terra/call.t +++ /dev/null @@ -1,53 +0,0 @@ - -terra bar(a : int, b : int) : int - return a + b -end -terra foo(a : int,b : int) : int - return bar(a,b) + 1 -end - -terra baz(a : int, b : int) : int - var f,c,d = 4,baz2(a,b) - return f + c + d -end and -terra baz2(a : int, b : int) : {int, int} - return a + 1, b + 2 -end - -terra two(a : int, b : int) : int - return a + b -end -terra baz3() : int - var a,b = baz2(1,2) - return two(a,b) -end -terra baz4() : int - return two(5,(baz2(1,2))._0) -end - -terra baz5() - var a,b = baz2(0,0) - return 1,2,a,b -end - -terra baz6() - var a,b,c,d = baz5() - var e = (baz5()._0) - return a + b + c + d + e -end - -terra baz7(a : int) - if a < 3 then - return 1,(baz5())._0 - else - return 100,2 - end -end -local test = require("test") - -test.eq(foo(2,3),6) -test.eq(baz(1,2),10) -test.eq(baz3(),6) -test.eq(baz4(),7) -test.eq(baz6(),7) -test.meq({100,2},baz7(10)) \ No newline at end of file diff --git a/samples/Terra/callbackcache.t b/samples/Terra/callbackcache.t deleted file mode 100644 index 06450cf3..00000000 --- a/samples/Terra/callbackcache.t +++ /dev/null @@ -1,9 +0,0 @@ - - -for i = 1,10 do - local terra doprint() - print(1,2) - print(3) - end - doprint() -end \ No newline at end of file diff --git a/samples/Terra/canon.t b/samples/Terra/canon.t deleted file mode 100644 index c07ffaae..00000000 --- a/samples/Terra/canon.t +++ /dev/null @@ -1,45 +0,0 @@ - -struct B { - a : A -} and -struct A { - b : &B -} - - - - -struct C { - i : int -} -local U = struct { c : C } -local UP = &U - - -local FP = UP -> int -local FP2 = UP -> int - -local FI = int -> int -local FI2 = int -> int -terra anon() - var b : B - b.a.b = &b - return 4 -end - -terra anon2() - var u = U { C {3} } - - var fp : FP, fi : FI - var fi2 : FI2 = fi - var fp2 : FP2 = fp - var up : UP = &u - return up.c.i -end - - - -test = require("test") - -test.eq(anon(),4) -test.eq(anon2(),3) \ No newline at end of file diff --git a/samples/Terra/canon2.t b/samples/Terra/canon2.t deleted file mode 100644 index a73b8577..00000000 --- a/samples/Terra/canon2.t +++ /dev/null @@ -1,41 +0,0 @@ -local C = terralib.includecstring [[ - typedef union { - float v[2]; - struct { - float x; - float y; - }; - } float2; - static float2 a; - void doit() { - a.x = 4; - a.y = 5; - } - float2* what() { return &a; } -]] - -C.float2:printpretty() - -local anonstructgetter = macro(function(name,self) - for i,e in pairs(self:gettype():getfields()) do - if e.key:match("_%d+") and e.type:getfield(name) then - return `self.[e.key].[name] - end - end - error("no field "..name.." in struct of type "..tostring(T)) -end) - -C.float2.metamethods.__entrymissing = anonstructgetter - -terra foo(pa : &C.float2) - var a = @C.what() - return a.v[0],a.v[1],a.x,a.y -end - -C.doit() - -local a = foo(C.what()) -assert(4 == a._0) -assert(5 == a._1) -assert(4 == a._2) -assert(5 == a._3) \ No newline at end of file diff --git a/samples/Terra/cast.t b/samples/Terra/cast.t deleted file mode 100644 index 6de7f79d..00000000 --- a/samples/Terra/cast.t +++ /dev/null @@ -1,11 +0,0 @@ -terra bar(a : int) : int - return a + 1 -end -terra foo(a : int) : int - - return a -end - -local test = require("test") -test.eq(foo(2),2) -test.eq(bar(2),3) diff --git a/samples/Terra/cbool.t b/samples/Terra/cbool.t deleted file mode 100644 index cfa7cd4a..00000000 --- a/samples/Terra/cbool.t +++ /dev/null @@ -1,13 +0,0 @@ - - -C = terralib.includecstring [[ - _Bool And(_Bool a, _Bool b) { return a && b; } -]] - - -terra foobar(a : bool, b : bool) - return C.And(a,b) -end - -assert(foobar(false,true) == false) -assert(foobar(true,true) == true) \ No newline at end of file diff --git a/samples/Terra/cconv.t b/samples/Terra/cconv.t deleted file mode 100644 index ba12b5e9..00000000 --- a/samples/Terra/cconv.t +++ /dev/null @@ -1,488 +0,0 @@ - -local test = require("test") - -terra f1(a : int) - return a -end - -terra c1() - return 1 + f1(4),f1(4) -end - -terra f2(a : int, b : float) - return a + b -end - -terra c2() - return f2(3,4) + 1, f2(3,4) -end - - -terra f3() - return 3,4 -end - -terra c3() - var r = f3() - return f3()._0 + 1,unpackstruct(r) -end - -terra f4() : {float,float} - return 3.25,4.25 -end - -terra c4() - var r = f4() - return f4()._0 + 1, unpackstruct(r) -end - - -terra f5(a : int) : {uint8,uint8,uint8,uint8} - return 0,1,a,3 -end - -terra c5() - var r = f5(8) - return f5(8)._0 + 1, unpackstruct(r) -end - -terra f6() : {double, double, int} - return 3.25, 4.25, 3 -end - -terra c6() - var r = f6() - return f6()._0 + 1, unpackstruct(r) -end -test.meq({4.25, 3.25,4.25,3},c6()) - -terra f7(a : int) : {double, double, int} - return 3.25, 4.25, a -end - -terra c7() - var r = f7(4) - return f7(4)._0 + 1, unpackstruct(r) -end -test.meq({4.25,3.25,4.25,4},c7()) - -terra f8() : {double, double} - return 3.25, 4.25 -end - -terra c8() - var r= f8() - return f8()._0 + 1, unpackstruct(r) -end - -test.meq({4.25,3.25,4.25},c8()) - -struct S1 { - a : int; - b : int; -} - -terra f9(a : S1) - return a.a+1,a.b+2 -end - -terra c9() - var a = S1 { 4, 5} - var r = f9(a) - return f9(a)._0 + 1, unpackstruct(r) -end -test.meq({6,5,7},c9()) - -struct S2 { - a : int; - b : double; - c : double; -} - -terra f10(a : S2) - return a.a, a.b, a.c -end - -terra c10() - var s2 = S2 { 4,5,6 } - var r = f10(s2) - return f10(s2)._0 + 1, unpackstruct(r) -end - -test.meq({5,4,5,6},c10()) - -C = terralib.includec("stdio.h") - -terra f11(a : int) - C.printf("f11 %d\n",a) -end - - -terra c11() - f11(7) -end -c11() - -struct S3 { - a : vector(float,2); - b : double; -} - -struct S4 { - b : double; - a : vector(float,2); -} - -struct S5 { - a : vector(uint8,4); - b : int; -} - -terra f12a(a : S3) - return a.a[0] + a.a[1], a.b -end - -terra c12a() - var a = S3 { vector(2.25f, 3.25f), 4 } - var r = f12a(a) - return f12a(a)._0 + 1, unpackstruct(r) -end -test.meq({6.5,5.5,4},c12a()) - -terra f12b(a : S4) - return a.a[0] + a.a[1], a.b -end - -terra c12b() - var a = S4 { 4, vector(2.25f, 3.25f) } - var r = f12b(a) - return f12b(a)._0 + 1, unpackstruct(r) -end -test.meq({6.5,5.5,4},c12b()) - - -terra f12() - var a = S3 { vector(8.f,2.f), 3.0 } - var b = S4 { 3.0, vector(8.f,2.f) } - var c,d = f12a(a) - var e,f = f12b(b) - return c,d,e,f -end - -terra f13a(a : S5) - return a.a[0] + a.a[1] + a.a[2] + a.a[3], a.b -end - -terra f13() - var a = S5 { vectorof(int8, 1,2,3,4), 5 } - return f13a(a) -end - - -struct S6 { - a : float; - aa : float; - b : float -} - -struct S7a { - a : int; - b : int; -} -struct S7 { - a : int; - b : S7a; - c : int; -} - -terra f14(a : S6) - return a.a,a.aa,a.b -end - -terra c14() - var a = S6 { 4,2,3} - var r = f14(a) - return f14(a)._0 + 1, unpackstruct(r) -end -test.meq({5,4,2,3},c14()) - -terra f15(a : S7) - return a.a, a.b.a, a.b.b, a.c -end - -terra c15() - var a = S7 {1, S7a { 2,3 }, 4} - var r = f15(a) - return f15(a)._0 + 1, unpackstruct(r) -end - -test.meq({2,1,2,3,4}, c15()) - -struct S8 { - a : uint8[7]; -} - -terra f16(a : S8) - return a.a[0],a.a[6] -end - -terra c16() - var a = S8 { arrayof(uint8, 1,2,3,4,5,6,7) } - var r = f16(a) - return f16(a)._0 + 1, unpackstruct(r) -end - -test.meq({2,1,7},c16()) - -struct S9 { - a : uint8[9]; -} - -terra f17(a : S9) - return a.a[0],a.a[8] -end - -terra c17() - var a = S9 { arrayof(uint8, 1,2,3,4,5,6,7,8,9) } - var r = f17(a) - return f17(a)._0 + 1, unpackstruct(r) -end - - -test.meq({2,1,9},c17()) - - -struct S10 { - a : double; - b : int64 -} - - -terra f18a(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a5 : int, a : S10) - return a.a, a.b -end - -terra c18a() - var r = f18a(1,2,3,4,5,6,S10{7,8}) - return f18a(1,2,3,4,5,6,S10{7,8})._0 + 1, unpackstruct(r) -end - -test.meq({8,7,8},c18a()) - - -terra f18b(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a : S10) - return a.a, a.b -end - -terra c18b() - var r = f18b(1,2,3,4,5,S10{7,8}) - return f18b(1,2,3,4,5,S10{7,8})._0 + 1, unpackstruct(r) -end - -test.meq({8,7,8},c18b()) - -terra f18c(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a : S10) - return a.a, a.b, a0, a1, a2 -end -terra c18c() - var r = f18c(1,2,3,4,5,S10 {7,8}) - return f18c(1,2,3,4,5,S10{7,8})._0 + 1, unpackstruct(r) -end - -test.meq({8,7,8,1,2,3},c18c()) - -struct S11 { - a : float; - b : int; -} - -terra f18d(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a5 : int, a : S11) - return a.a, a.b -end -terra c18d() - var r = f18d(1,2,3,4,5,6,S11{7,8}) - return f18d(1,2,3,4,5,6,S11{7,8})._0 + 1, unpackstruct(r) -end -test.meq({8,7,8},c18d()) - - -terra f18e(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a : S11) - return a.a, a.b -end - -terra c18e() - var r = f18e(1,2,3,4,5,S11{7,8}) - return f18e(1,2,3,4,5,S11{7,8})._0 + 1, unpackstruct(r) -end - -test.meq({8,7,8},c18e()) - -terra f18f(a0 : int, a1 : int, a2 : int, a3 : int, a4: int, a : S11) - return a.a, a.b, a0, a1, a2 -end - -terra c18f() - var r = f18f(1,2,3,4,5,S11{7,8}) - return f18f(1,2,3,4,5,S11{7,8})._0 + 1, unpackstruct(r) -end - -test.meq({8,7,8,1,2,3},c18f()) - - -terra f18g(a0 : float, a1 : float, a2 : float, a3 : float, a4: float, a5 : float, a6 : float, a7 : float, a : S10) - return a.a, a.b -end - -terra c18g() - var r = f18g(1,2,3,4,5,6,9,10,S10{7,8}) - return f18g(1,2,3,4,5,6,9,10,S10{7,8})._0 + 1, unpackstruct(r) -end - -test.meq({8,7,8},c18g()) - -terra f18h(a0 : float, a1 : float, a2 : float, a3 : float, a4: float, a5 : float, a6 : float, a : S10) - return a.a, a.b -end - -terra c18h() - var r = f18h(1,2,3,4,5,6,9,S10{7,8}) - return f18h(1,2,3,4,5,6,9,S10{7,8})._0 + 1, unpackstruct(r) -end - -test.meq({8,7,8},c18h()) - -terra f18i(a0 : float, a1 : float, a2 : float, a3 : float, a4: float, a5 : float, a6 : float, a : S10) - return a.a, a.b, a0, a1, a2 -end - -terra c18i() - var r = f18i(1,2,3,4,5,6,9,S10{7,8}) - return f18i(1,2,3,4,5,6,9,S10{7,8})._0 + 1, unpackstruct(r) -end - -test.meq({8,7,8,1,2,3},c18i()) - -struct S12 { - a : float; - b : int; -} - -terra f19(a : S12) - return a.a, a.b -end -terra c19() - var a = S12 { 3,5 } - var r = f19(a) - return f19(a)._0 + 1, unpackstruct(r) -end -test.meq({4,3,5},c19()) - - - -terra f20(a : S10, b : int) - return a.a,a.b,b -end -terra c20() - var r = f20(S10{1,2},3) - return f20(S10{1,2},3)._0 + 1, unpackstruct(r) -end -test.meq({2,1,2,3},c20()) - - -terra f21() - return -end -f21() - -terra f22() - return S12 { 3, 4} -end -terra c22() - return f22().a, f22() -end -local s22_0, s22_1 = terralib.unpackstruct(c22()) -test.eq(s22_0,3) -test.eq(s22_1.a,3) -test.eq(s22_1.b,4) - -terra f23() - return S10 { 1, 2} -end - -terra c23() - return f23().a, f23() -end -local s23_0, s23_1 = terralib.unpackstruct(c23()) -test.eq(s23_0,1) -test.eq(s23_1.a,1) -test.eq(s23_1.b,2) - -terra f24() - return S2 { 1,2,3} -end - -terra c24() - return f24().a, f24() -end -local s24_0, s24_1 = terralib.unpackstruct(c24()) -test.eq(s24_0,1) -test.eq(s24_1.a,1) -test.eq(s24_1.b,2) -test.eq(s24_1.c,3) - - -local s22 = f22() -test.eq(s22.a,3) -test.eq(s22.b,4) - -local s23 = f23() -test.eq(s23.a,1) -test.eq(s23.b,2) - - -local s24 = f24() - -test.eq(s24.a,1) -test.eq(s24.b,2) -test.eq(s24.c,3) - - -test.meq({1,2,3},f20({1,2},3)) - - -test.eq(f1(3),3) -test.eq(f2(4,5),9) -test.meq({3,4},f3()) -test.meq({3.25,4.25},f4()) -test.meq({0,1,2,3},f5(2)) -test.meq({3.25,4.25,3},f6()) -test.meq({3.25,4.25,4},f7(4)) -test.meq({3.25,4.25},f8()) -test.meq({3,5},f9({2,3})) -test.meq({1,2.5,3.5},f10({1,2.5,3.5})) -f11(3) -test.meq({10,3,10,3},f12()) -test.meq({10,5},f13()) -test.meq({4,5,6},f14({4,5,6})) -test.meq({1,2,3,4},f15({1,{2,3},4})) -test.meq({1,7},f16({{1,2,3,4,5,6,7}})) -test.meq({1,9},f17({{1,2,3,4,5,6,7,8,9}})) -test.meq({7,8},f18a(1,2,3,4,5,6,{7,8})) -test.meq({7,8},f18b(1,2,3,4,5,{7,8})) -test.meq({7,8,1,2,3},f18c(1,2,3,4,5,{7,8})) - -test.meq({7,8},f18d(1,2,3,4,5,6,{7,8})) -test.meq({7,8},f18e(1,2,3,4,5,{7,8})) -test.meq({7,8,1,2,3},f18f(1,2,3,4,5,{7,8})) - -test.meq({9,10},f18g(1,2,3,4,5,6,7,8,{9,10})) -test.meq({9,10},f18h(1,2,3,4,5,6,7,{9,10})) -test.meq({9,10,1,2,3},f18i(1,2,3,4,5,6,7,{9,10})) - -test.meq({4,5}, f19({4,5})) - -test.meq({5,4},c1()) -test.meq({8,7},c2()) -test.meq({4,3,4},c3()) -test.meq({4.25,3.25,4.25},c4()) -test.meq({1,0,1,8,3},c5()) \ No newline at end of file diff --git a/samples/Terra/cfgbug.t b/samples/Terra/cfgbug.t deleted file mode 100644 index b1f9b31c..00000000 --- a/samples/Terra/cfgbug.t +++ /dev/null @@ -1,14 +0,0 @@ -local struct Type { - field: int -} - -local terra foo(obj: Type) end -foo:setinlined(false) - -local terra bar() - var obj: Type - defer foo(obj) - return -end - -bar() \ No newline at end of file diff --git a/samples/Terra/clanginfo.t b/samples/Terra/clanginfo.t deleted file mode 100644 index b1d27a70..00000000 --- a/samples/Terra/clanginfo.t +++ /dev/null @@ -1 +0,0 @@ -terralib.includec("stdio.h",{"-v"}) diff --git a/samples/Terra/class.t b/samples/Terra/class.t deleted file mode 100644 index e02546d9..00000000 --- a/samples/Terra/class.t +++ /dev/null @@ -1,235 +0,0 @@ - -IO = terralib.includec("stdio.h") -local Class = require("lib/javalike") - -struct A { - a : int -} -terra A:times2() : int - return self.a*2 -end - -struct B { - b : int -} -Class.extends(B,A) - -terra B:combine(a : int) : int - return self.b + self.a + a -end - - -struct C { - c : double -} -Class.extends(C,B) - -terra C:combine(a : int) : int - return self.c + self.a + self.b + a -end -terra C:times2() : double - return self.a * 4 -end - -terra doubleAnA(a : &A) - return a:times2() -end - -terra combineAB(b : &B) - return b:combine(3) -end - -terra returnA(a : A) - return a -end -terra foobar1() - var c = C.alloc() - c.a,c.b,c.c = 1,2,3.5 - return c:times2() -end - -assert(foobar1() == 4) - -terra foobar() - - var a = A.alloc() - a.a = 1 - var b = B.alloc() - b.a,b.b = 1,2 - - var c = C.alloc() - c.a,c.b,c.c = 1,2,3.5 - - var r = doubleAnA(a) + doubleAnA(b) + doubleAnA(c) + combineAB(b) + combineAB(c) - - a:free() - b:free() - c:free() - - return r -end - -assert(23 == foobar()) - -Doubles = Class.interface { times2 = {} -> int } - -Adds = Class.interface { add = int -> int } - -struct D { - data : int -} -Class.implements(D,Doubles) -Class.implements(D,Adds) - - -terra D:times2() : int - return self.data * 2 -end - -terra D:add(a : int) : int - return self.data + a -end - - -terra aDoubles(a : &Doubles) - return a:times2() -end - -terra aAdds(a : &Adds) - return a:add(3) -end - -terra foobar2() - var a : D - a:init() - a.data = 3 - return aDoubles(&a) + aAdds(&a) -end - -assert(12 == foobar2()) - - -local IO = terralib.includec("stdio.h") -struct Animal { - data : int -} -terra Animal:speak() : {} - IO.printf("... %d\n",self.data) -end - -struct Dog { -} -Class.extends(Dog,Animal) -terra Dog:speak() : {} - IO.printf("woof! %d\n",self.data) -end - -struct Cat { -} - -Class.extends(Cat,Animal) - -terra Cat:speak() : {} - IO.printf("meow! %d\n",self.data) -end - -terra dospeak(a : &Animal) - a:speak() -end - -terra barnyard() - var c : Cat - var d : Dog - c:init() - d:init() - c.data,d.data = 0,1 - - dospeak(&c) - dospeak(&d) -end -barnyard() - - -local Add = Class.interface { add = int -> int } - -local Sub = Class.interface { sub = int -> int } - -local struct P { - data : int -} -Class.implements(P,Add) - -local struct C { - data2 : int -} -Class.extends(C,P) -Class.implements(C,Sub) - -terra P:add(b : int) : int - self.data = self.data + b - return self.data -end - -terra C:sub(b : int) : int - return self.data2 - b -end - -terra doadd(a : &Add) - return a:add(1) -end - -terra dopstuff(p : &P) - return p:add(2) + doadd(p) -end - -terra dosubstuff(s : &Sub) - return s:sub(1) -end - -terra dotests() - var p : P - p:init() - var c : C - c:init() - p.data = 1 - c.data = 1 - c.data2 = 2 - return dopstuff(&p) + dopstuff(&c) + dosubstuff(&c) -end - -assert(dotests() == 15) - -terra timeadd(a :&P, N : int) - IO.printf("%p\n",a) - for i = 0, N,10 do - a:add(1) - a:add(1) - a:add(1) - a:add(1) - a:add(1) - a:add(1) - a:add(1) - a:add(1) - a:add(1) - a:add(1) - end - return a -end - -local a = global(C) - -terra doinit() : &P - a:init() - a.data = 0 - return &a -end - -local v = doinit() -timeadd:compile() - -local b = terralib.currenttimeinseconds() ---timeadd(v,100000000) -local e = terralib.currenttimeinseconds() -print(e - b) -print(v.data) - diff --git a/samples/Terra/class2.t b/samples/Terra/class2.t deleted file mode 100644 index 1af0da25..00000000 --- a/samples/Terra/class2.t +++ /dev/null @@ -1,45 +0,0 @@ -local Interface = require("lib/golike") - -local I = Interface.create { - get = {} -> int; - set = int -> {}; -} - -struct A { - data : int -} - -terra A:get() - return self.data -end - -terra A:set(a : int) - self.data = a -end - -struct B { - data : int -} - -terra B:get() - return self.data + 1 -end - -terra B:set(a : int) - self.data = self.data + a -end - - -terra anInterface(a : I) - a:set(3) - return a:get() -end - -terra foo() - var a = A { 0 } - var b = B { 2 } - return anInterface(&a) + anInterface(&b) -end - -local test = require("test") -test.eq(foo(),9) \ No newline at end of file diff --git a/samples/Terra/class3.t b/samples/Terra/class3.t deleted file mode 100644 index 8ecc6963..00000000 --- a/samples/Terra/class3.t +++ /dev/null @@ -1,36 +0,0 @@ - -C = terralib.includec("stdio.h") - -local Class = require("lib/javalike") - - -local Prints = Class.interface { print = {} -> {} } - -struct Leaf { - data : int -} -Class.implements(Leaf,Prints) - -terra Leaf:print() : {} - C.printf("%d\n",self.data) -end - - -struct Node { - next : &Leaf -} -Class.extends(Node,Leaf) - -terra Node:print() : {} - C.printf("%d\n",self.data) - self.next:print() -end - -terra test() - var a,b = Leaf.alloc(), Node.alloc() - a.data,b.data,b.next = 1,2,a - var p : &Prints = b - p:print() -end - -test() \ No newline at end of file diff --git a/samples/Terra/class4.t b/samples/Terra/class4.t deleted file mode 100644 index f369adba..00000000 --- a/samples/Terra/class4.t +++ /dev/null @@ -1,22 +0,0 @@ -J = require("lib/javalike") - -struct Shape { - foo : int -} - -Drawable = J.interface { draw = {} -> {} } - -struct Square { - length : int -} -J.extends(Square,Shape) -J.implements(Square,Drawable) - -terra Square:draw() : {} end - -terra bar() - var a : &Square = Square.alloc() - a:draw() -end - -bar() \ No newline at end of file diff --git a/samples/Terra/class5.t b/samples/Terra/class5.t deleted file mode 100644 index ab021c59..00000000 --- a/samples/Terra/class5.t +++ /dev/null @@ -1,54 +0,0 @@ - -IO = terralib.includec("stdio.h") -local Class = require("lib/javalike") - -struct A { - a : int; - bb : &B -} and struct B { - b : int; - aa : &A -} -Class.extends(B,A) - - -terra A:times2() : int - return self.a*2 -end - -terra B:combine(a : int) : int - return self.b + self.a + a -end - - -struct C { - c : double -} -Class.extends(C,B) - -terra C:combine(a : int) : int - return self.c + self.a + self.b + a -end -terra C:times2() : double - return self.a * 4 -end - -terra doubleAnA(a : &A) - return a:times2() -end - -terra combineAB(b : &B) - return b:combine(3) -end - -terra returnA(a : A) - return a -end -terra foobar1() - var c = C.alloc() - c.a,c.b,c.c = 1,2,3.5 - return c:times2() -end - -assert(foobar1() == 4) - diff --git a/samples/Terra/class6.t b/samples/Terra/class6.t deleted file mode 100644 index 008610db..00000000 --- a/samples/Terra/class6.t +++ /dev/null @@ -1,66 +0,0 @@ - -IO = terralib.includec("stdio.h") -local Class = require("lib/javalikesimple") - -struct A { - a : int -} -terra A:times2() : int - return self.a*2 -end - -struct B { - b : int -} -Class.extends(B,A) - -terra B:combine(a : int) : int - return self.b + self.a + a -end - -struct C { - c : double -} -Class.extends(C,B) - -terra C:combine(a : int) : int - return self.c + self.a + self.b + a -end -terra C:times2() : double - return self.a * 4 -end - -terra doubleAnA(a : &A) - return a:times2() -end - -terra combineAB(b : &B) - return b:combine(3) -end - -terra foobar1() - var c : C - c:init() - c.a,c.b,c.c = 1,2,3.5 - return c:times2() -end - -assert(foobar1() == 4) - -terra foobar() - - var a : A, b : B, c : C - a:init(); b:init(); c:init() - - a.a = 1 - b.a,b.b = 1,2 - c.a,c.b,c.c = 1,2,3.5 - - var r = b:times2() + doubleAnA(&a) + doubleAnA(&b) + doubleAnA(&c) + combineAB(&b) + combineAB(&c) - - return r -end - - -assert(25 == foobar()) - diff --git a/samples/Terra/classifyfloatstructs.t b/samples/Terra/classifyfloatstructs.t deleted file mode 100644 index e9c4d66b..00000000 --- a/samples/Terra/classifyfloatstructs.t +++ /dev/null @@ -1,137 +0,0 @@ --- reading and returning by reference produces far more compact assembly --- in terra than reading and returning by value, even when a by-value function --- is embedded in a by-reference wrapper. Also, optimization behavior varies --- wildly. Here's a demonstration: - -local float4 = tuple(float,float,float,float) - --- first, comparing assembly code size of stand-alone functions which all do --- the same operation, in different styles. This is after aggressive --- optimization by the LLVM backend --------------------------------------------------------------------------------- - --- read by value, return by value --- 26 instructions, 120 bytes -local terra add4_val_val(a : float4, b : float4) : float4 - return { - a._0+b._0, - a._1+b._1, - a._2+b._2, - a._3+b._3 - } -end - --- read by value, return by reference --- 24 instructions, 103 bytes -local terra add4_val_ref(c : &float4, a : float4, b: float4) : {} - c._0 = a._0 + b._0 - c._1 = a._1 + b._1 - c._2 = a._2 + b._2 - c._3 = a._3 + b._3 -end - --- read by reference, return by value --- 14 instructions, 74 bytes -local terra add4_ref_val(a : &float4, b : &float4) : float4 - return { - a._0+b._0, - a._1+b._1, - a._2+b._2, - a._3+b._3 - } -end - --- read by reference, return by reference --- 12 instructions, 57 bytes -local terra add4_ref_ref(c : &float4, a : &float4, b: &float4) : {} - c._0 = a._0 + b._0 - c._1 = a._1 + b._1 - c._2 = a._2 + b._2 - c._3 = a._3 + b._3 -end - --- read by reference, return by reference, BUT use temporary variables --- 4 instructions, 12 bytes (!!!) --- what happens here is that the tempvars are understood and treated --- as a single SIMD register, and so only one addition is executed. --- this is already reflected in the bytecode passed to LLVM, so I suppose --- terra does this optimization. -local terra add4_ref_ref_tempvar(c : &float4, a : &float4, b: &float4) : {} - var x = a._0 + b._0 - var y = a._1 + b._1 - var z = a._2 + b._2 - var w = a._3 + b._3 - c._0 = x - c._1 = y - c._2 = z - c._3 = w -end - --- turn on always-inline for later -add4_val_val:setinlined(true) -add4_val_ref:setinlined(true) -add4_ref_val:setinlined(true) -add4_ref_ref:setinlined(true) - --- uncomment to look at individual LLVM bytecode & disassembly -add4_val_val:disas() --- add4_val_ref:disas() --- add4_ref_val:disas() --- add4_ref_ref:disas() --- add4_ref_ref_tempvar:disas() - - -if terralib.lookupsymbol and require("ffi").os ~= "Windows" then - terra sizecheck() - var si : terralib.SymbolInfo - terralib.lookupsymbol(add4_val_val,&si) - return si.size - end - assert(sizecheck() < 16) -end --------------------------------------------------------------------------------- - --- up to this point, one could argue that functions are always inlined into --- other functions, and that the instructions dissolve in the greater scheme --- of things. - --- if that is true, let's attempt to convert one style into another and see --- if the optimizations catch up. - --- read by value, return by value -> read by reference, return by reference --- the clunky solution to the slim interface --- 38 instructions (!), 193 bytes (!!), so it gets *worse* -local terra add4_val_val_to_ref_ref(c : &float4, a : &float4, b: &float4) : {} - @c = add4_val_val(@a, @b) -end - --- read by reference, return by reference -> read by value, return by value --- the slim solution to the clunky interface --- 13 instructions, 61 bytes with tempvar -- wow, that's better than --- the original function with the actual code in it! -local terra add4_ref_ref_to_val_val(a : float4, b : float4) : float4 - var c : float4 - add4_ref_ref_tempvar(&c, &a, &b) - return c -end - --- so what happens if we do a conversion back to the by-reference interface? --- 41 instructions, 194 bytes -local terra add4_ref_ref_to_val_val_to_ref_ref(c : &float4, a : &float4, b: &float4) : {} - @c = add4_ref_ref_to_val_val(@a, @b) -end - --- and nest it once more, back to the by-value interface --- 47 instructions, 208 bytes --- so once we pass structs by-value, we'll never recover. -local terra add4_ref_ref_to_val_val_to_ref_ref_to_val_val(a : float4, b : float4) : float4 - var c : float4 - add4_ref_ref_to_val_val_to_ref_ref(&c, &a, &b) - return c -end - --- uncomment to look at individual disassembly --- add4_val_val_to_ref_ref:disas() --- add4_ref_ref_to_val_val:disas() --- add4_ref_ref_to_val_val_to_ref_ref:disas() --- add4_ref_ref_to_val_val_to_ref_ref_to_val_val:disas() \ No newline at end of file diff --git a/samples/Terra/clean.t b/samples/Terra/clean.t deleted file mode 100644 index 078a3963..00000000 --- a/samples/Terra/clean.t +++ /dev/null @@ -1,17 +0,0 @@ -local c = terralib.includec("stdio.h") - -iamclean = macro(function(arg) - return quote - var a = 3 - return a,arg - end -end) - -terra doit() - var a = 4 - iamclean(a) -end - -local a = doit() -local test = require("test") -test.meq({3,4}, a) \ No newline at end of file diff --git a/samples/Terra/cnames.t b/samples/Terra/cnames.t deleted file mode 100644 index 5a487ce2..00000000 --- a/samples/Terra/cnames.t +++ /dev/null @@ -1,25 +0,0 @@ -struct Foo { - c : float; -} -Foo.displayname = "struct.Foo" -terra useFoo() - var a : Foo - a.c = 4.5 - return a.c -end -assert(4.5 == useFoo()) - -C = terralib.includecstring [[ -typedef struct { int a; int b; } Foo; -]] - -terra stuff() - var a : Foo - var b : C.Foo - b.a = 1 - b.b = 2 - a.c = 4.5 - return b.a + b.b + a.c -end - -assert(7.5 == stuff()) diff --git a/samples/Terra/cnamespace.t b/samples/Terra/cnamespace.t deleted file mode 100644 index dc3c6cc2..00000000 --- a/samples/Terra/cnamespace.t +++ /dev/null @@ -1,24 +0,0 @@ -G,T = terralib.includecstring [[ - typedef struct { - double c; - } A; - struct A { - int b; - }; -]] - -G2,T2 = terralib.includecstring [[ - struct A; - typedef struct C A; -]] - -assert(T2.A == T.A) -assert(G2.A ~= T2.A and G2.A ~= G.A) -terra foo() - var a : G.A - var b : T.A - a.c = 4.5 - b.b = 4.5 - return a.c + b.b -end -assert(8.5 == foo()) \ No newline at end of file diff --git a/samples/Terra/cnamespaces.t b/samples/Terra/cnamespaces.t deleted file mode 100644 index 54ad3cd0..00000000 --- a/samples/Terra/cnamespaces.t +++ /dev/null @@ -1,32 +0,0 @@ -C,T = terralib.includecstring [[ - - struct Foo { - int a; - }; - typedef int Foo; - typedef struct Foo * Bar; - typedef Foo * Bar2; - Bar bar(struct Foo * a, Bar2 b) { return (Bar)0; } -]] - -terra what() - var f = T.Foo { 3 } - var a : C.Bar = &f - return a.a -end - -assert(3 == what()) - -C,T = terralib.includecstring [[ - typedef struct { int a; } Foo; - typedef Foo * FooPtr; - int returna(FooPtr a) { return a->a; } -]] - -terra what2() - var a : C.Foo = C.Foo { 3 } - var ap : C.FooPtr = &a - return C.returna(ap) -end - -assert(3 == what2()) diff --git a/samples/Terra/compilecallback.t b/samples/Terra/compilecallback.t deleted file mode 100644 index 147fdb0e..00000000 --- a/samples/Terra/compilecallback.t +++ /dev/null @@ -1,16 +0,0 @@ - -local a = 0 -local foo = macro(function(arg) - bar:gettype(function() - a = bar() - end) - a = 1 - return 3 -end) - -terra bar() - return foo() -end - -assert(bar() == 3) -assert(a == 3) \ No newline at end of file diff --git a/samples/Terra/completec.t b/samples/Terra/completec.t deleted file mode 100644 index 0b16091e..00000000 --- a/samples/Terra/completec.t +++ /dev/null @@ -1,13 +0,0 @@ -C = terralib.includecstring [[ - struct A { - int a; - }; - static struct A foo; - struct A * getfoo() { - foo.a = 4; - return &foo; - } -]] - -assert(C.getfoo().a == 4) - diff --git a/samples/Terra/conflict.t b/samples/Terra/conflict.t deleted file mode 100644 index ac871735..00000000 --- a/samples/Terra/conflict.t +++ /dev/null @@ -1,12 +0,0 @@ - -terra foo() -end - -foo:compile() -terralib.dumpmodule() - -terralib.includecstring [[ - int foo() { - return 4; - } -]] \ No newline at end of file diff --git a/samples/Terra/constant.t b/samples/Terra/constant.t deleted file mode 100644 index 6f44ee87..00000000 --- a/samples/Terra/constant.t +++ /dev/null @@ -1,35 +0,0 @@ - - -local foo = terralib.constant(terralib.new(int[4],{1,2,3,4})) - -struct A { - a : int; - b : float -} - -local mystr = terralib.new(A,{3,4.5}) -local const = constant(mystr) - - -terra bar() - return foo[3] + mystr.a -end - -terra bar2() - return foo[1] + mystr.b -end - -function wrapper(a) - return a + 1 -end - -local p1 = terralib.constant(int -> int, wrapper) - -terra doit() - return p1(3) -end - -local test = require("test") -test.eq(bar(),7) -test.eq(bar2(),6.5) -test.eq(doit(),4) diff --git a/samples/Terra/constant2.t b/samples/Terra/constant2.t deleted file mode 100644 index bc18b2ca..00000000 --- a/samples/Terra/constant2.t +++ /dev/null @@ -1,21 +0,0 @@ - - -local a = terralib.new(int,3) -local b = terralib.new(int8,4) -local c = terralib.new(int64,5) -local d = terralib.new(float,3.25) -local e = terralib.new(double,4.25) - -f = global(4) -terra foo() - return &f -end - -local pf = foo() - -terra bar() - return a + b + c + d + e + @pf -end - -local test = require("test") -test.eq(bar(),23.5) \ No newline at end of file diff --git a/samples/Terra/constructor.t b/samples/Terra/constructor.t deleted file mode 100644 index 87161fe9..00000000 --- a/samples/Terra/constructor.t +++ /dev/null @@ -1,12 +0,0 @@ - -local b = 1 -local dd = "d" -local c = symbol() - -terra foo() - var a = { _0 = [b], [c] = 2, [dd] = 3, r = 4} - return a._0 + a.[c] + a.d + a.r -end - -local test = require("test") -test.eq(foo(),10) \ No newline at end of file diff --git a/samples/Terra/coverage.t b/samples/Terra/coverage.t deleted file mode 100644 index e865d664..00000000 --- a/samples/Terra/coverage.t +++ /dev/null @@ -1,47 +0,0 @@ -function failit(match,fn) - local success,msg = pcall(fn) - if success then - error("failed to fail.",2) - elseif not string.match(msg,match) then - error("failed wrong: "..msg,2) - end -end -local test = require("test") -local erd = "Errors reported during" - -local terra f1() - return test -end - -failit(erd,function() -f1:compile() -end) -failit("referencing a function which failed to compile",function() -f1:compile() -end) -failit(erd,function() - local terra foo() - f1() - end - foo() -end) - - -local struct A { - a : int -} - -A.metamethods.__getentries = function(self) - error("I AM BAD") -end - -failit(erd,function() - A:complete() -end) - -failit(erd,function() - local terra foo() - var a : A - end - foo() -end) diff --git a/samples/Terra/coverage2.t b/samples/Terra/coverage2.t deleted file mode 100644 index b74377f7..00000000 --- a/samples/Terra/coverage2.t +++ /dev/null @@ -1,209 +0,0 @@ -function failit(match,fn) - local success,msg = pcall(fn) - if success then - error("failed to fail.",2) - elseif not string.match(msg,match) then - error("failed wrong: "..msg,2) - end -end -local test = require("test") -local erd = "Errors reported during" - -failit(erd,function() -local aglobal = 5 -local terra foo() - return [ (function() aglobal = 4; return 3 end)() ] -end -foo() -end) - -A = terralib.types.newstruct() -A.entries:insert{ field = "a", type = int[2] } - -A.metamethods.__getentries = function() error("NOPE") end - -failit(erd,function() - A:complete() -end) -local terra foo() - var a : int[2] - return 3 -end -foo:compile() -local a = 0 -foo:gettype(function() - a = a + 1 -end) -assert(a == 1) - -local terra errored -failit(erd,function() - terra errored() - return A - end - errored:compile() -end) -failit("referencing a function which failed to compile",function() - errored() -end) - -local terra ol(a : int) return a end -terra ol(a : int, b : int) return a + b end - -assert(ol(3) == 3) -assert(ol(3,4) == 7) - -failit("bad argument #1",function() - ol("a") -end) - -ol:printstats() -NSE = terralib.types.newstruct() - -failit(erd,function() - NSE.entries:insert { field = "a", type = "b" } - NSE:complete() -end) - -SICS = terralib.types.newstruct() -SICS.entries:insert { field = symbol(), type = int } -a = 1 -SICS.metamethods.__staticinitialize = function() a = a + 1 end -print(terralib.new(SICS,{3})) - -NSF = terralib.types.newstruct() -NSF.entries:insert { type = int , field = 3 } - -failit(erd,function() - NSF:complete() -end) -SICS:complete() -assert(a == 2) -struct SF { - a : SF2 -} and struct SF2 { - a : int -} -SF2.metamethods.__getentries = function(self) SF:complete() end -failit(erd,function() -SF:complete() -end) -failit("Attempting to get a property of a type that previously resulted in an error.",function() -SF:complete() -end) - -failit(erd,function() - struct SF { b : int } -end) - - -struct C { - a : int -} - -C.metamethods.__cast = function() return error("CAST ERROR") end - -local terra casttest() - return int(C { 3 }) -end -failit(erd,function() -casttest() -end) - -local terra shiftcheck() - var r = 1 << vector(1,2,3,4) - var r2 = vector(1,2,3,4) << 1 - return r[0],r[1],r[2],r[3],r2[0],r2[1],r2[2],r2[3] -end - -test.meq({2,4,8,16,2,4,6,8},shiftcheck()) - -failit(erd,function() - local terra foo() - return terralib.select(3,4,5) - end - foo() -end) -failit(erd,function() - local terra foo() - return (4):foo() - end - foo() -end) -failit(erd,function() - local terra foo() - return (C {3}):foo() - end - foo() -end) -failit(erd,function() - local a = { a = 4} - local terra foo() - return a() - end - foo() -end) -local saveit -local foom = macro(function(arg) saveit = arg; arg:astype(); end) -failit(erd,function() - local terra foo() - return foom(4) - end - foo() -end) - -failit(erd,function() - local terra foo() - return saveit - end - foo() -end) -failit(erd,function() - local struct A { - a : 3 - } -end) - -failit(erd,function() - local terra foo - local bar = macro(function() foo:compile() end) - terra foo() - return bar() - end - foo() -end) - -struct ATF { - a : int -} - -ATF.metamethods.__getentries = function(self) - local terra foo() - var a : ATF - return a.a - end - foo:compile() -end - -failit(erd,function() - ATF:complete() -end) - -struct FA { - a : &FA2 -} and struct FA2 { - a : int -} - -FA.metamethods.__staticinitialize = function() a = a + 1 end - -FA2.metamethods.__staticinitialize = function(self) - FA:complete() -end - -FA:complete() - -assert(a == 3) ---[[ -freezing asynchronus needs to be called -]] \ No newline at end of file diff --git a/samples/Terra/coverage3.t b/samples/Terra/coverage3.t deleted file mode 100644 index 495d6251..00000000 --- a/samples/Terra/coverage3.t +++ /dev/null @@ -1,107 +0,0 @@ -function failit(match,fn) - local success,msg = pcall(fn) - if success then - error("failed to fail.",2) - elseif not string.match(msg,match) then - error("failed wrong: "..msg,2) - end -end -local test = require("test") -local erd = "Errors reported during" - -terra foo() -end -foo:compile() -failit("inlining",function() foo:setinlined(false) end) - -terra bar -failit("attempting to call",function() -bar:compile() end) - -failit("expected a name",function() - terralib.intrinsic("far","far") -end) - -print((&int)[4]) - -struct A { - a : int[4]; - b : ∫ - union { c : int; d : int}; - e : int -> int; -} -A:printpretty() - -terra rv() return vector(1,2,3) end - -terra varg(a : vector(int,3)) - - return a[0] + a[1] + a[2] -end - -assert (6 == varg(rv())) - -local something = nil -failit(erd,function() -local terra a([something]) -end -end) - -failit(erd,function() -local terra what() - var a = A { ee = 4 } -end -what:compile() -end) - -A.metamethods.__getmethod = function(self,methodname) - return 1 -end - -failit(erd,function() -local terra what() - var a : A - A.something() -end -what:compile() -end) - -C = terralib.includec("stdio.h") - ---TODO: __sputc isn't consistent across architectures, so this is a bad test ---failit("cannot import",function() ---local a = C.__sputc ---end) - -failit("not found",function() -local a = C.nothing -end) - -terra up() return unpackstruct(3) end -assert(3 == up()) - -failit(erd,function() -local terra aloads(a : &int) - return terralib.attrload(a),terralib.attrload(nil,{3}),terralib.attrstore(a,nil) -end -aloads:compile() -end) - -terra f() end -terra f(a:int) end -failit("overloaded", function() -terralib.saveobj("err.o", { f = f}) -end) - -terra nop() end -terra nilcall(a : tuple(), b : int) - return b,a -end -terra nilstuff() - var a = nop() - var c,b = nilcall(a,4) - return c -end -assert(4 == nilstuff()) - -nilcall:disas() \ No newline at end of file diff --git a/samples/Terra/crash1.t b/samples/Terra/crash1.t deleted file mode 100644 index 91732c22..00000000 --- a/samples/Terra/crash1.t +++ /dev/null @@ -1 +0,0 @@ -a = &int \ No newline at end of file diff --git a/samples/Terra/crash2.t b/samples/Terra/crash2.t deleted file mode 100644 index 789ad7ac..00000000 --- a/samples/Terra/crash2.t +++ /dev/null @@ -1 +0,0 @@ -a = global( struct { a : int } ) \ No newline at end of file diff --git a/samples/Terra/cstruct.t b/samples/Terra/cstruct.t deleted file mode 100644 index 6f4f0d9d..00000000 --- a/samples/Terra/cstruct.t +++ /dev/null @@ -1,20 +0,0 @@ -local C = terralib.includecstring [[ - -struct teststruct { - int idata; - float fdata; -}; - -void makeitlive(struct teststruct * s) {} - -]] - - -terra foo() - var a : C.teststruct - a.idata = 3 - a.fdata = 3.5 - return a.idata + a.fdata -end - -assert(foo() == 6.5) \ No newline at end of file diff --git a/samples/Terra/cstruct2.t b/samples/Terra/cstruct2.t deleted file mode 100644 index 8b557c8a..00000000 --- a/samples/Terra/cstruct2.t +++ /dev/null @@ -1,8 +0,0 @@ - - -C = terralib.includecstring [[ - typedef struct { int x; int y; } Point; - Point mkpoint() { Point p; p.x = p.y = 3; return p; } -]] - -assert(C.mkpoint().x == 3) \ No newline at end of file diff --git a/samples/Terra/cudaagg.t b/samples/Terra/cudaagg.t deleted file mode 100644 index 12fcf4ed..00000000 --- a/samples/Terra/cudaagg.t +++ /dev/null @@ -1,56 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end - -local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) -local ntid = cudalib.nvvm_read_ptx_sreg_ntid_x -- terralib.intrinsic("llvm.nvvm.read.ptx.sreg.ntid.x",{} -> int) - - -struct OneFloat { - a : int; -} - -fn = terra(result : &float, bar : int[5]) - result[tid()] = bar[0] + bar[1] + bar[2] + bar[3] + bar[4] -end -fn:setinlined(false) - ---our very simple cuda kernel ---more work needs to be done to expose the right CUDA intrinsics ---to do more complicated things -foo = terra(result : &float) - fn(result, array(tid(),tid()+1,tid()+2,tid()+3,tid()+4) ) -end - -terralib.includepath = terralib.includepath..";/usr/local/cuda/include" - -local C = terralib.includecstring [[ -#include "cuda_runtime.h" -#include -#include -]] -local R = terralib.cudacompile({ bar = foo }) - -terra doit(N : int) - var data : &float - C.cudaMalloc([&&opaque](&data),sizeof(float)*N) - var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } - R.bar(&launch,data) - var results : &float = [&float](C.malloc(sizeof(float)*N)) - C.cudaMemcpy(results,data,sizeof(float)*N,2) - var result = 0.f - for i = 0,N do - result = result + results[i] - end - return result -end - -local test = require("test") -local N = 16 - -function s(n) return (n - 1) * n / 2 end -function ex(i) return s(N+i) - s(i) end -local expected = ex(0) + ex(1) + ex(2) + ex(3) + ex(4) -test.eq(doit(N),expected) - diff --git a/samples/Terra/cudaaggregate.t b/samples/Terra/cudaaggregate.t deleted file mode 100644 index 9d6070d7..00000000 --- a/samples/Terra/cudaaggregate.t +++ /dev/null @@ -1,45 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end - -local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) -local ntid = cudalib.nvvm_read_ptx_sreg_ntid_x -- terralib.intrinsic("llvm.nvvm.read.ptx.sreg.ntid.x",{} -> int) - -struct A { - a : int - b : int - c : int[2] -} -terra foo(result : &float,a : A, c : int, d : int[2]) - var t = tid() - result[t] = t + a.a + a.b + c + a.c[0] + a.c[1] + d[0] + d[1] -end - -terralib.includepath = terralib.includepath..";/usr/local/cuda/include" - -local C = terralib.includecstring [[ -#include "cuda_runtime.h" -#include -#include -]] -local R = terralib.cudacompile({ bar = foo }) - -terra doit(N : int) - var data : &float - C.cudaMalloc([&&opaque](&data),sizeof(float)*N) - var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } - R.bar(&launch,data, A { 1,2, array(3,4) },5,array(6,7)) - var results : &float = [&float](C.malloc(sizeof(float)*N)) - C.cudaMemcpy(results,data,sizeof(float)*N,2) - var result = 0.f - for i = 0,N do - result = result + results[i] - end - return result -end - -local test = require("test") -local N = 16 -local expected = (N - 1)*N/2 + N*(1 + 2 + 3 + 4 + 5 + 6 + 7) -test.eq(doit(N),expected) diff --git a/samples/Terra/cudaatomic.t b/samples/Terra/cudaatomic.t deleted file mode 100644 index ebe3425d..00000000 --- a/samples/Terra/cudaatomic.t +++ /dev/null @@ -1,39 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end - -local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) - -foo = terra(result : &int) - var t = tid() - terralib.asm(terralib.types.unit,"red.global.max.u32 [$0], $1;","l,r",true,result,t) -end - -terralib.includepath = terralib.includepath..";/usr/local/cuda/include" - - -local C = terralib.includecstring [[ -#include "cuda_runtime.h" -#include -#include -]] - -sync = terralib.externfunction("cudaThreadSynchronize", {} -> int) - -local R = terralib.cudacompile({ bar = foo },true) - -terra doit(N : int) - var data = 0 - var location : &int - C.cudaMalloc([&&opaque](&location),sizeof(int)) - C.cudaMemcpy(location,&data,sizeof(int),1) - - var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } - R.bar(&launch,location) - var data2 = -1 - C.cudaMemcpy(&data2,location,sizeof(int),2) - return data2 -end - -assert(doit(32) == 31) diff --git a/samples/Terra/cudaconst2.t b/samples/Terra/cudaconst2.t deleted file mode 100644 index 6ca8eead..00000000 --- a/samples/Terra/cudaconst2.t +++ /dev/null @@ -1,14 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end - -local const = cudalib.constantmemory(float, 1) - -local terra kernel(data: &float) -end - -local M = terralib.cudacompile({ - kernel = kernel, - const = const -}) diff --git a/samples/Terra/cudaglobal.t b/samples/Terra/cudaglobal.t deleted file mode 100644 index 53564f4f..00000000 --- a/samples/Terra/cudaglobal.t +++ /dev/null @@ -1,48 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end - -local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) -local ntid = cudalib.nvvm_read_ptx_sreg_ntid_x -- terralib.intrinsic("llvm.nvvm.read.ptx.sreg.ntid.x",{} -> int) - - -theone = global(0) - -theconst = cudalib.constantmemory(int,1) - -terra foo(result : &float) - result[tid()] = tid() + theone + theconst[0] -end - -terralib.includepath = terralib.includepath..";/usr/local/cuda/include" - -local C = terralib.includecstring [[ -#include "cuda_runtime.h" -#include -#include -]] -local R = terralib.cudacompile({ foo = foo, aone = theone, theconst = theconst }) - -terra doit(N : int) - var data : &float - C.cudaMalloc([&&opaque](&data),sizeof(float)*N) - var one = 1 - var two = 2 - C.cudaMemcpy(R.aone,&one,sizeof(int),1) - C.cudaMemcpy(R.theconst,&two,sizeof(int),1) - var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } - R.foo(&launch,data) - var results : &float = [&float](C.malloc(sizeof(float)*N)) - C.cudaMemcpy(results,data,sizeof(float)*N,2) - var result = 0.f - for i = 0,N do - result = result + results[i] - end - return result -end - -local test = require("test") -local N = 16 -local expected = (N - 1)*N/2 + 3*N -test.eq(doit(N),expected) diff --git a/samples/Terra/cudahello.t b/samples/Terra/cudahello.t deleted file mode 100644 index 96b68462..00000000 --- a/samples/Terra/cudahello.t +++ /dev/null @@ -1,30 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end - -local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) - -C = terralib.includec("stdio.h") -vprintf = terralib.externfunction("cudart:vprintf", {&int8,&int8} -> int) - -foo = terra(result : &float) - var t = tid() - vprintf("%d\n",[&int8](&t)) -end - -terralib.includepath = terralib.includepath..";/usr/local/cuda/include" - - -sync = terralib.externfunction("cudaThreadSynchronize", {} -> int) - -local R = terralib.cudacompile({ bar = foo }) - -terra doit(N : int) - var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } - R.bar(&launch,nil) - sync() - C.printf("and were done\n") -end - -doit(3) diff --git a/samples/Terra/cudaoffline.t b/samples/Terra/cudaoffline.t deleted file mode 100644 index f750027b..00000000 --- a/samples/Terra/cudaoffline.t +++ /dev/null @@ -1,65 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end - -local tid = cudalib.nvvm_read_ptx_sreg_tid_x -local ntid = cudalib.nvvm_read_ptx_sreg_ntid_x - -theone = global(0) - -theconst = cudalib.constantmemory(int,1) - -terra foo(result : &float) - result[tid()] = tid() + theone + theconst[0] -end - -local C = terralib.includecstring [[ -#include "cuda_runtime.h" -#include -#include -]] - -local R,L = terralib.cudacompile({ foo = foo, aone = theone, theconst = theconst },nil,nil,false) - -terra doit(N : int) - var data : &float - C.cudaMalloc([&&opaque](&data),sizeof(float)*N) - var one = 1 - var two = 2 - C.cudaMemcpy(R.aone,&one,sizeof(int),1) - C.cudaMemcpy(R.theconst,&two,sizeof(int),1) - var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } - R.foo(&launch,data) - var results : &float = [&float](C.malloc(sizeof(float)*N)) - C.cudaMemcpy(results,data,sizeof(float)*N,2) - var result = 0.f - for i = 0,N do - result = result + results[i] - end - return result -end - - -terra main() : int - if L(nil,nil,nil,0) ~= 0 then - C.printf("WHAT\n") - end - var N = 16 - var expected = (N - 1)*N/2 + 3*N - return terralib.select(doit(N) == expected,0,1) -end - - -local ffi = require 'ffi' -local path = ({ OSX = "/lib", Linux = "/lib64", Windows = "\\lib\\x64" })[ffi.os] -path = terralib.cudahome..path - - -local args = ffi.os == "Windows" and {path.."\\cuda.lib", path.."\\cudart.lib"} - or {"-L"..path, "-Wl,-rpath,"..path, "-lcuda", "-lcudart"} - -local name = ffi.os == "Windows" and ".\\cudaoffline.exe" or "./cudaoffline" -terralib.saveobj(name,{ main = main },args) -assert(os.execute(name) == 0) - diff --git a/samples/Terra/cudaoo.t b/samples/Terra/cudaoo.t deleted file mode 100644 index 65b16688..00000000 --- a/samples/Terra/cudaoo.t +++ /dev/null @@ -1,20 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end -C = terralib.includec("cuda_runtime.h") - -cudalib.linkruntime() - -terra foo() - var stuff : &opaque - C.cudaMalloc(&stuff,sizeof(int)) - return stuff -end - -local a = foo() - -terra blank() end -terralib.cudacompile { blank = blank } - -assert(0 == C.cudaMemset(a,0,4)) diff --git a/samples/Terra/cudaprintf.t b/samples/Terra/cudaprintf.t deleted file mode 100644 index b9ef9b73..00000000 --- a/samples/Terra/cudaprintf.t +++ /dev/null @@ -1,50 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end - -local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) - -vprintf = terralib.externfunction("cudart:vprintf", {&int8,&int8} -> int) -local function createbuffer(args) - local Buf = terralib.types.newstruct() - return quote - var buf : Buf - escape - for i,e in ipairs(args) do - local typ = e:gettype() - local field = "_"..tonumber(i) - typ = typ == float and double or typ - table.insert(Buf.entries,{field,typ}) - emit quote - buf.[field] = e - end - end - end - in - [&int8](&buf) - end -end -printf = macro(function(fmt,...) - local buf = createbuffer({...}) - return `vprintf(fmt,buf) -end) - -foo = terra(result : &float) - var t = tid() - printf("a = %d, b = %f, c = %d\n",t,1.0 + t,t + 2) -end - -sync = terralib.externfunction("cuStreamSynchronize", {&opaque} -> int) - -annotations = { {"maxntidx",43}, {"minctasm",8}} -- example of annotating cuda kernel with launch bounds -local R = terralib.cudacompile({ bar = { kernel = foo, annotations = annotations }}) - -terra doit(N : int) - var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } - R.bar(&launch,nil) - sync(nil) -end - -doit(3) - diff --git a/samples/Terra/cudashared.t b/samples/Terra/cudashared.t deleted file mode 100644 index cde12737..00000000 --- a/samples/Terra/cudashared.t +++ /dev/null @@ -1,47 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end - -local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) - -N = 1024 - -somedata = cudalib.sharedmemory(int,N) - -terra bar(result : &int) - var t = tid() - somedata[t] = t - cudalib.nvvm_barrier0() - result[t] = somedata[N - 1 - t] -end - -terralib.includepath = terralib.includepath..";/usr/local/cuda/include" - -local C = terralib.includecstring [[ -#include "cuda_runtime.h" -#include -#include -]] - -local R = terralib.cudacompile({ bar = bar },true) - - -terra doit(N : int) - var data : &int - C.cudaMalloc([&&opaque](&data),sizeof(int)*N) - var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } - R.bar(&launch,data) - var results : &int = [&int](C.malloc(sizeof(int)*N)) - C.cudaMemcpy(results,data,sizeof(int)*N,2) - var result = 0 - for i = 0,N do - --C.printf("result = %d\n",results[i]) - result = result + results[i] - end - return result -end - -local test = require("test") -local expected = (N - 1)*N/2 -test.eq(doit(N),expected) diff --git a/samples/Terra/cudatest.t b/samples/Terra/cudatest.t deleted file mode 100644 index a15d54fc..00000000 --- a/samples/Terra/cudatest.t +++ /dev/null @@ -1,47 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end - -local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) -local ntid = cudalib.nvvm_read_ptx_sreg_ntid_x -- terralib.intrinsic("llvm.nvvm.read.ptx.sreg.ntid.x",{} -> int) - -fn = terra(result : &float) - var t = tid() - result[t] = t -end -fn:setinlined(false) ---our very simple cuda kernel ---more work needs to be done to expose the right CUDA intrinsics ---to do more compilicated things -foo = terra(result : &float) - fn(result) -end - -terralib.includepath = terralib.includepath..";/usr/local/cuda/include" - -local C = terralib.includecstring [[ -#include "cuda_runtime.h" -#include -#include -]] -local R = terralib.cudacompile({ bar = foo }) - -terra doit(N : int) - var data : &float - C.cudaMalloc([&&opaque](&data),sizeof(float)*N) - var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } - R.bar(&launch,data) - var results : &float = [&float](C.malloc(sizeof(float)*N)) - C.cudaMemcpy(results,data,sizeof(float)*N,2) - var result = 0.f - for i = 0,N do - result = result + results[i] - end - return result -end - -local test = require("test") -local N = 16 -local expected = (N - 1)*N/2 -test.eq(doit(N),expected) diff --git a/samples/Terra/cudatex.t b/samples/Terra/cudatex.t deleted file mode 100644 index cebb6079..00000000 --- a/samples/Terra/cudatex.t +++ /dev/null @@ -1,59 +0,0 @@ -if not terralib.cudacompile then - print("CUDA not enabled, not performing test...") - return -end - -local tid = cudalib.nvvm_read_ptx_sreg_tid_x--terralib.intrinsic("llvm.nvvm.read.ptx.sreg.tid.x",{} -> int) - -C = terralib.includecstring [[ -#include -#include -#include -#include -]] - -vprintf = terralib.externfunction("cudart:vprintf", {&int8,&int8} -> int) - -foo = terra(result : C.cudaTextureObject_t) - var t = tid() - var r = terralib.asm([tuple(float,float,float,float)], - "tex.1d.v4.f32.s32 {$0,$1,$2,$3}, [$4, {$5}];", - "=f,=f,=f,=f,l,r",false,result,t) - var rr : double = r._0 - vprintf("%f\n",[&int8](&rr)) -end - -terralib.includepath = terralib.includepath..";/usr/local/cuda/include" - -sync = terralib.externfunction("cudaThreadSynchronize", {} -> int) - -local R = terralib.cudacompile({ foo = foo }) - -terra doit(N : int) - var d_buffer : &double - C.cudaMalloc([&&opaque](&d_buffer),N*sizeof(float)) - - var h_buffer = arrayof(float,0,1,2,3,4,5,6,7,8,9,10) - C.cudaMemcpy(d_buffer,&h_buffer[0],sizeof(float)*N, C.cudaMemcpyHostToDevice) - - var resDesc : C.cudaResourceDesc - C.memset(&resDesc,0,sizeof(C.cudaResourceDesc)) - resDesc.resType = C.cudaResourceTypeLinear; - resDesc.res.linear.devPtr = d_buffer; - resDesc.res.linear.desc.f = C.cudaChannelFormatKindFloat; - resDesc.res.linear.desc.x = 32; -- bits per channel - resDesc.res.linear.sizeInBytes = N*sizeof(float); - var texDesc : C.cudaTextureDesc - C.memset(&texDesc, 0, sizeof(C.cudaTextureDesc)); - texDesc.readMode = C.cudaReadModeElementType; - - var tex : C.cudaTextureObject_t - C.cudaCreateTextureObject(&tex, &resDesc, &texDesc, nil); - - var launch = terralib.CUDAParams { 1,1,1, N,1,1, 0, nil } - R.foo(&launch,tex) - sync() - C.printf("and were done\n") -end - -doit(10) diff --git a/samples/Terra/cunion.t b/samples/Terra/cunion.t deleted file mode 100644 index 7077d4d0..00000000 --- a/samples/Terra/cunion.t +++ /dev/null @@ -1,34 +0,0 @@ -local C = terralib.includecstring [[ - -union testunion { - int idata; - float fdata; -}; - -typedef - union { - int a; - float b; - } S; - -void setUnion(union testunion * u, S * s){ - u->idata = 3; -} -int getUnionInt(union testunion * u){ - return u->idata; -} - -]] - -terra foo() : int - var u : C.testunion - C.setUnion(&u,nil) - var s : C.S - return C.getUnionInt(&u) -end - - -terralib.tree.printraw(C.S) - -local test = require("test") -test.eq(foo(),3) \ No newline at end of file diff --git a/samples/Terra/cunion2.t b/samples/Terra/cunion2.t deleted file mode 100644 index 08a4e3e5..00000000 --- a/samples/Terra/cunion2.t +++ /dev/null @@ -1,35 +0,0 @@ -local C = terralib.includecstring [[ - -union testunion { - int idata; - float fdata; -}; - -void setUnionI(union testunion * u){ - u->idata = 3; -} -void setUnionF(union testunion * u){ - u->fdata = 4.f; -} - -]] - -terra foo() : int - var u : C.testunion - C.setUnionI(&u) - var f = u.idata - C.setUnionF(&u) - var f2 = u.fdata - return f + f2 -end - -terra foo2() - var a : C.testunion - a.fdata = -3.0 - a.idata = a.idata and not (1 << 31) - return a.fdata -end - -local test = require("test") -test.eq(foo(),7) -test.eq(foo2(),3) \ No newline at end of file diff --git a/samples/Terra/customline.t b/samples/Terra/customline.t deleted file mode 100644 index c70ecff6..00000000 --- a/samples/Terra/customline.t +++ /dev/null @@ -1,10 +0,0 @@ -terra foo(c : int, b : int) - terralib.debuginfo("../src/terralib.lua",300) - var a = b + c - terralib.debuginfo("../src/terralib.lua",301) - return a + a -end - -foo(3,4) - ---terralib.dumpmodule() \ No newline at end of file diff --git a/samples/Terra/customtable.t b/samples/Terra/customtable.t deleted file mode 100644 index 18649347..00000000 --- a/samples/Terra/customtable.t +++ /dev/null @@ -1,10 +0,0 @@ - - -struct A { -} - -A.metamethods.__luametatable = { __index = function(self,idx) return 4 end } -A.methods.foo = function() return 5 end -a = terralib.new(A) - -assert(a.foo == 4) \ No newline at end of file diff --git a/samples/Terra/cvar.t b/samples/Terra/cvar.t deleted file mode 100644 index aaa3398f..00000000 --- a/samples/Terra/cvar.t +++ /dev/null @@ -1,9 +0,0 @@ -C = terralib.includecstring [[ - int foo = 4; - const int foo2 = 5; -]] -terra t() - C.foo = C.foo + 1; - return C.foo + C.foo2 -end -assert(t() == 10) \ No newline at end of file diff --git a/samples/Terra/debugcallback.t b/samples/Terra/debugcallback.t deleted file mode 100644 index 2e236650..00000000 --- a/samples/Terra/debugcallback.t +++ /dev/null @@ -1,23 +0,0 @@ - -terralib.settypeerrordebugcallback(function(o) - o:printpretty() -end) - - -local function dosomecomplicatedstuff(a) - return `@a -end - -local s,e = pcall(function() - - local terra what(a : &opaque) - var b = [dosomecomplicatedstuff(a)] - return b - end - what:compile() - -end) - -assert(not s) -print(e) -assert(e:match("Errors reported during")) \ No newline at end of file diff --git a/samples/Terra/declerrors.t b/samples/Terra/declerrors.t deleted file mode 100644 index 58d24477..00000000 --- a/samples/Terra/declerrors.t +++ /dev/null @@ -1,29 +0,0 @@ -function failit(fn,err) - local success,msg = pcall(fn) - if success then - error("failed to fail.",2) - elseif not string.match(msg,err or "Errors reported during") then - error("failed wrong: "..msg,2) - end -end - - -failit(function() -local A = {} -terra A:foo() end -end,"expected a struct") - - -failit(function() -terra A.b() end -end,"failed attempting to index field") - -failit(function() -terra A.b.c() end -end,"failed attempting to index field") - - -failit(function() -local A = 4 -struct A.b {} -end,"failed attempting to index field") \ No newline at end of file diff --git a/samples/Terra/decltwice.t b/samples/Terra/decltwice.t deleted file mode 100644 index b56eab60..00000000 --- a/samples/Terra/decltwice.t +++ /dev/null @@ -1,18 +0,0 @@ - -terra mything - -terra mybar() - return mything(4) -end - -terra mything(a : int) - return a -end - -terra mything - -terra mybar2() - return mything(4) -end - -assert(mybar() == mybar2()) \ No newline at end of file diff --git a/samples/Terra/def1.t b/samples/Terra/def1.t deleted file mode 100755 index 2ce3ba06..00000000 --- a/samples/Terra/def1.t +++ /dev/null @@ -1,16 +0,0 @@ -import "lib/def" - -local c = 3 -local a = 4 -local b = def(a) a + c -local d = b(10) - -def e(a) a + c -local def f(a) a + c - -print(d, e(10), f(10)) - -local test = require("test") -test.eq(d,13) -test.eq(e(10),13) -test.eq(f(10),13) diff --git a/samples/Terra/defaultoperator.t b/samples/Terra/defaultoperator.t deleted file mode 100644 index fe1f6c79..00000000 --- a/samples/Terra/defaultoperator.t +++ /dev/null @@ -1,9 +0,0 @@ - -local a = "+" -local b = "__sub" -local ops = {4,5} -terra foobar() - return operator(b,operator(a,3,operator("+",ops))) -end - -assert(foobar() == -12) diff --git a/samples/Terra/defer.t b/samples/Terra/defer.t deleted file mode 100644 index 4d8c7a84..00000000 --- a/samples/Terra/defer.t +++ /dev/null @@ -1,111 +0,0 @@ -C = terralib.includec("stdio.h") - - -cur = global(int) - -terra d(a : int) - if cur ~= a then - C.printf("found %d while expecting %d\n",a,cur) - error(cur) - end - cur = cur + 1 - --C.printf("d%d\n",a) -end -d:setinlined(false) - -terra side(a : int, b : {}) - d(a) -end - -terra doit() - d(0) - defer side(3,d(1)) - d(2) -end -cur:set(0) -doit() - - -terra doit2() - d(0) - var i = 100 - defer d(203) - repeat - defer d(2*(100-i)+2) - d(2*(100-i)+1) - i = i - 1 - until i == 0 - defer d(202) - do defer d(201) end -end -cur:set(0) -doit2() - -terra doit3() - d(0) - defer d(11) - for i = 0,10 do - defer d(i+1) - end -end - -cur:set(0) -doit3() - -terra doit4() - d(0) - defer d(5) - if true then - defer d(2) - d(1) - end - if false then - else - defer d(3) - end - d(4) -end -cur:set(0) -doit4() - -struct A { -} - -A.methods.stackalloc = macro(function() - return quote - var a : A - defer a:free() - in - &a - end -end) -terra A:free() - d(1) - --C.printf("freeing A (%p)\n",self) -end -terra A:print() - d(0) - --C.printf("printing A (%p)\n",self) -end -terra doit5() - var a = A.stackalloc() - a:print() -end -cur:set(0) -doit5() - -terra doit6(a : int) - defer d(2) - d(0) - if a == 0 then - defer d(1) - return 4 - end - d(1) - return 3 -end -cur:set(0) -doit6(0) - -cur:set(0) -doit6(1) diff --git a/samples/Terra/deferbreak.t b/samples/Terra/deferbreak.t deleted file mode 100644 index eeac802d..00000000 --- a/samples/Terra/deferbreak.t +++ /dev/null @@ -1,35 +0,0 @@ -C = terralib.includec("stdio.h") - -cur = global(int) - -terra d(a : int) - if cur ~= a then - C.printf("found %d while expecting %d\n",a,cur) - error(cur) - end - cur = cur + 1 - C.printf("d%d\n",a) -end -d:setinlined(false) - -terra side(a : int, b : {}) - d(a) -end - -terra doit() - d(0) - for i = 0,10 do - defer d(2*i+2) - if true then - defer d(2*i + 1) - if i == 8 then - break - end - end - end - d(19) -end -cur:set(0) -doit() -doit:printpretty() - diff --git a/samples/Terra/defercond.t b/samples/Terra/defercond.t deleted file mode 100644 index 8de1901c..00000000 --- a/samples/Terra/defercond.t +++ /dev/null @@ -1,82 +0,0 @@ -c = global(int,0) - -terra up() - c = c + 1 -end - -terra foo() - var a = 0 - while([quote do defer up() end in a < 10 end]) do - a = a + 1 - end -end - -foo() -assert(c:get() == 11) - -terra foo2() - var a = 0 - while(a < 10 and [quote do defer up() end in true end]) do - a = a + 1 - end -end - -foo2() -assert(c:get() == 21) - -terra foo3() - var a = 0 - while true do - var r = a < 10 and [quote do defer up() end in true end] - if not r then break end - a = a + 1 - end -end -foo3() -assert(c:get() == 31) - -function failit(match,fn) - local success,msg = pcall(fn) - if success then - error("failed to fail.",2) - elseif not string.match(msg,match) then - error("failed wrong: "..msg,2) - end -end -local df = "defer statements are not allowed in conditional expressions" -failit(df,function() - local terra foo() - if [quote defer up() in true end] then end - end - foo() -end) -failit(df,function() - local terra foo() - while [quote defer up() in true end] do end - end - foo() -end) -failit(df,function() - local terra foo() - repeat until [quote defer up() in true end] do end - end - foo() -end) -failit(df,function() - local terra foo() - var a = true or [quote defer up() in true end] - end - foo() -end) - -failit(df,function() - local terra foo() - var a = [quote defer up() in true end] and true - end - foo() -end) - local terra foo() - var a = [quote defer up() in 1 end] and 2 - end - foo() - assert(c:get() == 32) \ No newline at end of file diff --git a/samples/Terra/defergoto.t b/samples/Terra/defergoto.t deleted file mode 100644 index 5f73670f..00000000 --- a/samples/Terra/defergoto.t +++ /dev/null @@ -1,35 +0,0 @@ -C = terralib.includec("stdio.h") -cur = global(int) - -terra d(a : int) - if cur ~= a then - C.printf("found %d while expecting %d\n",a,cur) - error(cur) - end - cur = cur + 1 - C.printf("d%d\n",a) -end -d:setinlined(false) - -terra foo() - d(0) - defer d(14) - var a = 0 - ::begin:: - defer d(terralib.select(a == 10,13,a + 1)) - if a >= 10 then - defer d(11) - goto theend - end - a = a + 1 - goto begin - ::theend:: - defer d(12) - return a -end - -foo:printpretty() -cur:set(0) - -test = require("test") -test.eq(foo(),10) \ No newline at end of file diff --git a/samples/Terra/dgemm.t b/samples/Terra/dgemm.t deleted file mode 100644 index 4cf577b9..00000000 --- a/samples/Terra/dgemm.t +++ /dev/null @@ -1,143 +0,0 @@ - -local IO = terralib.includec("stdio.h") -local stdlib = terralib.includec("stdlib.h") - -local function isinteger(x) return math.floor(x) == x end - - - -local NB = 48 -terra naivel1matmul(A : &double, B : &double, C : &double, lda : int, ldb : int, ldc : int, alpha : double) - - for m = 0, NB do - for n = 0, NB do - C[m*ldc + n] = alpha * C[m*ldc + n] - for k = 0, NB do - C[m*ldc + n] = C[m*ldc + n] + A[m*lda + k] * B[k*ldb + n] - end - end - end - -end - -function symmat(name,I,...) - if not I then return symbol(name) end - local r = {} - for i = 0,I-1 do - r[i] = symmat(name..tostring(i),...) - end - return r -end - - -function genl1matmul(NB, NK, RM, RN, V,prefetch) - - assert(isinteger(NB / (RN*V))) - assert(isinteger(NB / RM)) - - local VP = &vector(double,V) - local terra vecload(data : &double, idx : int) - var addr = &data[idx] - return @VP(addr) - end - local terra vecstore(data : &double, idx : int, v : vector(double,V)) - var addr = &data[idx] - @VP(addr) = v - end - - local A,B,C,mm,nn, alpha = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn"),symbol("alpha") - local lda,ldb,ldc = symbol("lda"),symbol("ldb"), symbol("ldc") - local a,b,c = symmat("a",NB/V,RM), symmat("b",NB,RN), symmat("c",RM,RN) - local kk = symbol("kk") - - local loadc,storec = terralib.newlist(),terralib.newlist() - - for m = 0, RM-1 do - for n = 0, RN-1 do - loadc:insert(quote - var [c[m][n]] = alpha * vecload(C,(mm+m)*ldc + nn + n*V) - end) - storec:insert(quote - vecstore(C,(mm+m)*ldc + nn + n*V,[c[m][n]]) - end) - end - end - - local calcc = terralib.newlist() - - for kb = 0, NK/V-1 do - local kbV = kb*V - for m = 0, RM-1 do - calcc:insert(quote - var [a[kb][m]] = vecload(A,(mm+m)*lda + kk + kbV) - end) - end - for v = 0, V-1 do - local k = kbV+v - if not prefetch or (v == 0 and kb == 0) then - for n = 0, RN-1 do - calcc:insert(quote - var [b[k][n]] = vecload(B,(kk + k)*ldb + nn + n*V) - end) - end - end - for m = 0, RM-1 do - for n = 0, RN-1 do - calcc:insert(quote - [c[m][n]] = [c[m][n]] + [a[kb][m]][v] * [b[k][n]] - end) - if prefetch and not (v == V-1 and kb == NK/V-1) and m == RM-1 then --prefetch the next b - calcc:insert(quote - var [b[k+1][n]] = vecload(B,(kk + k + 1)*ldb + nn + n*V) - end) - end - end - end - end - end - - return terra([A] : &double, [B] : &double, [C] : &double, [lda] : int, [ldb] : int, [ldc] : int, [alpha] : double) - for [mm] = 0, NB, RM do - for [nn] = 0, NB,RN*V do - [loadc]; - for [kk] = 0, NB, NK do - [calcc]; - end - [storec]; - end - end - end -end - - - -local NB2 = 8 * NB -local l1matmul = genl1matmul(NB,4, 3, 2, 4) - - - -terra min(a : int, b : int) - return terralib.select(a < b, a, b) -end - -terra my_dgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : double, A : &double, lda : int, B : &double, ldb : int, - beta : double, C : &double, ldc : int) - for mm = 0,M,NB2 do - for nn = 0,N,NB2 do - for kk = 0,K, NB2 do - for m = mm,min(mm+NB2,M),NB do - for n = nn,min(nn+NB2,N),NB do - for k = kk,min(kk+NB2,K),NB do - l1matmul(A + m*lda + k, - B + k*ldb + n, - C + m*ldc + n, - lda,ldb,ldc, terralib.select(k == 0,0,1)) - end - end - end - end - end - end -end - -terralib.saveobj("my_dgemm.o", {my_dgemm = my_dgemm}) \ No newline at end of file diff --git a/samples/Terra/dgemm2.t b/samples/Terra/dgemm2.t deleted file mode 100644 index 55ab3a92..00000000 --- a/samples/Terra/dgemm2.t +++ /dev/null @@ -1,163 +0,0 @@ - -function symmat(name,I,...) - if not I then return symbol(name) end - local r = {} - for i = 0,I-1 do - r[i] = symmat(name..tostring(i),...) - end - return r -end - - -function genkernel(NB, RM, RN, V,alpha) - - local terra vecload(data : &double, idx : int) - var addr = &data[idx] - return @addr:as(&vector(double,V)) - end - local terra vecstore(data : &double, idx : int, v : vector(double,V)) - var addr = &data[idx] - @addr:as(&vector(double,V)) = v - end - - local A,B,C,mm,nn = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn") - local lda,ldb,ldc = NB,NB,NB - local a,b,c,caddr = symmat("a",RM), symmat("b",RN), symmat("c",RM,RN), symmat("caddr",RM,RN) - local k = symbol("k") - - local loadc,storec = terralib.newlist(),terralib.newlist() - local VT = vector(double,V) - local VP = &VT - for m = 0, RM-1 do - for n = 0, RN-1 do - loadc:insert(quote - var [caddr[m][n]] = C + (mm+m)*ldc + nn + n*V - var [c[m][n]] = alpha * @VP([caddr[m][n]]) - end) - storec:insert(quote - @VP([caddr[m][n]]) = [c[m][n]] - end) - end - end - - local calcc = terralib.newlist() - - for n = 0, RN-1 do - calcc:insert(quote - var [b[n]] = @VP(&B[k*ldb + nn + n*V]) - end) - end - for m = 0, RM-1 do - calcc:insert(quote - var [a[m]] = VT(A[(mm+m)*lda + k]) - end) - end - for m = 0, RM-1 do - for n = 0, RN-1 do - calcc:insert(quote - [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] - end) - end - end - - - return terra([A] : &double, [B] : &double, [C] : &double) - for [mm] = 0, NB, RM do - for [nn] = 0, NB,RN*V do - [loadc]; - for [k] = 0, NB do - [calcc]; - end - [storec]; - end - end - end -end - -local NB = 48 -local NB2 = 8 * NB - -local V = 4 - -l1dgemm0 = genkernel(NB,2,4,V,0) -l1dgemm1 = genkernel(NB,2,4,V,1) - -terra min(a : int, b : int) - return terralib.select(a < b, a, b) -end - -local stdlib = terralib.includec("stdlib.h") -local IO = terralib.includec("stdio.h") -local VP = &vector(double,V) - -terra my_dgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : double, A : &double, lda : int, B : &double, ldb : int, - beta : double, C : &double, ldc : int) - - var AA = [&double](stdlib.malloc(sizeof(double)*M*K)) - var BB = [&double](stdlib.malloc(sizeof(double)*K*N)) - var CC = [&double](stdlib.malloc(sizeof(double)*M*N)) - - var i = 0 - for mm = 0,M,NB do - for kk = 0,K,NB do - for m = mm,mm+NB do - for k = kk,kk+NB,V do - @VP(&AA[i]) = @VP(&A[m*lda + k]) - i = i + V - end - end - end - end - i = 0 - for kk = 0,K,NB do - for nn = 0,N,NB do - for k = kk,kk+NB do - for n = nn,nn+NB,V do - @VP(&BB[i]) = @VP(&B[k*ldb + n]) - i = i + V - end - end - end - end - - for mm = 0,M,NB2 do - for nn = 0,N,NB2 do - for kk = 0,K, NB2 do - for m = mm,min(mm+NB2,M),NB do - for n = nn,min(nn+NB2,N),NB do - for k = kk,min(kk+NB2,K),NB do - --IO.printf("%d %d starting at %d\n",m,k,m*lda + NB*k) - if k == 0 then - l1dgemm0(AA + (m*lda + NB*k), - BB + (k*ldb + NB*n), - CC + (m*ldc + NB*n)) - else - l1dgemm1(AA + (m*lda + NB*k), - BB + (k*ldb + NB*n), - CC + (m*ldc + NB*n)) - end - end - end - end - end - end - end - - i = 0 - for mm = 0,M,NB do - for nn = 0,N,NB do - for m = mm,mm+NB do - for n = nn,nn+NB,V do - @VP(&C[m*ldc + n]) = @VP(&CC[i]) - i = i + V - end - end - end - end - - stdlib.free(AA) - stdlib.free(BB) - stdlib.free(CC) -end - -terralib.saveobj("my_dgemm.o", { my_dgemm = my_dgemm }) \ No newline at end of file diff --git a/samples/Terra/dgemm3.t b/samples/Terra/dgemm3.t deleted file mode 100644 index 29319e84..00000000 --- a/samples/Terra/dgemm3.t +++ /dev/null @@ -1,213 +0,0 @@ - -function symmat(name,I,...) - if not I then return symbol(name) end - local r = {} - for i = 0,I-1 do - r[i] = symmat(name..tostring(i),...) - end - return r -end - - -local function isinteger(x) return math.floor(x) == x end - -llvmprefetch = terralib.intrinsic("llvm.prefetch",{&opaque,int,int,int} -> {}) - -local function alignedload(addr) - return `terralib.attrload(addr, { align = 8 }) -end -local function alignedstore(addr,v) - return `terralib.attrstore(addr,v, { align = 8 }) -end -alignedload,alignedstore = macro(alignedload),macro(alignedstore) -function genkernel(NB, RM, RN, V,alpha,boundary) - - local M,N,K, boundaryargs - if boundary then - M,N,K = symbol(int64,"M"),symbol(int64,"N"),symbol(int64,"K") - boundaryargs = terralib.newlist({M,N,K}) - else - boundaryargs = terralib.newlist() - M,N,K = NB,NB,NB - end - - local A,B,C,mm,nn,ld = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn"),symbol("ld") - local lda,ldb,ldc = symbol("lda"),symbol("ldb"),symbol("ldc") - local a,b,c,caddr = symmat("a",RM), symmat("b",RN), symmat("c",RM,RN), symmat("caddr",RM,RN) - local k = symbol("k") - - local loadc,storec = terralib.newlist(),terralib.newlist() - local VT = vector(double,V) - local VP = &VT - for m = 0, RM-1 do - for n = 0, RN-1 do - loadc:insert(quote - var [caddr[m][n]] = C + m*ldc + n*V - var [c[m][n]] = alpha * alignedload(VP([caddr[m][n]])) - end) - storec:insert(quote - alignedstore(VP([caddr[m][n]]),[c[m][n]]) - end) - end - end - - local calcc = terralib.newlist() - - for n = 0, RN-1 do - calcc:insert(quote - var [b[n]] = alignedload(VP(&B[n*V])) - end) - end - for m = 0, RM-1 do - calcc:insert(quote - var [a[m]] = VT(A[m*lda]) - end) - end - for m = 0, RM-1 do - for n = 0, RN-1 do - calcc:insert(quote - [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] - end) - end - end - - - local result = terra([A] : &double, [B] : &double, [C] : &double, [lda] : int64,[ldb] : int64,[ldc] : int64,[boundaryargs]) - for [mm] = 0, M, RM do - for [nn] = 0, N,RN*V do - [loadc]; - for [k] = 0, K do - llvmprefetch(B + 4*ldb,0,3,1); - [calcc]; - B = B + ldb - A = A + 1 - end - [storec]; - A = A - K - B = B - ldb*K + RN*V - C = C + RN*V - end - C = C + RM * ldb - N - B = B - N - A = A + lda*RM - end - end - return result -end - - -local stdlib = terralib.includec("stdlib.h") -local IO = terralib.includec("stdio.h") - - -function generatedgemm(NB,NBF,RM,RN,V) - - if not isinteger(NB/(RN*V)) then - return false - end - if not isinteger(NB/RM) then - return false - end - - local NB2 = NBF * NB - local l1dgemm0 = genkernel(NB,RM,RN,V,0,false) - local l1dgemm1 = genkernel(NB,RM,RN,V,1,false) - - - local l1dgemm0b = genkernel(NB,1,1,1,0,true) - local l1dgemm1b = genkernel(NB,1,1,1,1,true) - - local terra min(a : int, b : int) - return terralib.select(a < b, a, b) - end - - return terra(gettime : {} -> double, M : int, N : int, K : int, alpha : double, A : &double, lda : int, B : &double, ldb : int, - beta : double, C : &double, ldc : int) - for mm = 0,M,NB2 do - for nn = 0,N,NB2 do - for kk = 0,K, NB2 do - for m = mm,min(mm+NB2,M),NB do - for n = nn,min(nn+NB2,N),NB do - for k = kk,min(kk+NB2,K),NB do - --IO.printf("%d %d starting at %d\n",m,k,m*lda + NB*k) - var MM,NN,KK = min(M-m,NB),min(N-n,NB),min(K-k,NB) - var isboundary = MM < NB or NN < NB or KK < NB - var AA,BB,CC = A + (m*lda + k),B + (k*ldb + n),C + (m*ldc + n) - if k == 0 then - if isboundary then - --IO.printf("b0 %d %d %d\n",MM,NN,KK) - l1dgemm0b(AA,BB,CC,lda,ldb,ldc,MM,NN,KK) - - --IO.printf("be %d %d %d\n",MM,NN,KK) - else - l1dgemm0(AA,BB,CC,lda,ldb,ldc) - end - else - if isboundary then - - --IO.printf("b %d %d %d\n",MM,NN,KK) - l1dgemm1b(AA,BB,CC,lda,ldb,ldc,MM,NN,KK) - - --IO.printf("be %d %d %d\n",MM,NN,KK) - else - l1dgemm1(AA,BB,CC,lda,ldb,ldc) - end - end - end - end - end - end - end - end - end -end - --- - -local blocksizes = {16,24,32,40,48,56,64} -local regblocks = {1,2,4} -local vectors = {1,2,4,8} - ---local best = { gflops = 0, b = 56, rm = 4, rn = 1, v = 8 } -local best = { gflops = 0, b = 40, rm = 4, rn = 2, v = 4 } - - -if false then - local tunefor = 1024 - local harness = require("lib/matrixtestharness") - for _,b in ipairs(blocksizes) do - for _,rm in ipairs(regblocks) do - for _,rn in ipairs(regblocks) do - for _,v in ipairs(vectors) do - local my_dgemm = generatedgemm(b,5,rm,rn,v) - if my_dgemm then - print(b,rm,rn,v) - my_dgemm:compile() - local i = math.floor(tunefor / b) * b - local avg = 0 - local s, times = harness.timefunctions("double",i,i,i,function(M,K,N,A,B,C) - my_dgemm(nil,M,N,K,1.0,A,K,B,N,0.0,C,N) - end) - if not s then - print("") - break - end - print(i,unpack(times)) - local avg = times[1] - if best.gflops < avg then - best = { gflops = avg, b = b, rm = rm, rn = rn, v = v } - terralib.tree.printraw(best) - end - end - end - end - end - end -end - -terralib.tree.printraw(best) - -local my_dgemm = generatedgemm(best.b, 5, best.rm, best.rn, best.v) - ---my_dgemm:disas() -terralib.saveobj("my_dgemm.o", { my_dgemm = my_dgemm }) \ No newline at end of file diff --git a/samples/Terra/dgemmpaper.t b/samples/Terra/dgemmpaper.t deleted file mode 100644 index e415236c..00000000 --- a/samples/Terra/dgemmpaper.t +++ /dev/null @@ -1,75 +0,0 @@ - -function symmat(name,I,...) - if not I then return symbol(name) end - local r = {} - for i = 0,I-1 do - r[i] = symmat(name..tostring(i),...) - end - return r -end -prefetch = terralib.intrinsic("llvm.prefetch",{&opaque,int,int,int} -> {}) - - -function genkernel(NB, RM, RN, V,alpha) - local A,B,C = symbol("A"),symbol("B"),symbol("C") - local mm,nn = symbol("mn"),symbol("nn") - local lda,ldb,ldc = symbol("lda"),symbol("ldb"),symbol("ldc") - local a,b = symmat("a",RM), symmat("b",RN) - local c,caddr = symmat("c",RM,RN), symmat("caddr",RM,RN) - local k = symbol("k") - local loadc,storec = terralib.newlist(),terralib.newlist() - local VT = vector(double,V) - local VP = &VT - for m = 0, RM-1 do for n = 0, RN-1 do - loadc:insert(quote - var [caddr[m][n]] = C + m*ldc + n*V - var [c[m][n]] = - alpha * @VP([caddr[m][n]]) - end) - storec:insert(quote - @VP([caddr[m][n]]) = [c[m][n]] - end) - end end - local calcc = terralib.newlist() - for n = 0, RN-1 do - calcc:insert(quote - var [b[n]] = @VP(&B[n*V]) - end) - end - for m = 0, RM-1 do - calcc:insert(quote - var [a[m]] = VT(A[m*lda]) - end) - end - for m = 0, RM-1 do for n = 0, RN-1 do - calcc:insert(quote - [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] - end) - end end - return terra([A] : &double, [B] : &double, [C] : &double, - [lda] : int64,[ldb] : int64,[ldc] : int64) - for [mm] = 0, NB, RM do - for [nn] = 0, NB, RN*V do - [loadc]; - for [k] = 0, NB do - prefetch(B + 4*ldb,0,3,1); - [calcc]; - B,A = B + ldb,A + 1 - end - [storec]; - A,B,C = A - NB,B - ldb*NB + RN*V,C + RN*V - end - A,B,C = A + lda*RM, B - NB, C + RM * ldb - NB - end - end -end - -local a = genkernel(40,4,2,8,1) -a:compile() -a:printpretty() - -terra short_saxpy(a : float, - x : vector(float,4), y : vector(float,4)) - return a*x + y -end -short_saxpy:printpretty() \ No newline at end of file diff --git a/samples/Terra/diffuse.t b/samples/Terra/diffuse.t deleted file mode 100644 index ddf33dbe..00000000 --- a/samples/Terra/diffuse.t +++ /dev/null @@ -1,237 +0,0 @@ - -local C = terralib.includecstring [[ -#include -#include -#ifndef _WIN32 -#include -static double CurrentTimeInSeconds() { - struct timeval tv; - gettimeofday(&tv, NULL); - return tv.tv_sec + tv.tv_usec / 1000000.0; -} -#else -#include -static double CurrentTimeInSeconds() { - return time(NULL); -} -#endif - -int CalcTime(int * times, double * start) { - if(*times == 0) { - *start = CurrentTimeInSeconds(); - } else { - double elapsed = CurrentTimeInSeconds() - *start; - if(elapsed > 0.1f && *times >= 1) { - *start = elapsed / *times; - return 0; - } - } - (*times)++; - return 1; -} -]] - -alignedloads = global(0) -loads = global(0) -NI,NJ = 1,1 -V = 4 -local VP = &vector(float,V) -terra uload(d : &float) - --if d:as(uint64) % 16 == 0 then - -- alignedloads = alignedloads + 1 - --end - --loads = loads + 1 - return terralib.attrload(VP(d),{ align = 4 }) -end -terra ustore(d : &float, v : vector(float,V)) - terralib.attrstore(VP(d),v, { align = 4 }) -end - -terra diffuse_reference(output : &float, N : int, M : int, stride : int, x : &float, x0 : &float, a : float) - var invD = 1.f / (1 + 4.f*a) - var nextline = stride - N - for i = 0, M do - for j = 0,N do - var r = - (x0[0] - + (x[ - stride] - + x[stride] - + x[ - 1] - + x[1] )*a) * invD - output[0] = r - x0 = x0 + 1 - x = x + 1 - output = output + 1 - end - x0 = x0 + nextline --- stride - x = x + nextline --- stride - output = output + nextline --- stride - end - -end - -terra diffuse(output : &float, N : int, M : int, stride : int, x : &float, x0 : &float, a : float) - var invD = 1.f / (1 + 4.f*a) - var nextline = stride - N - for i = 0, M do - - for j = 0,N,V do - var r = - (uload(x0) - + (uload(x - stride) - + uload(x + stride) - + uload(x - 1) - + uload(x + 1) )*a) * invD - --C.printf("%d %d\n",i,j) - --llvmprefetch(x + 4 * stride,0,3,1) - --llvmprefetch(x0 + 3 * stride,0,3,1) - - ustore(output,r) - x0 = x0 + V - x = x + V - output = output + V - end - - x0 = x0 + nextline --- stride - x = x + nextline --- stride - output = output + nextline --- stride - end - -end - -llvmprefetch = terralib.intrinsic("llvm.prefetch",{&uint8,int,int,int} -> {}) - -terra diffuse2(output : &float, N : int, M : int, stride : int, x : &float, x0 : &float, a : float,xi : &float) - var invD = 1.f / (1 + 4.f*a) - var nextline = stride - N - var xi0,xi1,xi2 = xi - stride, xi, xi + stride - var x02 = x0 - for i = 0, M + 1 do - - if i < M then - for j = 0,N,V do - var r = - (uload(x0) - + (uload(x - stride) - + uload(x + stride) - + uload(x - 1) - + uload(x + 1) )*a) * invD - --C.printf("%d %d\n",i,j) - --llvmprefetch(x + 2 * stride,0,3,1) - ustore(xi,r) - x0 = x0 + V - x = x + V - xi = xi + V - end - - x0 = x0 + nextline --- stride - x = x + nextline --- stride - xi = xi + nextline --- stride - if i % 3 == 1 then - xi = xi - stride*3 - end - end - - if i >= 1 then - for j = 0,N,V do - var r = - (uload(x02) - + (uload(xi0) - + uload(xi2) - + uload(xi1 - 1) - + uload(xi1 + 1) )*a) * invD - --C.printf("%d %d\n",i,j) - ustore(output,r) - x02 = x02 + V - xi0 = xi0 + V - xi1 = xi1 + V - xi2 = xi2 + V - output = output + V - end - - x02 = x02 + nextline --- stride - xi0,xi1,xi2 = xi1 - N,xi2 - N, xi0 - N - output = output + nextline --- stride - end - end - -end - - -terra doit(thea : float) - var enlarge = 1 - var N = 1024/8 - var M = 1024*8 - var N1 = (N + 2*enlarge) - var M1 = (M + 2*enlarge) - - var NA = N1 - var x = [&float](C.malloc(NA*M1*sizeof(float))) - var x0 = [&float](C.malloc(NA*M1*sizeof(float))) - - var ro1 = [&float](C.malloc(NA*M1*sizeof(float))) - var ro2 = [&float](C.malloc(NA*M1*sizeof(float))) - - var to1 = [&float](C.malloc(NA*M1*sizeof(float))) - var to2 = [&float](C.malloc(NA*M1*sizeof(float))) - - - for i = 0, N1 do - for j = 0, N1 do - x[i*N1+j] = C.rand() % 10 - x0[i*N1+j] = C.rand() % 10 - ro1[i*N1+j] = -42 - ro2[i*N1+j] = -43 - to1[i*N1+j] = -44 - to2[i*N1+j] = -45 - end - end - var stride = N1 - var start = enlarge*stride + enlarge - - diffuse_reference(ro1 + start,N,M,stride,x + start,x0 + start,thea) - diffuse_reference(ro2 + start,N,M,stride,ro1 + start,x0 + start,thea) - - - - var times = 0 - var mytime : double - - var fuse = true - while C.CalcTime(×,&mytime) ~= 0 do - if not fuse then - diffuse(to1 + start,N,M,stride,x + start,x0 + start,thea) - diffuse(to2 + start,N,M,stride,to1 + start,x0 + start,thea) - else - diffuse2(to2 + start,N,M,stride,x + start,x0 + start,thea,to1 + start) - end - end - - C.printf("times = %d\n",times) - for i = enlarge+1, M1-enlarge-1 do - for j = enlarge+1,N1-enlarge-1 do - if ro2[i*stride+j] ~= to2[i*stride+j] then - C.printf("wrong! %d %d %f %f\n",i,j,ro2[i*stride+j],to2[i*stride+j]) - goto out - else - --C.printf("right! %d %d %f %f\n",i,j,ro1[i*N1+j],to1[i*N1+j]) - end - end - end - ::out:: - var togiga = 1.0/(1024*1024*1024) - var pixels = N*M - C.printf("%f %f %f\n", mytime, 2*pixels*4*3 *togiga / mytime, 2*6*pixels * togiga / mytime) - -end - -terra getloads() - return alignedloads,loads -end - -doit(1) -diffuse:disas() -doit(1) - -local al,loads = terralib.unpackstruct(getloads()) -print(al/loads) \ No newline at end of file diff --git a/samples/Terra/dynlib.t b/samples/Terra/dynlib.t deleted file mode 100644 index 2d67bbab..00000000 --- a/samples/Terra/dynlib.t +++ /dev/null @@ -1,47 +0,0 @@ -local ffi = require 'ffi' --- test that the dynamic library for terra was built correctly --- by compiling a new program that links against it and running it -terralib.includepath = terralib.terrahome.."/include/terra" -C = terralib.includecstring [[ -#include -#include "terra.h" -]] - -local libpath = terralib.terrahome.."/lib" - -terra doerror(L : &C.lua_State) - C.printf("%s\n",C.luaL_checklstring(L,-1,nil)) -end - -local thecode = "terra foo() return 1 end print(foo())" - -terra main(argc : int, argv : &rawstring) - var L = C.luaL_newstate(); - C.luaL_openlibs(L); - if C.terra_init(L) ~= 0 then - doerror(L) - end - if C.terra_loadstring(L,thecode) ~= 0 or C.lua_pcall(L, 0, -1, 0) ~= 0 then - doerror(L) - end - return 0; -end - -if ffi.os ~= "Windows" then - print(libpath) - local flags = terralib.newlist {"-L", libpath,"-Wl,-rpath,"..libpath,"-lterra_dynamic"} - if require("ffi").os == "OSX" then - flags:insertall {"-pagezero_size","10000", "-image_base", "100000000"} - end - - terralib.saveobj("dynlib",{main = main},flags) - - assert(0 == os.execute("./dynlib")) - -else - local putenv = terralib.externfunction("_putenv", rawstring -> int) - local flags = {libpath.."\\terra.lib",libpath.."\\lua51.lib"} - terralib.saveobj("dynlib.exe",{main = main},flags) - putenv("Path="..os.getenv("Path")..";"..terralib.terrahome.."\\bin") --make dll search happy - assert(0 == os.execute(".\\dynlib.exe")) -end \ No newline at end of file diff --git a/samples/Terra/eager.t b/samples/Terra/eager.t deleted file mode 100644 index 7218d811..00000000 --- a/samples/Terra/eager.t +++ /dev/null @@ -1,10 +0,0 @@ - - -local fn = terra() return 0 end - -for i = 1,10 do - fn = terra() return fn() + 1 end -end - -local test = require("test") -test.eq(fn(),10) \ No newline at end of file diff --git a/samples/Terra/emptycalls.t b/samples/Terra/emptycalls.t deleted file mode 100644 index 2c7f8b34..00000000 --- a/samples/Terra/emptycalls.t +++ /dev/null @@ -1,31 +0,0 @@ -terra f(x : {}) - return x -end - - -print(f({})) - -terra f2(x : {}) - return x,x -end - -print(f2({})._0) - -terra f3(x : {}, a : int) - return a + 1 -end - -assert(f3({},3) == 4) - -terra f4(x : {}) - return x,4 -end - -a = f4({}) -assert(a._1 == 4) - -terra f5() - return f({}) -end - -f5() \ No newline at end of file diff --git a/samples/Terra/emptyname.t b/samples/Terra/emptyname.t deleted file mode 100644 index b6f200aa..00000000 --- a/samples/Terra/emptyname.t +++ /dev/null @@ -1,5 +0,0 @@ -struct A {} -A.metamethods.__typename = function() return "" end -struct B {} -B.metamethods.__typename = function() return "" end -print(A:cstring(),B:cstring()) \ No newline at end of file diff --git a/samples/Terra/emptystruct.t b/samples/Terra/emptystruct.t deleted file mode 100644 index 5dc75028..00000000 --- a/samples/Terra/emptystruct.t +++ /dev/null @@ -1,30 +0,0 @@ -terra f(x : {}) - return x -end - -print(f({})) - -terra f2(x : {}) - return x,x -end - -print(f2({})) - -terra f3(x : {}, a : int) - return a + 1 -end - -assert(f3({},3) == 4) - -terra f4(x : {}) - return x,4 -end - -a = f4({}) -assert(a._1 == 4) - -terra f5() - return f({}) -end - -f5() \ No newline at end of file diff --git a/samples/Terra/enumc.t b/samples/Terra/enumc.t deleted file mode 100644 index 575e8c13..00000000 --- a/samples/Terra/enumc.t +++ /dev/null @@ -1,14 +0,0 @@ -C = terralib.includecstring [[ - enum Foo { - A_VALUE = -1, - B_VALUE = 4, - C_VALUE = 2 << 1, - D_VALUE = (1 << 31) - 1, - E_VALUE = (1 << 44) - }; -]] -assert(C.A_VALUE == -1) -assert(C.B_VALUE == 4) -assert(C.C_VALUE == 4) -assert(C.D_VALUE == 2147483647) -assert(C.E_VALUE == -2147483648) \ No newline at end of file diff --git a/samples/Terra/evenodd.t b/samples/Terra/evenodd.t deleted file mode 100644 index f226c17a..00000000 --- a/samples/Terra/evenodd.t +++ /dev/null @@ -1,20 +0,0 @@ -terra iseven(a : uint) : bool - if a == 0 then - return true - else - return isodd(a - 1) - end -end and -terra isodd(a : uint) : bool - if a == 0 then - return false - else - return iseven(a - 1) - end -end - -local test = require("test") -test.eq(iseven(3),false) -test.eq(iseven(2),true) -test.eq(isodd(3),true) -test.eq(isodd(2),false) diff --git a/samples/Terra/examplecompiler1.t b/samples/Terra/examplecompiler1.t deleted file mode 100755 index e98d3dcc..00000000 --- a/samples/Terra/examplecompiler1.t +++ /dev/null @@ -1,41 +0,0 @@ -import "lib/examplecompiler" -foo = {} - - -local def foo2(b : eg.number) : eg.number return 2 + b end - - -assert(foo2(3) == 5) - -def foo.bar(a : eg.number) : eg.number - return 1 + -2 * 3 + 1 + a - foo2(a) -end - -assert(-6 == foo.bar(4)) - -local c = def(c : eg.number) : eg.number return 4 end - -assert(4 == c(1)) - -def sign(a : eg.number) : eg.number - if a < 0 then - return -1 - else - return 1 - end -end - -def usev(a : eg.number) : eg.number - var b = 1 - return a + b -end - -def what(a : eg.number) : eg.number - var c = usev - return c(a) -end - -assert(usev(4) == 5) -assert(sign(4) == 1) -assert(sign(-3) == -1) -assert(what(4) == 5) \ No newline at end of file diff --git a/samples/Terra/examplelanguage1.t b/samples/Terra/examplelanguage1.t deleted file mode 100755 index f9f46373..00000000 --- a/samples/Terra/examplelanguage1.t +++ /dev/null @@ -1,7 +0,0 @@ -import "lib/examplelanguage" - -local a,b = 1,2 -c = 3 -local d = sum a,b,c done - -print(d) \ No newline at end of file diff --git a/samples/Terra/exampleparser1.t b/samples/Terra/exampleparser1.t deleted file mode 100644 index 98882fbb..00000000 --- a/samples/Terra/exampleparser1.t +++ /dev/null @@ -1,22 +0,0 @@ -import "lib.exampleparser" - -P exp -1 + 1 * (2 - 3) -P exp not true or false and 3 -P exp a.b.c[d]()(a,b,c) -P exp (a + 3)(4) -P exp {a,3,4, d = 4, [1+3] = 3} -P exp [ 3 + 4 ] -P statement var a,b,c:int = 3 -P statement do - if a then b else c end - if a then b end - if a then b elseif c then d end - while 3 + 3 do end - repeat - until a + b - for a,b,c:int = 1,3 do end - for a,b,c:int in 1,3 do end - a = b - a - a,c = d,e -end \ No newline at end of file diff --git a/samples/Terra/exittest.t b/samples/Terra/exittest.t deleted file mode 100644 index 0f24e5ce..00000000 --- a/samples/Terra/exittest.t +++ /dev/null @@ -1,9 +0,0 @@ - -C = { exit = terralib.externfunction("exit", int -> {}) } - - -terra moo() - C.exit(0) -end - -moo() \ No newline at end of file diff --git a/samples/Terra/explicitcast.t b/samples/Terra/explicitcast.t deleted file mode 100644 index 15d7aab2..00000000 --- a/samples/Terra/explicitcast.t +++ /dev/null @@ -1,11 +0,0 @@ - -terra foo() - var a : int64 = 256+3 - var c = intptr(&a) - var d = [&int64](c) - var fi = int(true) - var what = @[&int8](&a) - return @d,fi,what -end -local test = require("test") -test.meq({256+3,1,3},foo()) \ No newline at end of file diff --git a/samples/Terra/exportdynamic.t b/samples/Terra/exportdynamic.t deleted file mode 100644 index 3bbd63b3..00000000 --- a/samples/Terra/exportdynamic.t +++ /dev/null @@ -1,9 +0,0 @@ -terralib.includepath = terralib.terrahome.."/include/terra" -C = terralib.includecstring [[ - #include "lua.h" - #include "lauxlib.h" -]] - -local s = C.luaL_newstate() -assert(C.lua_gettop(s) == 0) - diff --git a/samples/Terra/expvec.t b/samples/Terra/expvec.t deleted file mode 100644 index 94154777..00000000 --- a/samples/Terra/expvec.t +++ /dev/null @@ -1,34 +0,0 @@ - -if require("ffi").os == "Windows" then - print("Not consistent on windows") - return -end -local C = terralib.includecstring[[ - #include - void dostuff(__m128 what) {} - void dostuff2() { __m128 a; dostuff(a); } -]] - -local V = 1 -local exp = terralib.intrinsic(("llvm.exp.v%df32"):format(V),vector(float,V) -> vector(float,V)) - -terra foo(N : int) - - var d = vector(0.f,1.f,3.f,4.f) - - C.dostuff(d) - - --var v = vector(0.f,1.f,2.f,3.f,4.f,5.f,6.f,7.f) - var v = vector(0.f) - for i = 0, N do - v = exp(v) - end - return v[0],v[1],v[2],v[3] -end - -C.dostuff:printpretty() - -local begin = terralib.currenttimeinseconds() -print(foo(100000000)) -local endd = terralib.currenttimeinseconds() -print(endd - begin) \ No newline at end of file diff --git a/samples/Terra/f2.t b/samples/Terra/f2.t deleted file mode 100644 index a7507f08..00000000 --- a/samples/Terra/f2.t +++ /dev/null @@ -1,17 +0,0 @@ -local C = terralib.includecstring [[ - typedef struct { - int a; - int b; - } Foo; -]] -for i,e in ipairs(C.Foo.entries) do - print(e.field,e.type) -end - -terra useFoo() - var f : C.Foo - f.a = 1 - f.b = 2 -end - -useFoo() \ No newline at end of file diff --git a/samples/Terra/fact.t b/samples/Terra/fact.t deleted file mode 100644 index 284bb512..00000000 --- a/samples/Terra/fact.t +++ /dev/null @@ -1,16 +0,0 @@ -local test = require("test") - -local Num = int -local terra fact(a : Num) : Num - var c,i = 1,1 - while i <= a do - c = c * i - i = i + 1 - end - return c -end - - -test.eq(fact(1),1) -test.eq(fact(2),2) -test.eq(fact(3),6) \ No newline at end of file diff --git a/samples/Terra/fakeasm.t b/samples/Terra/fakeasm.t deleted file mode 100644 index 09998825..00000000 --- a/samples/Terra/fakeasm.t +++ /dev/null @@ -1,31 +0,0 @@ - - -local op = setmetatable({},{ __index = function(self,idx) - return idx -end }) -C = terralib.includec("stdio.h") -local function emit(buf,...) - local str = "" - local operands = {} - for i = 1,select("#",...) do - local v = select(i,...) - local cv,e = v:asvalue() - str = str .. (e and "%d" or tostring(cv)) .. " " - if e then table.insert(operands,v) end - end - str = str.."\n" - return `C.sprintf(buf,str,operands) -end -emit = macro(emit) - -local c = "as28" -terra what(buf : rawstring) - var b = 3 - emit(buf,1,3,4,3+3,op.what,b + 3) -end - -local buf = terralib.new(int8[128]) -what(buf) -local ffi = require("ffi") -local s = ffi.string(buf) -assert("1 3 4 6 what 6 \n" == s) diff --git a/samples/Terra/falsespec.t b/samples/Terra/falsespec.t deleted file mode 100644 index 970a9695..00000000 --- a/samples/Terra/falsespec.t +++ /dev/null @@ -1,8 +0,0 @@ - - -terra derp() - var a = [false] - return a -end - -assert(derp() == false) \ No newline at end of file diff --git a/samples/Terra/fastcall.t b/samples/Terra/fastcall.t deleted file mode 100644 index 1cef49bb..00000000 --- a/samples/Terra/fastcall.t +++ /dev/null @@ -1,24 +0,0 @@ - -terra foo() - return 1 -end - - -assert(1 == foo()) -assert(rawget(foo,"fastcall") == foo:getdefinitions()[1].ffiwrapper) -assert(1 == foo()) - - -terra foo2() - return 1,2 -end -local a,b = terralib.unpackstruct(foo2()) -assert(a == 1 and b == 2) -assert(rawget(foo2,"fastcall") == foo2:getpointer()) -local a,b = unpackstruct(foo2()) -assert(a == 1 and b == 2) - -terra foo(a : int) -end - -assert(rawget(foo,"fastcall") == nil) \ No newline at end of file diff --git a/samples/Terra/fib.t b/samples/Terra/fib.t deleted file mode 100644 index c2fb5fe2..00000000 --- a/samples/Terra/fib.t +++ /dev/null @@ -1,26 +0,0 @@ -local test = require("test") - -local Num = int - -local base = {} -terra base.fib(a : Num) : Num - var i,c,p = 0,1,1 - while i < a do - c,p = c + p,c - i = i + 1 - end - return c -end - -function fib2(a) - local i,c,p = 0,1,1 - while i < a do - c,p = c + p,c - i = i + 1 - end - return c -end -for i = 0,10 do - print(base.fib(i)) - test.eq(base.fib(i),fib2(i)) -end \ No newline at end of file diff --git a/samples/Terra/fib2.t b/samples/Terra/fib2.t deleted file mode 100644 index 29d8127e..00000000 --- a/samples/Terra/fib2.t +++ /dev/null @@ -1,27 +0,0 @@ -local test = require("test") - -local Num = int - -terra fib(a : Num) : Num - if a == 0 then - return 1 - elseif a == 1 then - return 1 - else - return fib(a - 1) + fib(a - 2) - end -end - -function fib2(a) - if a == 0 then - return 1 - elseif a == 1 then - return 1 - else - return fib2(a - 1) + fib2(a - 2) - end -end -for i = 0,10 do - print(fib(i)) - test.eq(fib(i),fib2(i)) -end diff --git a/samples/Terra/fnames.t b/samples/Terra/fnames.t deleted file mode 100644 index befb5e4d..00000000 --- a/samples/Terra/fnames.t +++ /dev/null @@ -1,5 +0,0 @@ -foo = terra(a : int) end -foo:setname("bar") - -assert(foo:getname() == "bar") -foo:disas() \ No newline at end of file diff --git a/samples/Terra/fncalltest.t b/samples/Terra/fncalltest.t deleted file mode 100644 index dcf18907..00000000 --- a/samples/Terra/fncalltest.t +++ /dev/null @@ -1,16 +0,0 @@ - - - -terra foo() - -end - - -terra bar() - foo() - var what = foo - --what() -end - -bar:compile() - diff --git a/samples/Terra/fnpointer.t b/samples/Terra/fnpointer.t deleted file mode 100644 index 042af355..00000000 --- a/samples/Terra/fnpointer.t +++ /dev/null @@ -1,24 +0,0 @@ - -terra foo() - return 4LL -end - -terra bar() - return 5LL -end - -terra bar3(fn: {} -> int64) - return fn() -end - -terra baz(a : int64) - var afn = foo - if a > 2 then - afn = bar - end - return bar3(afn) -end - -local test = require("test") -test.eq(baz(1),4) -test.eq(baz(3),5) \ No newline at end of file diff --git a/samples/Terra/fnptr.t b/samples/Terra/fnptr.t deleted file mode 100644 index baaad41a..00000000 --- a/samples/Terra/fnptr.t +++ /dev/null @@ -1,7 +0,0 @@ -terra baz() return 1 end -bp = baz:getpointer() -terra foo() - return bp() -end - -assert(foo() == 1) \ No newline at end of file diff --git a/samples/Terra/fnptrc.t b/samples/Terra/fnptrc.t deleted file mode 100644 index 935c3341..00000000 --- a/samples/Terra/fnptrc.t +++ /dev/null @@ -1,25 +0,0 @@ - -C = terralib.includecstring [[ - struct Foo { - int (*bar)(int); - }; - int runptr(int (*bar)(int), int a) { - return bar(a); - } -]] - -terra add1(a : int) return a + 1 end - -terra what0() - return C.runptr(add1,1) -end - -assert(what0() == 2) - -terra what() - var c : C.Foo - c.bar = add1 - return c.bar(1) -end - -assert(what() == 2) \ No newline at end of file diff --git a/samples/Terra/foo.t b/samples/Terra/foo.t deleted file mode 100644 index 0aa5252f..00000000 --- a/samples/Terra/foo.t +++ /dev/null @@ -1 +0,0 @@ -a = global( struct { real : float, imag : float }) \ No newline at end of file diff --git a/samples/Terra/for.t b/samples/Terra/for.t deleted file mode 100644 index 41e4d893..00000000 --- a/samples/Terra/for.t +++ /dev/null @@ -1,31 +0,0 @@ - -terra foo(a : int, s : int) - var r = 0 - for i = 0,a,s do - r = r + i - end - return r -end - -terra foo2(a : int) - var r = 0 - for i = 0,a do - r = r + i - end - return r -end - -terra foo3(a : int) - var r = 0 - for i = a,0,-1 do - r = r + i - end - return r -end - -local test = require("test") -test.eq(foo(10,1),45) -test.eq(foo(10,2),20) -test.eq(foo(0,1),0) -test.eq(foo2(10),45) -test.eq(foo3(10),55) \ No newline at end of file diff --git a/samples/Terra/for2.t b/samples/Terra/for2.t deleted file mode 100644 index 3bd8f374..00000000 --- a/samples/Terra/for2.t +++ /dev/null @@ -1,31 +0,0 @@ - -terra foo(a : uint64, s : uint64) - var r = 0 - for i : uint64 = 0,a,s do - r = r + i - end - return r -end - -terra foo2(a : int) - var r = 0 - for i : int = 0.f,a do - r = r + i - end - return r -end -terra foo3(a : int) - var r = 0 - for i = a,0,-1 do - r = r + i - end - return r -end - - -local test = require("test") -test.eq(foo(10,1),45) -test.eq(foo(10,2),20) -test.eq(foo(0,1),0) -test.eq(foo2(10),45) -test.eq(foo3(10),55) diff --git a/samples/Terra/forbreak.t b/samples/Terra/forbreak.t deleted file mode 100644 index d14b056f..00000000 --- a/samples/Terra/forbreak.t +++ /dev/null @@ -1,17 +0,0 @@ - -terra foo(a : int, s : int) - var r = 0 - for i = 0,a,s do - if i == 8 then - break - end - r = r + i - - end - return r -end - -local test = require("test") -test.eq(foo(10,1),28) -test.eq(foo(10,2),12) -test.eq(foo(0,1),0) \ No newline at end of file diff --git a/samples/Terra/forlist.t b/samples/Terra/forlist.t deleted file mode 100644 index da427475..00000000 --- a/samples/Terra/forlist.t +++ /dev/null @@ -1,24 +0,0 @@ - - -struct Range { - a : int; - b : int; -} -Range.metamethods.__for = function(syms,iter,body) - return syms, quote - var it = iter - for [syms[1]] = it.a,it.b do - body - end - end -end - -terra foo() - var a = 0 - for i in Range {0,10} do - a = a + i - end - return a -end - -assert(foo() == 10*9/2) \ No newline at end of file diff --git a/samples/Terra/forlist2.t b/samples/Terra/forlist2.t deleted file mode 100644 index a09b6d73..00000000 --- a/samples/Terra/forlist2.t +++ /dev/null @@ -1,37 +0,0 @@ - - -struct Array { - data : int[3]; -} -Array.metamethods.__for = function(syms,iter,body) - local pe = symbol() - local e = `@pe - return {e}, quote - var it = &iter - for i = 0,3 do - var [pe] = &it.data[i] - body - end - end -end - -terra foo() - var a = Array{ array(1,2,3) } - for i in a do - i = i + 1 - end - return a.data[0] + a.data[1] + a.data[2] -end - -terra foo2() - var a = Array{ array(1,2,3) } - var s = 0 - for i : double in a do - s = s + i - end - return s -end - -assert(foo() == 9) - -assert(foo2() == 6) \ No newline at end of file diff --git a/samples/Terra/forp.t b/samples/Terra/forp.t deleted file mode 100644 index 2db2c3e9..00000000 --- a/samples/Terra/forp.t +++ /dev/null @@ -1,21 +0,0 @@ -struct Range { - a : int; - b : int; -} -Range.metamethods.__for = function(syms,iter,body) - return syms, quote - var it = iter - for [syms[1]] = it.a,it.b do - body - end - end -end - -terra foo() - var v = Range { 0, 3 } - var vp = &v - var i = 0 - for e in vp do i = i + e end - return i -end -assert(3 == foo()) \ No newline at end of file diff --git a/samples/Terra/forsym.t b/samples/Terra/forsym.t deleted file mode 100644 index 10857a48..00000000 --- a/samples/Terra/forsym.t +++ /dev/null @@ -1,24 +0,0 @@ - -terra foo(a : int, s : int) - var r = 0 - for i = 0,a,s do - r = r + i - end - return r -end - -local i = symbol() - -terra foo2(a : int) - var r = 0 - for [i] = 0,a do - r = r + [i] - end - return r -end - -local test = require("test") -test.eq(foo(10,1),45) -test.eq(foo(10,2),20) -test.eq(foo(0,1),0) -test.eq(foo2(10),45) \ No newline at end of file diff --git a/samples/Terra/forwardtodef.t b/samples/Terra/forwardtodef.t deleted file mode 100644 index 228ad86a..00000000 --- a/samples/Terra/forwardtodef.t +++ /dev/null @@ -1,7 +0,0 @@ - - -terra foo() - return 1 -end -foo:setinlined(true) -foo:disas() \ No newline at end of file diff --git a/samples/Terra/functionnoproto.t b/samples/Terra/functionnoproto.t deleted file mode 100644 index 1ce9bad8..00000000 --- a/samples/Terra/functionnoproto.t +++ /dev/null @@ -1,6 +0,0 @@ -C = terralib.includecstring [[ - typedef int (*PROC)(); - PROC what() { return 0; } -]] - -assert(C.what() == nil) \ No newline at end of file diff --git a/samples/Terra/gctest.t b/samples/Terra/gctest.t deleted file mode 100644 index 12342798..00000000 --- a/samples/Terra/gctest.t +++ /dev/null @@ -1,18 +0,0 @@ - - - - -local terra foo() -end - -local terra bar() -end - -foo:compile() -bar:compile() -foo = nil - -collectgarbage() -collectgarbage() - -print("HERE") \ No newline at end of file diff --git a/samples/Terra/gemm.t b/samples/Terra/gemm.t deleted file mode 100644 index 5993ae22..00000000 --- a/samples/Terra/gemm.t +++ /dev/null @@ -1,207 +0,0 @@ -local number = double -local alignment = 8 -local dotune = false - -function symmat(name,I,...) - if not I then return symbol(name) end - local r = {} - for i = 0,I-1 do - r[i] = symmat(name..tostring(i),...) - end - return r -end - -local function isinteger(x) return math.floor(x) == x end - -llvmprefetch = terralib.intrinsic("llvm.prefetch",{&opaque,int,int,int} -> {}) -local function unalignedload(addr) - return `terralib.attrload(addr, { align = alignment }) -end -local function unalignedstore(addr,v) - return `terralib.attrstore(addr,v, { align = alignment }) -end - -unalignedload,unalignedstore = macro(unalignedload),macro(unalignedstore) - -function genkernel(NB, RM, RN, V,alpha,boundary) - - local M,N,K, boundaryargs - if boundary then - M,N,K = symbol(int64,"M"),symbol(int64,"N"),symbol(int64,"K") - boundaryargs = terralib.newlist({M,N,K}) - else - boundaryargs = terralib.newlist() - M,N,K = NB,NB,NB - end - - local A,B,C,mm,nn,ld = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn"),symbol("ld") - local lda,ldb,ldc = symbol("lda"),symbol("ldb"),symbol("ldc") - local a,b,c,caddr = symmat("a",RM), symmat("b",RN), symmat("c",RM,RN), symmat("caddr",RM,RN) - local k = symbol("k") - - local loadc,storec = terralib.newlist(),terralib.newlist() - local VT = vector(number,V) - local VP = &VT - for m = 0, RM-1 do - for n = 0, RN-1 do - loadc:insert(quote - var [caddr[m][n]] = C + m*ldc + n*V - var [c[m][n]] = alpha * unalignedload(VP([caddr[m][n]])) - end) - storec:insert(quote - unalignedstore(VP([caddr[m][n]]),[c[m][n]]) - end) - end - end - - local calcc = terralib.newlist() - - for n = 0, RN-1 do - calcc:insert(quote - var [b[n]] = unalignedload(VP(&B[n*V])) - end) - end - for m = 0, RM-1 do - calcc:insert(quote - var [a[m]] = VT(A[m*lda]) - end) - end - for m = 0, RM-1 do - for n = 0, RN-1 do - calcc:insert(quote - [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] - end) - end - end - - local result = terra([A] : &number, [B] : &number, [C] : &number, [lda] : int64,[ldb] : int64,[ldc] : int64,[boundaryargs]) - for [mm] = 0, M, RM do - for [nn] = 0, N,RN*V do - [loadc]; - for [k] = 0, K do - llvmprefetch(B + 4*ldb,0,3,1); - [calcc]; - B = B + ldb - A = A + 1 - end - [storec]; - A = A - K - B = B - ldb*K + RN*V - C = C + RN*V - end - C = C + RM * ldb - N - B = B - N - A = A + lda*RM - end - end - return result -end - -local stdlib = terralib.includec("stdlib.h") -local IO = terralib.includec("stdio.h") - -local terra min(a : int, b : int) - return terralib.select(a < b, a, b) -end -function blockedloop(N,M,K,blocksizes,bodyfn) - local function generatelevel(n,ii,jj,kk,bb0,bb1,bb2) - if n > #blocksizes then - return bodyfn(ii,jj,kk) - end - local blocksize = blocksizes[n] - return quote for i = ii,min(ii+bb0,N),blocksize do - for j = jj,min(jj+bb1,M),blocksize do - for k = kk,min(kk+bb2,K),blocksize do - [ generatelevel(n+1,i,j,k,blocksize,blocksize,blocksize) ] - end end end end - end - return generatelevel(1,0,0,0,N,M,K) -end - -function generatedgemm(NB,NBF,RM,RN,V) - if not isinteger(NB/(RN*V)) or not isinteger(NB/RM) then - return false - end - - local NB2 = NBF * NB - local l1dgemm0 = genkernel(NB,RM,RN,V,0,false) - local l1dgemm1 = genkernel(NB,RM,RN,V,1,false) - local l1dgemm0b = genkernel(NB,1,1,1,0,true) - local l1dgemm1b = genkernel(NB,1,1,1,1,true) - - return terra(gettime : {} -> double, M : int, N : int, K : int, alpha : number, A : &number, lda : int, B : &number, ldb : int, - beta : number, C : &number, ldc : int) - [ blockedloop(N,M,K,{NB2,NB},function(m,n,k) return quote - var MM,NN,KK = min(M-m,NB),min(N-n,NB),min(K-k,NB) - var isboundary = MM < NB or NN < NB or KK < NB - var AA,BB,CC = A + (m*lda + k),B + (k*ldb + n),C + (m*ldc + n) - if k == 0 then - if isboundary then - --IO.printf("b0 %d %d %d\n",MM,NN,KK) - l1dgemm0b(AA,BB,CC,lda,ldb,ldc,MM,NN,KK) - - --IO.printf("be %d %d %d\n",MM,NN,KK) - else - l1dgemm0(AA,BB,CC,lda,ldb,ldc) - end - else - if isboundary then - - --IO.printf("b %d %d %d\n",MM,NN,KK) - l1dgemm1b(AA,BB,CC,lda,ldb,ldc,MM,NN,KK) - - --IO.printf("be %d %d %d\n",MM,NN,KK) - else - l1dgemm1(AA,BB,CC,lda,ldb,ldc) - end - end - end end) ] - end -end - -local blocksizes = {16,24,32,40,48,56,64} -local regblocks = {1,2,4} -local vectors = {1,2,4,8,16} ---local best = { gflops = 0, b = 56, rm = 4, rn = 1, v = 8 } -local best = { gflops = 0, b = 40, rm = 4, rn = 2, v = 4 } ---local best = { gflops = 0, b = 40, rm = 1, rn = 1, v = 1 } - -if dotune then - local tunefor = 1024 - local harness = require("lib/matrixtestharness") - for _,b in ipairs(blocksizes) do - for _,rm in ipairs(regblocks) do - for _,rn in ipairs(regblocks) do - for _,v in ipairs(vectors) do - local my_dgemm = generatedgemm(b,5,rm,rn,v) - if my_dgemm then - print(b,rm,rn,v) - my_dgemm:compile() - local i = math.floor(tunefor / b) * b - local avg = 0 - local ctyp - local s, times = harness.timefunctions(tostring(number),i,i,i,function(M,K,N,A,B,C) - my_dgemm(nil,M,N,K,1.0,A,K,B,N,0.0,C,N) - end) - if not s then - print("") - break - end - print(i,unpack(times)) - local avg = times[1] - if best.gflops < avg then - best = { gflops = avg, b = b, rm = rm, rn = rn, v = v } - terralib.tree.printraw(best) - end - end - end - end - end - end -end -local my_dgemm = generatedgemm(best.b, 5, best.rm, best.rn, best.v) -if number == double then - terralib.saveobj("my_dgemm.o", { my_dgemm = my_dgemm }) -else - terralib.saveobj("my_sgemm.o", { my_sgemm = my_dgemm }) -end \ No newline at end of file diff --git a/samples/Terra/getmethod.t b/samples/Terra/getmethod.t deleted file mode 100644 index 5d93531a..00000000 --- a/samples/Terra/getmethod.t +++ /dev/null @@ -1,19 +0,0 @@ - - -struct A {} - - -A.metamethods.__getmethod = function(self,methodname) - local c = methodname:sub(1,1):byte() - return terra(a : &A) - return c - end -end - - -terra foo() - var a : A - return a:a() + a:b() -end - -assert(foo() == ("a"):byte() + ("b"):byte()) \ No newline at end of file diff --git a/samples/Terra/gettype.t b/samples/Terra/gettype.t deleted file mode 100644 index dacd2b39..00000000 --- a/samples/Terra/gettype.t +++ /dev/null @@ -1,18 +0,0 @@ - - - -function makestuff(a) - local T = a:gettype() - local struct ST { - a : T - } - return `ST { a } -end - -makestuff = macro(makestuff) - -terra useit() - return makestuff(true).a,makestuff(3.0).a -end -local test = require("test") -test.meq({true,3},useit()) \ No newline at end of file diff --git a/samples/Terra/globals.t b/samples/Terra/globals.t deleted file mode 100644 index 9dc6d6ba..00000000 --- a/samples/Terra/globals.t +++ /dev/null @@ -1,26 +0,0 @@ - -struct A { a : int } -local a = terralib.global(A) -a:set({3}) -local b = terralib.global(true) -local c = terralib.global(int[3]) -local d = terralib.global(3.5) - -terra foobar() - c[0] = 3 - return a.a + d -end - -e = global(int) -terra doihaveaname() - e = 10 - return e -end - -assert(doihaveaname() == 10) -assert(6.5 == foobar()) -print("HERE") -assert(true == b:get()) -assert(3 == c:get()[0]) - -print("TODO - fix handling of initializers for array-like things and literal strings") \ No newline at end of file diff --git a/samples/Terra/goto.t b/samples/Terra/goto.t deleted file mode 100644 index 241adf0c..00000000 --- a/samples/Terra/goto.t +++ /dev/null @@ -1,16 +0,0 @@ - - -terra foo() - var a = 0 - ::begin:: - if a >= 10 then - goto theend - end - a = a + 1 - goto begin - ::theend:: - return a -end - -test = require("test") -test.eq(foo(),10) \ No newline at end of file diff --git a/samples/Terra/goto2.t b/samples/Terra/goto2.t deleted file mode 100644 index f8f430da..00000000 --- a/samples/Terra/goto2.t +++ /dev/null @@ -1,18 +0,0 @@ - -local begin = symbol() -local theend = symbol() - -terra foo() - var a = 0 - ::[begin]:: - if a >= 10 then - goto [theend] - end - a = a + 1 - goto [begin] - ::[theend]:: - return a -end - -test = require("test") -test.eq(foo(),10) \ No newline at end of file diff --git a/samples/Terra/gvarfault.t b/samples/Terra/gvarfault.t deleted file mode 100644 index 6702563b..00000000 --- a/samples/Terra/gvarfault.t +++ /dev/null @@ -1,24 +0,0 @@ -if require("ffi").os == "Windows" then - print("Disabled on windows (uses unistd.h)") - return -end -local C = terralib.includecstring( -[[ -#include -#include -#include -#include -#include -]] -) - -local gstr = global(&int8, "some text") - -terra fun1() - C.printf("gstr: %s \n", gstr) - return 0 -end - -fun1:printpretty() - -fun1() \ No newline at end of file diff --git a/samples/Terra/hasbeenfrozen.t b/samples/Terra/hasbeenfrozen.t deleted file mode 100644 index c1c40866..00000000 --- a/samples/Terra/hasbeenfrozen.t +++ /dev/null @@ -1,33 +0,0 @@ -struct A { - a : int; - b : int; - c : &B -} and struct B { - a : &A -} - -local a = global(A) - - -terra foo() - var b : B - return a.a + a.b -end - -function A.metamethods.__staticinitialize(self) - print("A") - assert(A:iscomplete()) - a:get().a = 4 -end - -function B.metamethods.__staticinitialize(self) - print("B") - assert(B:iscomplete()) - a:get().b = 3 - foo:gettype(function() - assert(foo() == 7) - a:get().a = a:get().a + 1 - end) -end - -assert(foo() == 8) \ No newline at end of file diff --git a/samples/Terra/hello.t b/samples/Terra/hello.t deleted file mode 100644 index 81af8917..00000000 --- a/samples/Terra/hello.t +++ /dev/null @@ -1,8 +0,0 @@ -local c = terralib.includec("stdio.h") - -terra hello() - c.printf("hello, world\n") -end - -terralib.saveobj("hello",{main = hello}) -hello() diff --git a/samples/Terra/hello2.t b/samples/Terra/hello2.t deleted file mode 100644 index 638b5e15..00000000 --- a/samples/Terra/hello2.t +++ /dev/null @@ -1,10 +0,0 @@ - -local c = terralib.includec("stdio.h") - -terralib.tree.printraw(getmetatable(c).errors) - -terra main() - c.printf("hello, world\n") -end - -main() \ No newline at end of file diff --git a/samples/Terra/hexf.t b/samples/Terra/hexf.t deleted file mode 100644 index 6b767b49..00000000 --- a/samples/Terra/hexf.t +++ /dev/null @@ -1,9 +0,0 @@ - - -assert(0xf == 15) - -terra foo() - return 0xf -end - -assert(foo() == 15) \ No newline at end of file diff --git a/samples/Terra/huge.t b/samples/Terra/huge.t deleted file mode 100644 index e52733db..00000000 --- a/samples/Terra/huge.t +++ /dev/null @@ -1,7 +0,0 @@ - - -terra returnhuge() - return math.huge -end - -assert(returnhuge() == math.huge) \ No newline at end of file diff --git a/samples/Terra/ifelse.t b/samples/Terra/ifelse.t deleted file mode 100644 index 2f3d83a0..00000000 --- a/samples/Terra/ifelse.t +++ /dev/null @@ -1,17 +0,0 @@ - -terra foo(a : int) - return terralib.select(a > 0, 1,-1) -end - - -terra foo2(a : int) - var c = vector(a > 0, a > 1, a > 2) - var d = terralib.select(c,vector(1,2,3),vector(4,5,6)) - return d[0], d[1], d[2] -end -local test = require("test") - -test.eq(foo(1),1) -test.eq(foo(-1),-1) - -test.meq({1,5,6},foo2(1)) \ No newline at end of file diff --git a/samples/Terra/includec.t b/samples/Terra/includec.t deleted file mode 100644 index 3ebb9f4d..00000000 --- a/samples/Terra/includec.t +++ /dev/null @@ -1,42 +0,0 @@ - -local c = terralib.includec("mytest.h") - -terra foo() - var a : int = 3 - return c.myfoobarthing(1,2,3.5,&a) + a -end - -terra bar() - return c.myotherthing(4,5) -end - -terra bar2() - return c.myfnptr(bar) -end - -terra bar3() - var a : c.size_t = 3 - return a -end - -terra bar4() - var opaquething : c.MyStruct2 - var my = c.MyStruct { 3, 4} - return my.a + my.b -end - -terra writefile() - c.printf("%f %f %f\n",3.0,4.0,5.0) - var f = c.fopen("afile.txt","w") - c.fputs("a string\n",f) - c.fclose(f) -end - -local test = require("test") - -test.eq(foo(),15) -test.eq(c.myotherthing(1,2),3) -test.eq(bar2(),9) -test.eq(bar3(),3) -test.eq(bar4(),7) -writefile() diff --git a/samples/Terra/includetwice.t b/samples/Terra/includetwice.t deleted file mode 100644 index eeba70d4..00000000 --- a/samples/Terra/includetwice.t +++ /dev/null @@ -1,21 +0,0 @@ - - -local C1 = terralib.includecstring [[ - typedef struct { int a; } A; - int geta(A* a) { return a->a; } -]] -local C2 = terralib.includecstring [[ - typedef struct { int a; } A; - void seta(A* a, int v) { a->a = v; } -]] - -assert(C1.A == C2.A) - - -terra usethem() - var a = C1.A { 1 } - C2.seta(&a,C1.geta(&a) + 3) - return a.a -end - -assert(usethem() == 4) \ No newline at end of file diff --git a/samples/Terra/incomplete.t b/samples/Terra/incomplete.t deleted file mode 100644 index 8b1d4662..00000000 --- a/samples/Terra/incomplete.t +++ /dev/null @@ -1,32 +0,0 @@ - - -struct A - -terra foo(a : &A) - return a -end - -assert(nil == foo(nil)) -assert(false == A:iscomplete()) - - -struct A { - b : int -} - -terra foo2(a : &A) - a.b = 6 - return @a -end - -foo2:compile() -assert(true == A:iscomplete()) - -local ptr = terralib.new(A) - -ptr.b = 4 - -local r = foo2(ptr) - -assert(r.b == 6) -assert(ptr.b == 6) \ No newline at end of file diff --git a/samples/Terra/incomplete2.t b/samples/Terra/incomplete2.t deleted file mode 100644 index 17223680..00000000 --- a/samples/Terra/incomplete2.t +++ /dev/null @@ -1,25 +0,0 @@ - -struct A { - b : &B -} and -struct B - - -terra foo() - var a : A - a.b = nil - return a -end - -local a = foo() - - -struct B { - a : int -} - -terra foo2(a : &A) - a.b = a.b + 1 -end - -foo2(a) diff --git a/samples/Terra/incomplete3.t b/samples/Terra/incomplete3.t deleted file mode 100644 index c23bb9be..00000000 --- a/samples/Terra/incomplete3.t +++ /dev/null @@ -1,29 +0,0 @@ - -struct A { - b : B -> C -} and -struct B and struct C - - -terra foo() - var a : A - a.b = nil - return a -end - -local a = foo() - - -struct B { - a : int -} -struct C { - b : int -} - -terra foo2(a : &A) - var ptrb : &B - var c = a.b(@ptrb) -end - -foo2:compile() \ No newline at end of file diff --git a/samples/Terra/incomplete4.t b/samples/Terra/incomplete4.t deleted file mode 100644 index 765eadc1..00000000 --- a/samples/Terra/incomplete4.t +++ /dev/null @@ -1,22 +0,0 @@ - - -struct A - -terra foo(a : &A) - return a -end - -assert(nil == foo(nil)) -assert(false == A:iscomplete()) - - -struct A { - b : int -} - -terra foo2(a : &A) - return a.b -end - -foo2:compile() -assert(true == A:iscomplete()) diff --git a/samples/Terra/incomplete5.t b/samples/Terra/incomplete5.t deleted file mode 100644 index 444b451e..00000000 --- a/samples/Terra/incomplete5.t +++ /dev/null @@ -1,65 +0,0 @@ - - - ---terra things that should complete the type -local ct = {} - ---terra things that should not complete the type -local dct = {} - - - -function ct.a(A) - return terra(a : A) return a end -end - -function ct.b(A) - return terra() var a : A end -end - -function ct.c(A) - return terra(a : &A) return a + 1 end -end -function ct.d(A) - local at = A[3] - return terra(a : A[3]) return a[0] end -end -function ct.e(A) - local struct B { a : A } - return terra(a : B) end -end - -function dct.c(A) - local at = A[3] - return terra(a : &A[3]) return a end -end - -function dct.b(A) - return terra(a : &A) return a end -end - -function dct.d(A) - local struct B { - a : &A; - b : int - } - return terra(a : &B) return a.b end -end - - -local function testthem(stuff,completestype) - for k,v in pairs(stuff) do - local struct A - if completestype then - struct A { - a : int - } - end - local result = v(A) - result:compile() - assert(A:iscomplete() == completestype) - end -end - -testthem(ct,true) -testthem(dct,false) \ No newline at end of file diff --git a/samples/Terra/incompletetypetest.t b/samples/Terra/incompletetypetest.t deleted file mode 100644 index e35cfd90..00000000 --- a/samples/Terra/incompletetypetest.t +++ /dev/null @@ -1,13 +0,0 @@ - - -struct A { - a : int -} - - -terra what() - var a : &A = nil - return &a[4] -end - -what:compile() \ No newline at end of file diff --git a/samples/Terra/incompletetypetest2.t b/samples/Terra/incompletetypetest2.t deleted file mode 100644 index 9f48c53e..00000000 --- a/samples/Terra/incompletetypetest2.t +++ /dev/null @@ -1,13 +0,0 @@ - - -struct A { - a : int -} - - -terra what() - var a : &A = nil - return a + 4 -end - -what:compile() \ No newline at end of file diff --git a/samples/Terra/incompletetypetest3.t b/samples/Terra/incompletetypetest3.t deleted file mode 100644 index bae8aa2f..00000000 --- a/samples/Terra/incompletetypetest3.t +++ /dev/null @@ -1,13 +0,0 @@ - - -struct A { - a : int -} - - -terra what() - var a : &A = nil - return a - a -end - -what:compile() \ No newline at end of file diff --git a/samples/Terra/indexing64.t b/samples/Terra/indexing64.t deleted file mode 100644 index 4c87ff73..00000000 --- a/samples/Terra/indexing64.t +++ /dev/null @@ -1,10 +0,0 @@ - - -terra foo() - var a : int[5] - a[2] = 2 - var b = [int64](2) - return a[b] -end - -assert(foo() == 2) \ No newline at end of file diff --git a/samples/Terra/indexingbug.t b/samples/Terra/indexingbug.t deleted file mode 100644 index 0f9cee13..00000000 --- a/samples/Terra/indexingbug.t +++ /dev/null @@ -1,31 +0,0 @@ -arr = terralib.new(int[256]) - -arr[252] = 12 - -terra foo(arr : &int) - var idx = [uint8](252) - return arr[idx] -end - -terra foo2(arr : &int) - var idx = [uint8](252) - return @(arr + idx) -end - -terra foo3(arr : &int) - var idx = [int8](-3) - arr = arr + 255 - return @(arr + idx) -end - - -terra foo4(arr : &int) - var idx = [int8](-3) - arr = arr + 255 - return arr[idx] -end - -assert(foo2(arr) == 12) -assert(foo(arr) == 12) -assert(foo3(arr) == 12) -assert(foo4(arr) == 12) \ No newline at end of file diff --git a/samples/Terra/interface.t b/samples/Terra/interface.t deleted file mode 100644 index d837aa60..00000000 --- a/samples/Terra/interface.t +++ /dev/null @@ -1,33 +0,0 @@ - -IO = terralib.includec("stdio.h") -local Class = require("lib/javalike") - -struct A { - a : int -} - -terra A:foo(a : int) : int - return self.a + a -end - -local m = A.methods.foo:getdefinitions()[1] - -HasFoo = Class.interface({ foo = int -> int }) - -Class.implements(A,HasFoo) - -terra hasfoo(a : &HasFoo) - return a:foo(3) -end - -terra testit() - var a = A.alloc() - a.a = 4 - return hasfoo(a) + a:foo(5) -end - -print(m:getpointer()) -testit:compile() -print("DONE") - -assert(testit() == 16) \ No newline at end of file diff --git a/samples/Terra/interface2.t b/samples/Terra/interface2.t deleted file mode 100644 index bdb9a02d..00000000 --- a/samples/Terra/interface2.t +++ /dev/null @@ -1,38 +0,0 @@ - -IO = terralib.includec("stdio.h") -local Class = require("lib/javalike") - -HasFoo = Class.interface({ foo = int -> int }) - -struct A { - a : int -} - -terra A:foo(a : int) : int - return 1 -end -Class.implements(A,HasFoo) - -struct B {} -Class.extends(B,A) - - -struct C {} -Class.extends(C,B) - -terra C:foo(a : int) : int - return 3 -end - -terra hasfoo(a : &HasFoo) - return a:foo(3) -end - -terra testit() - var a = A.alloc() - var b = B.alloc() - var c = C.alloc() - return hasfoo(a) + hasfoo(b) + hasfoo(c) -end - -assert(testit() == 5) \ No newline at end of file diff --git a/samples/Terra/intrinsic.t b/samples/Terra/intrinsic.t deleted file mode 100644 index 8617ce5c..00000000 --- a/samples/Terra/intrinsic.t +++ /dev/null @@ -1,21 +0,0 @@ -local sqrt = terralib.intrinsic("llvm.sqrt.f32",float -> float) -local sqrt2 = terralib.intrinsic("llvm.sqrt.v4f32",vector(float,4) -> vector(float,4)) - -local sqrt3 = terralib.intrinsic(function(types) - if #types == 1 and types[1]:isvector() and types[1].type == float then - local N = types[1].N - return ("llvm.sqrt.v%df32"):format(N), vector(float,N) -> vector(float,N) - elseif #types == 1 and types[1] == float then - return "llvm.sqrt.f32",float -> float - end -end) - -terra foo() - var v = vector(1.f,2.f,3.f,4.f) - var c = sqrt2(vector(1,2,3,4)) - return sqrt(4) + c[3] + sqrt3(v)[3] + sqrt3(4.f) -end - -local test = require("test") - -test.eq(foo(),8) \ No newline at end of file diff --git a/samples/Terra/isvolatile.t b/samples/Terra/isvolatile.t deleted file mode 100644 index f293fb96..00000000 --- a/samples/Terra/isvolatile.t +++ /dev/null @@ -1,7 +0,0 @@ - - -terra foobar(a : &vector(float,4),b : vector(int,4)) - terralib.attrstore(a,b,{ isvolatile = true }) -end - -foobar:disas() diff --git a/samples/Terra/labelbug.t b/samples/Terra/labelbug.t deleted file mode 100644 index 4d996e4f..00000000 --- a/samples/Terra/labelbug.t +++ /dev/null @@ -1,5 +0,0 @@ - -terra foo() - ::alabel:: ;; - return 0 -end \ No newline at end of file diff --git a/samples/Terra/latelink.t b/samples/Terra/latelink.t deleted file mode 100644 index 43a64765..00000000 --- a/samples/Terra/latelink.t +++ /dev/null @@ -1,24 +0,0 @@ -C = terralib.includecstring [[ - typedef struct { - int a; - } S; - typedef struct { - S a; - } A; -]] -C2 = terralib.includecstring [[ - typedef struct { - int a; - } S; - typedef struct { - S a; - } B; -]] - -terra second() - var a : C2.B - var b : C.A - - a.a = b.a -end -second:disas() \ No newline at end of file diff --git a/samples/Terra/lazycstring.t b/samples/Terra/lazycstring.t deleted file mode 100644 index 3b3270a1..00000000 --- a/samples/Terra/lazycstring.t +++ /dev/null @@ -1,21 +0,0 @@ - -struct A { - a : int -} - - -print(A:cstring()) - -terra foo() - return A { 1 } -end - -struct B { - a : int -} - -terra foo2() - return B { 1 } -end - -assert(foo().a == foo2().a) \ No newline at end of file diff --git a/samples/Terra/lazylog.t b/samples/Terra/lazylog.t deleted file mode 100644 index 84bba0fa..00000000 --- a/samples/Terra/lazylog.t +++ /dev/null @@ -1,61 +0,0 @@ -local function gentrees(depth) - local function treetostring(tree) - if type(tree) == "string" then return tree - elseif tree.rhs then return "(" .. treetostring(tree.lhs) .. " " .. tree.op .. " " .. treetostring(tree.rhs) .. ")" - else return "(" .. tree.op .. " " .. treetostring(tree.lhs) .. ")" end - end - local function gendepth(depth) - local trees = {} - table.insert(trees, "%s") - if depth == 0 then return trees end - local subtrees = gendepth(depth - 1) - for _,t0 in ipairs(subtrees) do - table.insert(trees, { lhs = t0, op = "not" }) - for _,t1 in ipairs(subtrees) do - table.insert(trees, { lhs = t0, rhs = t1, op = "and" }) - table.insert(trees, { lhs = t0, rhs = t1, op = "or" }) - end - end - return trees - end - local trees = gendepth(depth) - local nargs = 2 ^ depth - local argassign = "local i0" - local targs = "return terra(i0 : bool" - local args = {"i0"} - for i = 1, nargs - 1 do - local arg = "i"..tostring(i) - table.insert(args,arg) - argassign = argassign .. ", " .. arg - targs = targs .. ", " .. arg .. " : bool" - end - argassign = argassign .. " = ..." - targs = targs .. ")" - - argassign = argassign .. "\nreturn " - targs = targs .. "\nreturn " - for treeno,t in ipairs(trees) do - local line = string.format(treetostring(t),unpack(args)) - io.write(string.format("\r%3d%% %s",treeno/#trees * 100,line)) - local lcode = argassign .. line - local tcode = targs .. line .. " end" - local lfn = assert(loadstring(lcode)) - local tfn = assert(terralib.loadstring(tcode))() - tfn:compile() - local states = 2 ^ nargs - local actuals = {} - local band = bit.band - local blshift = bit.lshift - for i = 0, states - 1 do - for s = 1, nargs do - actuals[s] = 0 ~= band(i,blshift(1,s-1)) - end - local result = lfn(unpack(actuals)) - local result2 = tfn(unpack(actuals)) - assert(result == result2) - end - end - io.write("\n") -end - -gentrees(2) \ No newline at end of file diff --git a/samples/Terra/leaktest.t b/samples/Terra/leaktest.t deleted file mode 100644 index d49ff6bb..00000000 --- a/samples/Terra/leaktest.t +++ /dev/null @@ -1,27 +0,0 @@ -local leak = require "lib.leak" - -function make() - local terra a(x:int) - return x+1 - end - - local terra b(x:int) - return a(x) - end - - return b(12),leak.track(b) -end -nan = 0/0 -res,t=make() -assert(res == 13) -local gcd, path = leak.find(t) -if gcd then - print(path) - assert(false) -end - -l = leak.track(leak) -foo = 0/0 -local f,p = leak.find(l) -assert(f) -assert(p == "$locals.leak") \ No newline at end of file diff --git a/samples/Terra/let1.t b/samples/Terra/let1.t deleted file mode 100644 index 2363cc7f..00000000 --- a/samples/Terra/let1.t +++ /dev/null @@ -1,15 +0,0 @@ - - -terra foo() - return (1),(2) -end - -terra bar() - var c = [quote var a = 3 in a end] - var d = 5 - c = c + 10 - return [quote var a = 3 in [quote var b = 4 in a + b + c + d end] end] -end -local test = require("test") -test.meq({1,2},foo()) -assert(25 == bar()) diff --git a/samples/Terra/let2.t b/samples/Terra/let2.t deleted file mode 100644 index 273984a2..00000000 --- a/samples/Terra/let2.t +++ /dev/null @@ -1,64 +0,0 @@ - - -local a = -quote - var b = 1 -in - b + 0, b + 1 -end - -terra f0() - return (a) -end -terra f1() - return a -end -terra f2() - a -end -local test = require("test") -test.meq({1,2},f0()) -test.meq({1,2},f1()) - -local c = symbol() -local b = -quote - var [c] = 3 -in - c,c+1 -end - -terra f3() - b - return ([c]) -end -assert(f3() == 3) - -a = global(1) -local emptyexp = quote - a = a + 1 -end - -local emptystmts = {4,3} - -local both = quote -in 4,[quote a = a + 1 in 3 end] -end - -terra bar(a : int, b : int) - return a + b -end -terra bar2(a : int, b : int, c : {}) - return a + b -end -terra f4() - return bar(emptystmts) + bar2(1,2,emptyexp) + a -end - -assert(f4() == 12) - -terra f5() - return bar(both._0,both._0) + a -end - -assert(f5() == 12) \ No newline at end of file diff --git a/samples/Terra/linkllvm.t b/samples/Terra/linkllvm.t deleted file mode 100644 index 852f503f..00000000 --- a/samples/Terra/linkllvm.t +++ /dev/null @@ -1,13 +0,0 @@ - - -terra add(a : int, b : int) - return a + b -end - - -terralib.saveobj("add.bc",{ add = add }) - -local addlib = terralib.linkllvm("add.bc") -add2 = addlib:extern("add", {int,int} -> int) - -assert(add2(3,4) == 7) \ No newline at end of file diff --git a/samples/Terra/localenv.t b/samples/Terra/localenv.t deleted file mode 100644 index da37d91a..00000000 --- a/samples/Terra/localenv.t +++ /dev/null @@ -1,46 +0,0 @@ - -local a = 4 -b = 3 -local terra foo() - return a + b -end -local terra bar() - return foo() -end -local test = require("test") - -test.eq(foo(),7) -test.eq(bar(),7) - -terra nested() - return [ (function(a) return a + b end)(8) ] -end -terra nested2() - return [ a + b ] -end -local c = {} -local d = {} -local vv = {} -local b = 3 -local e = 8 -g = 1 -local dd = 8 - aa = global(10) -terra nested3() - var luav = 8 - return [ (function() - local b = 5 - function c.b() return 7 end - local f = 7 - vv.bb = global(aa:get()) - terra d.c() return e + f + g + vv.bb + [ `dd ] end - return b + a - end)() ] -end - -test.eq(nested(),11) - -test.eq(nested2(),7) -test.eq(nested3(),9) -test.eq(c.b(),7) -test.eq(d.c(),34) \ No newline at end of file diff --git a/samples/Terra/localenv2.t b/samples/Terra/localenv2.t deleted file mode 100644 index 355602ba..00000000 --- a/samples/Terra/localenv2.t +++ /dev/null @@ -1,7 +0,0 @@ - -local dd = 8 -terra nested3() - return [ `dd ] -end -local test = require("test") -test.eq(nested3(),8) \ No newline at end of file diff --git a/samples/Terra/logical.t b/samples/Terra/logical.t deleted file mode 100644 index 7e4f7523..00000000 --- a/samples/Terra/logical.t +++ /dev/null @@ -1,33 +0,0 @@ - - -local T = true -local F = false - -terra check() - var a = true - return not true == false -end - -assert(check() == true) - -terra check2() - return not T == F -end - -assert(check2() == true) - -terra check3() - return not T == not not T -end - -assert(check3() == false) - -terra check4() - return not not T == T and not not F == F and true == T and false == F -end - -assert(check4() == true) - -terra foo() return not false end - -assert(foo() == true) \ No newline at end of file diff --git a/samples/Terra/luabridge.t b/samples/Terra/luabridge.t deleted file mode 100644 index d7fcb285..00000000 --- a/samples/Terra/luabridge.t +++ /dev/null @@ -1,18 +0,0 @@ -struct A { a : int, b : double } - -terra foo(a : A) - return a.a + a.b -end - - -terra foo2(a : A) - return a.a + a.b,a.a -end - -local test = require("test") - -test.eq( foo( {a = 1,b = 2.3} ), 3.3 ) -test.eq( foo( {1,2.3} ), 3.3 ) -test.eq( foo( {b = 1, a = 2.3} ),3 ) - -test.meq({3.3,1},foo2( { a = 1, b = 2.3} )) \ No newline at end of file diff --git a/samples/Terra/luabridge2.t b/samples/Terra/luabridge2.t deleted file mode 100644 index f4d86412..00000000 --- a/samples/Terra/luabridge2.t +++ /dev/null @@ -1,92 +0,0 @@ -struct A { a : int, b : double } - -terra returnstruct() - var a = A { 1, 2.5} - return a -end -terra returnstruct2() - var a = A { 1, 2.5} - var b = A { 2, 3.5} - return a,b -end - -terra returnarray() - var a : int[4] = array(1,2,3,4) - return a -end -terra returnarray2() - var a : int[4] = array(1,2,3,4) - var b : int[4] = array(5,6,7,8) - return a,b -end - -terra returnaos() - var a : A[2] = arrayof(A, {1,2.5}, {2,3.5} ) - return a -end -struct B { a : int[4] } -terra returnsoa() - var a = B { array(1,2,3,4) } - return a -end - -global_a = global(A) -global_a:set( {3, 4.5}) - -terra retstructptr() - return &global_a -end -terra structptr(a : &A) - return a.a + a.b -end - -global_arr = global(int[2]) -global_arr:set({3,4}) - -terra retarrptr() - return &global_arr -end -terra arrptr(a : &int[2]) - return (@a)[0] + a[0][1] -end - -local test = require("test") -local a0 = returnstruct() -test.eq(a0.a,1) -test.eq(a0.b,2.5) -local a1,b1 = terralib.unpackstruct(returnstruct2()) -test.eq(a1.a,1) -test.eq(a1.b,2.5) -test.eq(b1.a,2) -test.eq(b1.b,3.5) ---[[ C doesn't actually allow you to return arrays directly -local arr = returnarray() -test.eq(arr[0],1) -test.eq(arr[1],2) -test.eq(arr[2],3) -test.eq(arr[3],4) -local arr2,arr3 = returnarray2() -test.eq(arr2[0],1) -test.eq(arr2[1],2) -test.eq(arr2[2],3) -test.eq(arr2[3],4) -test.eq(arr3[0],5) -test.eq(arr3[1],6) -test.eq(arr3[2],7) -test.eq(arr3[3],8) -local arr4 = returnaos() -test.eq(arr4[0].a,1) -test.eq(arr4[1].b,3.5) -]] - -local arr5 = returnsoa() -test.eq(arr5.a[0],1) -test.eq(arr5.a[3],4) -local ptrret = retstructptr() -test.eq(ptrret[0].a,3) -test.eq(ptrret[0].b,4.5) -test.eq(structptr(ptrret),7.5) -local ptrarr = retarrptr() -test.eq(ptrarr[0][0],3) -test.eq(ptrarr[0][1],4) -test.eq(arrptr(ptrarr),7) \ No newline at end of file diff --git a/samples/Terra/luabridgefn.t b/samples/Terra/luabridgefn.t deleted file mode 100644 index 488e4f9e..00000000 --- a/samples/Terra/luabridgefn.t +++ /dev/null @@ -1,23 +0,0 @@ - -terra plus1(a : int) - return a + int(1) -end - -terra afn() : int -> int - return plus1 -end - -terra doit(a : int, b : int -> int) - return b(a) -end - -local test = require("test") - -local foobar = afn() -test.eq(foobar(3),4) -test.eq(doit(4,foobar),5) -local function whatwhat(a) - print("I GOT A ", a) - return a + 3 -end -test.eq(doit(5,whatwhat),8) diff --git a/samples/Terra/luabridgerec.t b/samples/Terra/luabridgerec.t deleted file mode 100644 index b5a5ad23..00000000 --- a/samples/Terra/luabridgerec.t +++ /dev/null @@ -1,10 +0,0 @@ - -struct A { a : &A, b : int } - -terra foo(a : A) - return a.b -end - -local test = require("test") - -test.eq(foo({b = 5}),5) diff --git a/samples/Terra/luabridgeunion.t b/samples/Terra/luabridgeunion.t deleted file mode 100644 index 8866866f..00000000 --- a/samples/Terra/luabridgeunion.t +++ /dev/null @@ -1,14 +0,0 @@ -struct A { union {a : int, b : double}, c : int } - -terra foo(a : A) - return a.a + a.c -end -terra foo2(a : A) - return a.b + a.c -end - - -local test = require("test") - -test.eq( foo({a = 4, c = 6}), 10) -test.eq( foo2({b = 4.4, c = 6}), 10.4) \ No newline at end of file diff --git a/samples/Terra/luaterramethod.t b/samples/Terra/luaterramethod.t deleted file mode 100644 index 8cad2f52..00000000 --- a/samples/Terra/luaterramethod.t +++ /dev/null @@ -1,40 +0,0 @@ - - -struct Foo { - a : int; - b : int; -} - -terra Foo:bar() - self.a = self.a + 1 - return self.a + self.b -end - -Foo.methods.baz = function(self) print(self.a,self.b) end -Foo.methods.mac = macro(function() return `1 end) - -terra usemethod() - var a = Foo { 3, 4} - a:baz() - return a:bar() -end -assert(8 == usemethod()) - -obj = terralib.new(Foo[1], {{3,4}}) - -assert(8 == obj[0]:bar()) -assert(9 == obj[0]:bar()) -obj[0]:baz() - -local a,b = pcall(function() -obj[0]:mac() -end) -assert(not a) -assert(string.match(b,"not supported")) - -local a,b = pcall(function() -obj[0]:maz() -end) - -assert(not a) -assert(string.match(b,"attempt to call method")) \ No newline at end of file diff --git a/samples/Terra/lvaluepointer.t b/samples/Terra/lvaluepointer.t deleted file mode 100644 index 1e3855ba..00000000 --- a/samples/Terra/lvaluepointer.t +++ /dev/null @@ -1,10 +0,0 @@ - - -terra foo() - var a : int = 5 - var pa = &a - @pa = 4 - @[&float](pa) = 5 -end - -foo() \ No newline at end of file diff --git a/samples/Terra/lvaluequote.t b/samples/Terra/lvaluequote.t deleted file mode 100644 index 56f4536e..00000000 --- a/samples/Terra/lvaluequote.t +++ /dev/null @@ -1,22 +0,0 @@ - - -checkl = macro(function(a) - assert(a:islvalue()) - return a -end) - -checkr = macro(function(a) - assert(not a:islvalue()) - return a -end) - - -terra testit() - - var a = checkr(4) - var b = checkr(checkl(a) + 3) - var c = checkl([quote var d = 5 in d end]) - return a + b + c -end - -assert(4+7+5 == testit()) diff --git a/samples/Terra/lvaluetreelist.t b/samples/Terra/lvaluetreelist.t deleted file mode 100644 index cfc01a57..00000000 --- a/samples/Terra/lvaluetreelist.t +++ /dev/null @@ -1,9 +0,0 @@ - - -terra foobar() - var a = 4 - @&[quote in a end] = 5 - return a -end - -assert(foobar() == 5) \ No newline at end of file diff --git a/samples/Terra/macro.t b/samples/Terra/macro.t deleted file mode 100644 index 3c8afcf5..00000000 --- a/samples/Terra/macro.t +++ /dev/null @@ -1,50 +0,0 @@ - -local bar = terralib.internalmacro(function(ctx,tree,typ) - return terralib.newtree(typ.tree, { kind = terralib.kinds.literal, type = double, value = 4.0 }) - -end) - -local bar2 = macro(function(typ) - return typ - -end) - - -local bar3 = macro(function(a,b) - return {a.tree,b.tree} -end) - -terra up(v : &int) - @v = @v + 1 -end - -local bar4 = macro(function() - local terra myfn() - return 42 - end - return myfn -end) - -moo = global(int,3) - -local bar4 = macro(function() - local terra myfn() - return 42 - end - return myfn -end) - -local bar5 = macro(function() - return moo -end) - -terra foo() : int - var a : int = bar(int,int16,int32) - bar2(a) = bar2(a) + 5 - bar3(up(&a),up(&a)) - bar5() = bar5() + 1 - return a + bar4()() + moo -end - -local test = require("test") -test.eq(57,foo()) diff --git a/samples/Terra/macro2.t b/samples/Terra/macro2.t deleted file mode 100644 index c910bb14..00000000 --- a/samples/Terra/macro2.t +++ /dev/null @@ -1,14 +0,0 @@ - -local bar2 = macro(function(typ) - return typ - -end) - -terra foo() : int - var a = 3 - bar2(a) = bar2(a) + 5 - return a -end - -local test = require("test") -test.eq(8,foo()) diff --git a/samples/Terra/macro3.t b/samples/Terra/macro3.t deleted file mode 100644 index 9b1015c8..00000000 --- a/samples/Terra/macro3.t +++ /dev/null @@ -1,14 +0,0 @@ - - -foo = macro(function() - local terra bar() - return 3 - end - return bar -end) - -terra baz() - return foo()() -end - -assert(baz() == 3) \ No newline at end of file diff --git a/samples/Terra/macrokey.t b/samples/Terra/macrokey.t deleted file mode 100644 index 329b92aa..00000000 --- a/samples/Terra/macrokey.t +++ /dev/null @@ -1,9 +0,0 @@ - -what = function() return "abcd" end - -terra foo() - var a = { [what()] = 4 } - return a.abcd -end -local test = require("test") -test.eq(foo(),4) \ No newline at end of file diff --git a/samples/Terra/macrolet.t b/samples/Terra/macrolet.t deleted file mode 100644 index f6343823..00000000 --- a/samples/Terra/macrolet.t +++ /dev/null @@ -1,17 +0,0 @@ - - -twice = macro(function(a) - return quote - var v = a - in - v + v - end -end) - - -terra foobar() - var what = 1 - return twice([quote what = what + 1 in what end]) + what -end - -assert(6 == foobar()) \ No newline at end of file diff --git a/samples/Terra/macroselect.t b/samples/Terra/macroselect.t deleted file mode 100644 index 31c18f6c..00000000 --- a/samples/Terra/macroselect.t +++ /dev/null @@ -1,11 +0,0 @@ - -struct A { a : int, b : int } - -local c = "b" -terra foo() - var a = A {1,2} - return a.[c] -end - -local test = require("test") -test.eq(foo(),2) \ No newline at end of file diff --git a/samples/Terra/macrotest.t b/samples/Terra/macrotest.t deleted file mode 100644 index 707e6b6e..00000000 --- a/samples/Terra/macrotest.t +++ /dev/null @@ -1,9 +0,0 @@ -C = terralib.includecstring [[ -#define foo 1 -#define foo2 -3.4 -#undef foo -#define foo 3 -]] - -assert(C.foo == 3) -assert(C.foo2 == -3.4) \ No newline at end of file diff --git a/samples/Terra/malloc.t b/samples/Terra/malloc.t deleted file mode 100644 index 6672bfdd..00000000 --- a/samples/Terra/malloc.t +++ /dev/null @@ -1,23 +0,0 @@ -local c = terralib.includecstring [[ - #include - #include -]] - -local N = 10 -terra foo() - c.printf("size = %d\n",int(sizeof(int))) - var list = [&int](c.malloc(sizeof(int)*N)) - for i = 0,N do - list[i] = i + 1 - end - var result = 0 - for i = 0,N do - c.printf("%d = %d\n",int(i),list[i]) - result = result + list[i] - end - c.free([&uint8](list)) - return result -end - -local test = require("test") -test.eq(foo(),N*(1 + N)/2) diff --git a/samples/Terra/mathlib.t b/samples/Terra/mathlib.t deleted file mode 100644 index 26af6cc8..00000000 --- a/samples/Terra/mathlib.t +++ /dev/null @@ -1,9 +0,0 @@ -local c = terralib.includec("math.h") - -terra mysqrt(a : float) - return c.sqrtf(a) -end - -local test = require("test") -test.eq(mysqrt(4),2) -test.eq(mysqrt(9),3) \ No newline at end of file diff --git a/samples/Terra/metatype.t b/samples/Terra/metatype.t deleted file mode 100644 index bd8cdd64..00000000 --- a/samples/Terra/metatype.t +++ /dev/null @@ -1,16 +0,0 @@ -local function foo(T) - terra T:what() - return self.a + self.b - end -end -struct A(foo) { - a : int; - b : int; -} - -terra test() - var a = A {1,2} - return a:what() -end - -assert(test() == 3) \ No newline at end of file diff --git a/samples/Terra/method.t b/samples/Terra/method.t deleted file mode 100644 index 7e38fa45..00000000 --- a/samples/Terra/method.t +++ /dev/null @@ -1,42 +0,0 @@ ---the zero line -struct A { b : B } and -struct B {a : int, b : int} - -B.methods.foo = terra(b : B) - return b.a -end -terra bar() - var b = B { 1,2 } - return b:foo() -end - - -B.methods.foo2 = terra(b : &B) - b.a = 6 -end - -terra bar2() - var b = B { 1,2 } - b:foo2() - return b.a -end - -B.methods.foo3 = terra(b : B) - return b.a -end - -terra bar3() - var b = B { 1,2 } - return (&b):foo3() -end -terra bar4() - var b = B { 1,2 } - (&b):foo2() - return b.a -end - -test = require("test") -test.eq(bar(),1) -test.eq(bar2(),6) -test.eq(bar3(),1) -test.eq(bar4(),6) \ No newline at end of file diff --git a/samples/Terra/methodantiquote.t b/samples/Terra/methodantiquote.t deleted file mode 100644 index 6fbb79ad..00000000 --- a/samples/Terra/methodantiquote.t +++ /dev/null @@ -1,18 +0,0 @@ ---the zero line -M = {} -struct M.B {a : int, b : int} - -terra M.B:foo(a : int) - return self.a + a -end - - -local avar = "foo" - -terra bar() - var b = M.B { 1,2 } - return b:[avar](3) -end - -test = require("test") -test.eq(bar(),4) diff --git a/samples/Terra/methodmissing.t b/samples/Terra/methodmissing.t deleted file mode 100644 index b60cd5cf..00000000 --- a/samples/Terra/methodmissing.t +++ /dev/null @@ -1,17 +0,0 @@ - - -struct A { - a : int -} - -A.metamethods.__methodmissing = macro(function(methodname,obj,anarg) - print(methodname) - return `anarg + [string.byte(methodname,1,1)] -end) - -terra foobar() - var a : A - return a:a(3) + a:b(4) -end - -assert(foobar() == 202) \ No newline at end of file diff --git a/samples/Terra/methodrvalue.t b/samples/Terra/methodrvalue.t deleted file mode 100644 index 13513b98..00000000 --- a/samples/Terra/methodrvalue.t +++ /dev/null @@ -1,18 +0,0 @@ ---the zero line -M = {} -struct M.B {a : int, b : int} - -terra M.B:foo(a : int) - return self.a + a -end - -terra rify() - var a = M.B { 1,2} - return a -end -terra bar() - return (rify()):foo(3) -end - -test = require("test") -test.eq(bar(),4) diff --git a/samples/Terra/methodsugar.t b/samples/Terra/methodsugar.t deleted file mode 100644 index 473f9521..00000000 --- a/samples/Terra/methodsugar.t +++ /dev/null @@ -1,15 +0,0 @@ ---the zero line -M = {} -struct M.B {a : int, b : int} - -terra M.B:foo(a : int) - return self.a + a -end - -terra bar() - var b = M.B { 1,2 } - return b:foo(3) -end - -test = require("test") -test.eq(bar(),4) diff --git a/samples/Terra/missingfields.t b/samples/Terra/missingfields.t deleted file mode 100644 index acd09f2d..00000000 --- a/samples/Terra/missingfields.t +++ /dev/null @@ -1,14 +0,0 @@ -test = terralib.includecstring([[ - typedef struct {} emptyanon; - typedef struct foo foobar; - void test(struct foo * f); - struct foo { int x; }; - union ufoo; - typedef union { int a; int b; } anonunion; -]]) -terra main() - var s : test.foo - s.x = 1 -end - -main() \ No newline at end of file diff --git a/samples/Terra/mixed.t b/samples/Terra/mixed.t deleted file mode 100644 index 267bf814..00000000 --- a/samples/Terra/mixed.t +++ /dev/null @@ -1,13 +0,0 @@ -a = terra() return 4 end -local d = {} -do - struct A{} - and local terra a() return 5 end - and terra d.d(a : B) end - and terra B:a() end - and struct B {} - and terra c() end - and struct C {} - assert(a() == 5) -end -assert(a() == 4) \ No newline at end of file diff --git a/samples/Terra/multiconstructor.t b/samples/Terra/multiconstructor.t deleted file mode 100644 index b9bdd6d1..00000000 --- a/samples/Terra/multiconstructor.t +++ /dev/null @@ -1,17 +0,0 @@ - -terra foo() : {double, double} - return 1.0,3.0 -end - -struct A {c : int, a : int, b : double } - -terra bar() - var r = foo() - var a = A {1,unpackstruct(r)} - var b = A {1,2,(foo())._0} - var c = A {c = 1,a = 2,b = foo()._0} - return a.c + a.a + a.b + b.c + c.c -end - -local test = require("test") -test.eq(7,bar()) \ No newline at end of file diff --git a/samples/Terra/multimacro.t b/samples/Terra/multimacro.t deleted file mode 100644 index b0d72374..00000000 --- a/samples/Terra/multimacro.t +++ /dev/null @@ -1,17 +0,0 @@ - -local bar = terralib.internalmacro(function(ctx,tree,typ,x) - return {terralib.newtree(typ.tree, { kind = terralib.kinds.literal, type = double, value = 4.0 }), x } -end) - -local x,y,z = 1,2,3 - -terra foo() : int - var a,b = bar(int,x + y + z) - var c = bar(int,0)._0 + 1 - --bar2(int) = bar2(int) + 5 - --bar3(up(&a),up(&a)) - return a + b + c -end - -local test = require("test") -test.eq(15,foo()) diff --git a/samples/Terra/multiterra.t b/samples/Terra/multiterra.t deleted file mode 100644 index 28a97b42..00000000 --- a/samples/Terra/multiterra.t +++ /dev/null @@ -1,79 +0,0 @@ -local ffi = require("ffi") - -C = terralib.includecstring [[ -#ifndef _WIN32 -#include -#endif -#include -typedef struct lua_State lua_State; -lua_State * luaL_newstate(); -int terra_init(lua_State * L); -int luaL_openlibs(lua_State * L); -int luaL_loadstring(lua_State * L, const char *); -int lua_close(lua_State * L); -void lua_call(lua_State * L, int,int); -int lua_pushnumber(lua_State * L, double); -int terra_loadstring(lua_State *L, const char *s); -double luaL_checknumber(lua_State * L,int); -]] - -if ffi.os == "Windows" then - -- fake it on windows - C.pthread_t = int - C.pthread_create = terra(t : &int, stuff : &opaque,fn : &opaque -> &opaque, data : &opaque) - return fn(data) - end - C.pthread_join = terra(t : int, stuff : &opaque) - end -end - - -N = 4 - -local acc = global(int[N]) - -terra forkedFn(args : &opaque) : &opaque - var threadid = @[&int](args) - C.printf("threadid %d\n",threadid) - - var L = C.luaL_newstate(); - if L == nil then - C.printf("can't initialize luajit\n") - end - - C.luaL_openlibs(L) - C.terra_init(L) - - C.terra_loadstring(L, [[ a = ...; C = terralib.includec("stdio.h"); terra foo () C.printf("new terra %d\n",a) return a end; return foo() ]]) - C.lua_pushnumber(L,threadid) - C.lua_call(L,1,1) - acc[threadid] = C.luaL_checknumber(L,-1) - C.lua_close(L) - - return nil -end - -terra foo() - var thread : C.pthread_t[N] - for i = 0,N do - acc[i] = -1 - end - - var args : int[N] - for i = 0,N do - args[i] = i - C.pthread_create(&thread[i],nil,forkedFn,&args[i]) - end - - for i = 0,N do - C.pthread_join(thread[i],nil) - end - var sum = 0 - for i = 0,N do - sum = sum + acc[i] - end - return sum -end - -print(foo()) -assert(foo() == N * (N - 1) / 2) \ No newline at end of file diff --git a/samples/Terra/names.t b/samples/Terra/names.t deleted file mode 100644 index 3bfd6187..00000000 --- a/samples/Terra/names.t +++ /dev/null @@ -1,16 +0,0 @@ -struct A { -} - -local B = (function() - local struct A {} - return A -end)() -C = terralib.types.newstruct("A$1") -D = terralib.types.newstruct("A$1") - -local names = {} -for i,t in ipairs {A,B,C,D} do - local n = tostring(t) - assert(not names[n]) - names[n] = true -end \ No newline at end of file diff --git a/samples/Terra/nestedcalls.t b/samples/Terra/nestedcalls.t deleted file mode 100644 index d9410798..00000000 --- a/samples/Terra/nestedcalls.t +++ /dev/null @@ -1,11 +0,0 @@ - -terra foo3(a : &int) : &int - return a -end - -terra bar2(a : int) - return @(foo3(&a)) -end - -local test = require("test") -test.eq(bar2(42),42) \ No newline at end of file diff --git a/samples/Terra/nestextract.t b/samples/Terra/nestextract.t deleted file mode 100644 index 13a15db3..00000000 --- a/samples/Terra/nestextract.t +++ /dev/null @@ -1,40 +0,0 @@ - - -struct A { - a : int -} - -count = global(int,0) - -terra twoAs(a : int) - return A {a}, A { a } -end - -function A.metamethods.__cast(fromt,tot,exp) - if tot == A and fromt == int then - return `twoAs(exp)._0 - end - error("what") -end - -terra twoInts() - count = count + 1 - return count,2 -end - -terra takesAnA(a : A) - return a.a -end - -dotwice = macro(function(exp) - return {exp,exp} -end) - -terra doit() - return dotwice(takesAnA((twoInts()._0))) -end - - -doit:printpretty() -local test = require("test") -test.meq({1,2},doit()) diff --git a/samples/Terra/nestnoerror.t b/samples/Terra/nestnoerror.t deleted file mode 100644 index c0a41500..00000000 --- a/samples/Terra/nestnoerror.t +++ /dev/null @@ -1,17 +0,0 @@ - - -terra haserror() - return (1):foo() -end - -local m = macro(function() - local success = pcall(function() haserror:compile() end) - assert(not success) - return 1 -end) - -terra noerror() - return m() -end - -assert(1 == noerror()) \ No newline at end of file diff --git a/samples/Terra/new.t b/samples/Terra/new.t deleted file mode 100644 index 0029c19d..00000000 --- a/samples/Terra/new.t +++ /dev/null @@ -1,14 +0,0 @@ -local c = terralib.includec("stdlib.h") - -new = macro(function(typquote) - local typ = typquote:astype() - return `[&typ](c.malloc(sizeof(typ))) -end) - -local typ = int -terra doit() - var a : &int = new(int) - return a -end - -doit() \ No newline at end of file diff --git a/samples/Terra/nillocal.t b/samples/Terra/nillocal.t deleted file mode 100644 index 93c415c0..00000000 --- a/samples/Terra/nillocal.t +++ /dev/null @@ -1,6 +0,0 @@ - -a = 4 -local a = nil - -terra foo() return [assert(not a)] end -assert(foo() == true) \ No newline at end of file diff --git a/samples/Terra/niltype.t b/samples/Terra/niltype.t deleted file mode 100644 index b8b0000d..00000000 --- a/samples/Terra/niltype.t +++ /dev/null @@ -1,9 +0,0 @@ - -terra foo() - var a : &int = nil - var b = nil - return a == b -end - -local test = require("test") -test.eq(foo(),true) \ No newline at end of file diff --git a/samples/Terra/nojit.t b/samples/Terra/nojit.t deleted file mode 100644 index 46b66331..00000000 --- a/samples/Terra/nojit.t +++ /dev/null @@ -1,20 +0,0 @@ - - ---var a = 4 + 5 -a = global(4 + 5) -terra foo() - return a -end - - -foo:gettype() ---we currently don't track what initializers need to be run after a nojit compile ---hopefully we can just remove the need to have nojit entirely ---otherwise we need to seperate the calling of variable initializers from the compilation process ---so that they can be called when jit is invoked -a:gettype() - -local test = require("test") -test.eq(foo(),9) - - diff --git a/samples/Terra/nolengthop.t b/samples/Terra/nolengthop.t deleted file mode 100644 index ceac4581..00000000 --- a/samples/Terra/nolengthop.t +++ /dev/null @@ -1,2 +0,0 @@ -local a,b = terralib.loadstring([[terra g() return #a]]) -assert(b:find("operator not supported")) \ No newline at end of file diff --git a/samples/Terra/nonprototypec.t b/samples/Terra/nonprototypec.t deleted file mode 100644 index 36256bb6..00000000 --- a/samples/Terra/nonprototypec.t +++ /dev/null @@ -1,12 +0,0 @@ -C = terralib.includecstring [[ - int foobar() { - return 3; - } -]] - - -terra doit() - return C.foobar() -end - -print(doit()) \ No newline at end of file diff --git a/samples/Terra/nontemporal.t b/samples/Terra/nontemporal.t deleted file mode 100644 index 2e634783..00000000 --- a/samples/Terra/nontemporal.t +++ /dev/null @@ -1,7 +0,0 @@ - - -terra foobar(a : &vector(float,4),b : vector(int,4)) - terralib.attrstore(a,b,{ nontemporal = true }) -end - -foobar:disas() diff --git a/samples/Terra/numliteral.t b/samples/Terra/numliteral.t deleted file mode 100644 index 9d5183ec..00000000 --- a/samples/Terra/numliteral.t +++ /dev/null @@ -1,14 +0,0 @@ - -terra thetest() - var a,b,c,d,e = 3,3.0,3.f,3LL, 3ULL - return a,b,c,d,e -end - -local exp = { "int32", "double", "float", "int64", "uint64" } - -local test = require("test") -thetest:compile() -local typ = thetest.definitions[1]:gettype() -for i,e in ipairs(typ.returntype:getentries()) do - test.eq(tostring(e.type),exp[i]) -end \ No newline at end of file diff --git a/samples/Terra/objc.t b/samples/Terra/objc.t deleted file mode 100644 index 134f5a48..00000000 --- a/samples/Terra/objc.t +++ /dev/null @@ -1,25 +0,0 @@ -local f = assert(io.popen("uname", 'r')) -local s = assert(f:read('*a')) -f:close() - -if s~="Darwin\n" then - print("Warning, not running test b/c this isn't a mac") -else - -local OC = require("lib/objc") - -terra main() - OC.NSAutoreleasePool:new() - var str = OC.NSString:stringWithUTF8String("the number of hacks is overwhelming...") - var err = OC.NSError:errorWithDomain_code_userInfo(str,12,nil) - var alert = OC.NSAlert:alertWithError(err) - - var imgname = OC.NSString:stringWithUTF8String("foo.png") - var img = OC.NSImage:alloc():initByReferencingFile(imgname) - alert:setIcon(img) - alert:runModal() -end - -terralib.saveobj("objc",{main = main}, { "-framework", "Foundation", "-framework", "Cocoa" }) - -end \ No newline at end of file diff --git a/samples/Terra/objc2.t b/samples/Terra/objc2.t deleted file mode 100644 index d92e1bde..00000000 --- a/samples/Terra/objc2.t +++ /dev/null @@ -1,42 +0,0 @@ -local f = assert(io.popen("uname", 'r')) -local s = assert(f:read('*a')) -f:close() - -if s~="Darwin\n" then - print("Warning, not running test b/c this isn't a mac") -else - - -local OC = require("lib/objc") -local IO = terralib.includec("stdio.h") - -struct Rect { - a : double, - b : double, - c : double, - d : double -} - -terra str(data : &uint8) - return OC.NSString:stringWithUTF8String(data) -end - -terra main() - OC.NSAutoreleasePool:new() - var app = OC.NSApplication:sharedApplication() - var rec = Rect {0,0,200,200} - var window = OC.NSWindow:alloc():initWithContentRect_styleMask_backing_defer(rec,1,2,false) - window:makeKeyAndOrderFront(nil) - --[[var img = OC.NSImage:alloc():initByReferencingFile(str("objc2.jpg")) - var imgView = OC.NSImageView:alloc():initWithFrame(rec) - imgView:setImage(img) - window:setContentView(imgView) - IO.printf("entering run loop\n")--]] - app:run() -end - -terralib.saveobj("objc2", {main = main}, {"-framework","Cocoa"}) - ---os.execute("./objc2") - -end \ No newline at end of file diff --git a/samples/Terra/objtest.t b/samples/Terra/objtest.t deleted file mode 100644 index f429f0fe..00000000 --- a/samples/Terra/objtest.t +++ /dev/null @@ -1,45 +0,0 @@ -C = terralib.includec("stdio.h") ---the zero line -struct A { a : int } - -terra A:foo1() - self.a = self.a + 1 - return self.a -end - -terra A.methods.foo2(self : &A) - self.a = self.a + 1 - return self.a -end - -terra A.methods.foo3(self : A) - self.a = self.a + 1 - return self.a -end - -terra bar() - var a = A { 0 } - var ptra = &a - - var v0 = a.a - var v1 = a:foo1() - var v2 = a.a - var v3 = a:foo2() - var v4 = a.a - var v5 = a:foo3() - var v6 = a.a - - ptra.a = 0 - var p0 = ptra.a - var p1 = ptra:foo1() - var p2 = ptra.a - var p3 = ptra:foo2() - var p4 = ptra.a - var p5 = ptra:foo3() - var p6 = ptra.a - - return v0,v1,v2,v3,v4,v5,v6,p0,p1,p2,p3,p4,p5,p6 -end - -test = require("test") -test.meq({0,1,1,2,2,3,2,0,1,1,2,2,3,2},bar()) \ No newline at end of file diff --git a/samples/Terra/offsetcalc.t b/samples/Terra/offsetcalc.t deleted file mode 100644 index ec6b0c9b..00000000 --- a/samples/Terra/offsetcalc.t +++ /dev/null @@ -1,33 +0,0 @@ -local offsetinbytescache = {} -function offsetinbytes(structtype,key) - local typetable = offsetinbytescache[structtype] or {} - local value = typetable[key] - if value then - return value - end - offsetinbytescache[structtype] = typetable - - local terra offsetcalc() : int - var a : &structtype = [&structtype](0) - return [&int8](&a.[key]) - [&int8](a) - end - - local result = offsetcalc() - - typetable[key] = result - return result -end - - -struct A { a : int8, c : int8, b : int } - - -terra foo() - return 4LL -end - -local test = require("test") - -test.eq(offsetinbytes(A,"b"),4) - - diff --git a/samples/Terra/opaquealloc.t b/samples/Terra/opaquealloc.t deleted file mode 100644 index 91f07604..00000000 --- a/samples/Terra/opaquealloc.t +++ /dev/null @@ -1,19 +0,0 @@ - - - -local r,e = pcall(function() - local struct A { - a : opaque - } - local v = terralib.new(A) -end) - -assert(not r and e:match("Errors reported during")) - - -local r,e = pcall(function() - local v = terralib.new(opaque) -end) - - -assert(not r and e:match("attempting to use an opaque type")) \ No newline at end of file diff --git a/samples/Terra/or.t b/samples/Terra/or.t deleted file mode 100644 index 98a95761..00000000 --- a/samples/Terra/or.t +++ /dev/null @@ -1,9 +0,0 @@ -local test = require("test") - -terra foo(a : double, b : double, c : double) : bool - return a < b or b < c -end - -test.eq(foo(1,2,1),true) -test.eq(foo(2,1,2),true) -test.eq(foo(3,2,1),false) \ No newline at end of file diff --git a/samples/Terra/ordercomplete.t b/samples/Terra/ordercomplete.t deleted file mode 100644 index eb451822..00000000 --- a/samples/Terra/ordercomplete.t +++ /dev/null @@ -1,25 +0,0 @@ - - -struct A { - a : int -} - -struct B { - a : A -} - -function A.metamethods.__staticinitialize() - print("STATIC INIT A") - local terra what(b : B) - end - what:gettype(true) -end - -function B.metamethods.__staticinitialize() - print("STATIC INIT B") -end - -terra foo(b : B) -end - -foo:compile() \ No newline at end of file diff --git a/samples/Terra/output.t b/samples/Terra/output.t deleted file mode 100644 index bb2b17b8..00000000 --- a/samples/Terra/output.t +++ /dev/null @@ -1,16 +0,0 @@ -C = terralib.includec("stdio.h") -terra main() - C.printf("hello world\n") -end -local m = { main = main } -terralib.saveobj("output.o",m) -local a = terralib.saveobj(nil,"object",m) -terralib.saveobj("output2.bc",m) -local b = terralib.saveobj(nil,"bitcode",m) -terralib.saveobj("output.ll",m) -local c = terralib.saveobj(nil,"llvmir",m) -terralib.saveobj("output",m) -terralib.saveobj("output2","executable",m) - -assert(a:match("hello world")) -assert(c:match("hello world")) \ No newline at end of file diff --git a/samples/Terra/overload.t b/samples/Terra/overload.t deleted file mode 100644 index 57483413..00000000 --- a/samples/Terra/overload.t +++ /dev/null @@ -1,17 +0,0 @@ - -terra foo(a : int) - return 1 -end - -terra foo(a : &int8) - return 2 -end - -print(#foo.definitions) - -terra doit() - return foo(1) + foo("what") -end - -local test = require("test") -test.eq(doit(),3) \ No newline at end of file diff --git a/samples/Terra/overload2.t b/samples/Terra/overload2.t deleted file mode 100644 index 417d5aab..00000000 --- a/samples/Terra/overload2.t +++ /dev/null @@ -1,15 +0,0 @@ - -terra foo(a : int) - return 1 -end - -terra foo(a : double) - return 2 -end - -terra doit() - return foo(2.5) -end - -local test = require("test") -test.eq(doit(),2) \ No newline at end of file diff --git a/samples/Terra/overload3.t b/samples/Terra/overload3.t deleted file mode 100644 index 93a516c6..00000000 --- a/samples/Terra/overload3.t +++ /dev/null @@ -1,15 +0,0 @@ - -terra foo(a : {int} ) - return 1 -end - -terra foo(a : {int,int} ) - return 2 -end - -terra doit() - return foo({1,2}) + foo({1,2}) -end - -local test = require("test") -test.eq(doit(),4) \ No newline at end of file diff --git a/samples/Terra/overloadcall.t b/samples/Terra/overloadcall.t deleted file mode 100644 index 343deb84..00000000 --- a/samples/Terra/overloadcall.t +++ /dev/null @@ -1,12 +0,0 @@ - - -terra foo(a : int) - return a -end - -terra foo(a : int, b : int) - return a + b -end - -local test = require("test") -test.eq(foo(1) + foo(3,4), 8) \ No newline at end of file diff --git a/samples/Terra/overloadmethod.t b/samples/Terra/overloadmethod.t deleted file mode 100644 index 226842b8..00000000 --- a/samples/Terra/overloadmethod.t +++ /dev/null @@ -1,24 +0,0 @@ - -struct A { a : int } -terra A:foo(a : int) - return self.a + a -end - -terra A:foo(a : &int8) - return self.a -end - - -terra doit() - var a = A { 3 } - return a:foo(1) + a:foo("what") -end -terra doit2() - var a = A { 3 } - var pa = &a - return pa:foo(1) + pa:foo("what") -end - -local test = require("test") -test.eq(doit(),7) -test.eq(doit2(),7) \ No newline at end of file diff --git a/samples/Terra/overloadmethod2.t b/samples/Terra/overloadmethod2.t deleted file mode 100644 index f3c411ec..00000000 --- a/samples/Terra/overloadmethod2.t +++ /dev/null @@ -1,17 +0,0 @@ - -struct A { a : int } -A.methods.foo = terra(self : A, a : int) - return self.a + a -end - -terra A:foo() - return self.a -end - - -terra doit() - var a = A { 3 } - return a:foo() + a:foo(1) -end -local test = require("test") -test.eq(doit(),7) \ No newline at end of file diff --git a/samples/Terra/overloadmethod3.t b/samples/Terra/overloadmethod3.t deleted file mode 100644 index 87290ade..00000000 --- a/samples/Terra/overloadmethod3.t +++ /dev/null @@ -1,18 +0,0 @@ - -struct A { a : int } -A.methods.foo = terra(self : A) - return 2 -end - -terra A:foo() - return 1 -end - - -terra doit() - var a = A { 3 } - var pa = &a - return a:foo() + pa:foo() -end -local test = require("test") -test.eq(doit(),4) \ No newline at end of file diff --git a/samples/Terra/overloadproduct.t b/samples/Terra/overloadproduct.t deleted file mode 100644 index 85230e29..00000000 --- a/samples/Terra/overloadproduct.t +++ /dev/null @@ -1,65 +0,0 @@ - -local ans = { -{1,1,1,1}; -{2,2,2,2}; -{1,2,1,2}; -{3,3,3,3}; -{1,1,3,3}; -{0,2,3,0}; -{1,2,3,0}; -{4,4,4,4}; -{1,0,0,4}; -{2,2,4,4}; -{1,2,0,4}; -{3,4,3,4}; -{1,0,3,4}; -{0,2,3,4}; -{1,2,3,4}; -} -function create(foo,a,b,c,d) - if a then - terra foo(a : int, b : int) - return 1 - end - end - if b then - terra foo(a : int, b : double) - return 2 - end - end - if c then - terra foo(a : double, b : int) - return 3 - end - end - if d then - terra foo(a : double, b : double) - return 4 - end - end -end - -local function bitset(i,b) - return bit.band(bit.rshift(i,b),1) == 1 -end - -for i = 1,15 do - local terra foo - local a,b,c,d = bitset(i,0),bitset(i,1),bitset(i,2),bitset(i,3) - create(foo, a,b,c,d) - local function trycall(arg1,arg2) - local r = 0 - pcall(function() - local terra testit() - var a : arg1, b : arg2 = 0,0 - return foo(a,b) - end - r = testit() - end) - return r - end - local r = {trycall(int,int),trycall(int,double),trycall(double,int),trycall(double,double)} - for j,rr in ipairs(r) do - assert(rr == ans[i][j]) - end -end \ No newline at end of file diff --git a/samples/Terra/overloadrecv.t b/samples/Terra/overloadrecv.t deleted file mode 100644 index a07a8bbf..00000000 --- a/samples/Terra/overloadrecv.t +++ /dev/null @@ -1,20 +0,0 @@ - - -struct A { - a : int -} - -terra A:foo(a : int, b : uint8) - return 1 -end -terra A:foo(a : double, b : uint8) - return 2 -end - -terra useit() - var a = A { 3 } - var pa = &a - return a:foo(1,1) + a:foo(1.1,1) + pa:foo(1,1) + pa:foo(1.1,1) -end - -assert(6 == useit()) \ No newline at end of file diff --git a/samples/Terra/painfulrecstruct.t b/samples/Terra/painfulrecstruct.t deleted file mode 100644 index 1b2026b6..00000000 --- a/samples/Terra/painfulrecstruct.t +++ /dev/null @@ -1,22 +0,0 @@ - - -struct A { - a : A -> int; - b : int -} - -terra foo(a : A) - return a.b -end - -terra callit(a : A) - return a.a(a) -end - -terra bar() - var a = A { foo, 3 } - return callit(a) -end - -local test = require("test") -test.eq(bar(),3) \ No newline at end of file diff --git a/samples/Terra/paren.t b/samples/Terra/paren.t deleted file mode 100644 index bcd40960..00000000 --- a/samples/Terra/paren.t +++ /dev/null @@ -1,5 +0,0 @@ -terra foo(a : int) - return a + (a) -end - -foo(3) \ No newline at end of file diff --git a/samples/Terra/parsecrash.t b/samples/Terra/parsecrash.t deleted file mode 100644 index 1ce8c06d..00000000 --- a/samples/Terra/parsecrash.t +++ /dev/null @@ -1,7 +0,0 @@ -local result,err = terralib.loadstring [[ -terra result() - [startXNeeded] = a + strip*L.stripWidth - [endXNeeded] = 1 -end -]] -assert(result ~= nil) \ No newline at end of file diff --git a/samples/Terra/parsefail.t b/samples/Terra/parsefail.t deleted file mode 100644 index 491ce0f2..00000000 --- a/samples/Terra/parsefail.t +++ /dev/null @@ -1,35 +0,0 @@ - -local self = 1 -local Rt = 1 -local i = 1 -local j = 1 -terra bar() -var a = Rt.MatrixDouble{[&double](self.ptr) , i,j} -end - -local r,e = terralib.loadstring[[ - - terra foo() - var a = { [&double](4) = 3 } - end -]] - -assert(r == nil and e:match("unexpected symbol near '='")) - -terra foo() - var a = { [""] = 3 } -end - -local s = symbol() - -local function getsym() - return s -end -terra foo2() - var [getsym()] = 3 - var a = { [getsym()] = 4, _1 = [getsym()] } - return a.[getsym()] + a._1 -end - -assert(7 == foo2()) - diff --git a/samples/Terra/parsefail2.t b/samples/Terra/parsefail2.t deleted file mode 100644 index 74119074..00000000 --- a/samples/Terra/parsefail2.t +++ /dev/null @@ -1,5 +0,0 @@ -terra foo() - var a : int[4] @&a[0] = 3 - return a[0] -end -assert(3 == foo()) \ No newline at end of file diff --git a/samples/Terra/pattern.t b/samples/Terra/pattern.t deleted file mode 100644 index dfb23037..00000000 --- a/samples/Terra/pattern.t +++ /dev/null @@ -1,43 +0,0 @@ - -terra foobar() - return 1,2 -end - -terra what() - var _,a,b = 1,foobar() - a,b = foobar() - return a + b -end -terra what2() - var a = foobar() - var b,c = unpackstruct(a) - return b+c -end - -assert(what() == 3) -assert(what2() == 3) - - -struct A { - a : int - b : int -} - -terra what3() : A - var a = A {1,2} - return unpacktuple(a) -end -assert(what3().b == 2) - -terra what4() - var a = A {1,2} - var c,d = unpackstruct(a) - return c+d -end -assert(what4() == 3) - -local terra ra() return A {1,2} end -local a,b = unpackstruct(foobar()) -assert(a == 1 and b == 2) -assert(unpacktuple(ra()).a == 1) -assert(unpackstruct(ra()) == 1) \ No newline at end of file diff --git a/samples/Terra/point.t b/samples/Terra/point.t deleted file mode 100644 index 088e3702..00000000 --- a/samples/Terra/point.t +++ /dev/null @@ -1,13 +0,0 @@ - -terra bar(a : &int) - @a = @a + 1 -end -terra foo(a : int) : int - var b : int - b = a - bar(&b) - return b -end - -local test = require("test") -test.eq(foo(4),5) \ No newline at end of file diff --git a/samples/Terra/pointerarith.t b/samples/Terra/pointerarith.t deleted file mode 100644 index d59c9b59..00000000 --- a/samples/Terra/pointerarith.t +++ /dev/null @@ -1,31 +0,0 @@ -terra foo(a : &int) : ptrdiff - var b : &int b = a + 10 - return b-a -end - -terra bar() - var b:int = 10; - return foo(&b) -end - -terra foo2(a : &int) : &int - a = a + 6 - a = 3 + a - a = a + 10 - return a -end - -terra foo3(a : &int) : &int - a = a - 11 - a = 2 + a - a = a - 10 - return a -end - -terra bar2(a : int) - return @(foo3(foo2(&a))) -end - -local test = require("test") -test.eq(bar(),10) -test.eq(bar2(42),42) diff --git a/samples/Terra/pointerlike.t b/samples/Terra/pointerlike.t deleted file mode 100644 index 2d3d8542..00000000 --- a/samples/Terra/pointerlike.t +++ /dev/null @@ -1,7 +0,0 @@ - -terra foo() - var a : int[4] - var b : &int = a - return a + 1, a - a, b - a, a - b, 1 + a -end -foo() \ No newline at end of file diff --git a/samples/Terra/pow.t b/samples/Terra/pow.t deleted file mode 100644 index 701c8247..00000000 --- a/samples/Terra/pow.t +++ /dev/null @@ -1,28 +0,0 @@ -local N = 4 -- N is a Lua variable -terra powN(a : double) - var r = 1 - for i = 0, N do - r = r * a - end - return r -end - - - - -local math = {} -for N = 1,10 do - math["pow"..tostring(N)] = terra(a : double) - var r = 1 - for i = 0, N do - r = r * a - end - return r - end -end - -local test = require("test") -test.eq(powN(3),81) -test.eq(math.pow1(2),2) -test.eq(math.pow2(2),4) -test.eq(math.pow3(2),8) \ No newline at end of file diff --git a/samples/Terra/ppltalk.t b/samples/Terra/ppltalk.t deleted file mode 100644 index d9e29868..00000000 --- a/samples/Terra/ppltalk.t +++ /dev/null @@ -1,18 +0,0 @@ - ---this is a comment. ---top level is Lua code: -function min(a,b) - if a < b then return a - else return b end -end - -print(min(3,4)) --3 - -terra mint(a : int, b : int) : int -if a < b then return a -else return b end -end - -print(mint(3,4)) --3 - -mint:disas() \ No newline at end of file diff --git a/samples/Terra/ppnil.t b/samples/Terra/ppnil.t deleted file mode 100644 index 93e6e561..00000000 --- a/samples/Terra/ppnil.t +++ /dev/null @@ -1,4 +0,0 @@ -terra foo() - return nil -end -foo:printpretty() \ No newline at end of file diff --git a/samples/Terra/pratttest1.t b/samples/Terra/pratttest1.t deleted file mode 100755 index 95b9f739..00000000 --- a/samples/Terra/pratttest1.t +++ /dev/null @@ -1,4 +0,0 @@ -import "lib/pratttest" -local a = goexp 1 + 3 * 4 ^ 5 ^ 6/(2 - 4 + -a) + -b(c) - -terralib.tree.printraw(a) diff --git a/samples/Terra/prec.t b/samples/Terra/prec.t deleted file mode 100644 index b6afe988..00000000 --- a/samples/Terra/prec.t +++ /dev/null @@ -1,4 +0,0 @@ -local a = &double -> double -assert(a:ispointer()) -assert(a.type:isfunction()) -assert(a.type.parameters[1]:ispointer()) \ No newline at end of file diff --git a/samples/Terra/prec2.t b/samples/Terra/prec2.t deleted file mode 100644 index 99a8974b..00000000 --- a/samples/Terra/prec2.t +++ /dev/null @@ -1,2 +0,0 @@ -terra foo(a : float, b : float, c : float, d : float) return a * (b - c) end -foo:printpretty() \ No newline at end of file diff --git a/samples/Terra/pretty.t b/samples/Terra/pretty.t deleted file mode 100644 index 3953c97a..00000000 --- a/samples/Terra/pretty.t +++ /dev/null @@ -1,69 +0,0 @@ - - -terra bar(a : int) - return 4,5 -end -terra takebar(a : double, b : int) - return 1 -end -terra baz() -end -function whatwhat() -end -struct A { data : int } -terra A:moo() end -Aptr = terralib.new(A) -terra foo() - var aa : A - - baz() - whatwhat() - do - end - ::what:: - goto what - while 4 < 3 do - break - terralib.attrload(&aa,{}) - var d = terralib.attrstore(&aa,aa,{}) - return 3,4,4,bar(aa.data) - end - var a = 0.0 - if a < 3 then - a = -(a + 1) - end - - if a < 3 then - a = -a + 1 - elseif a > 4 then - a = a - 1 - end - repeat - a = a + 1 - until a > 55 - var b,c = 4,5 - a,b = 5,c - var d = array(1,2,3) - b = (&a)[1] - var e : int = a - var g = terralib.select(true,0,1) - var ee = sizeof(int) - var more = { a = 5, c = 4, _2 = 3} - baz() - var bbb = bar(1) - var bb = takebar(bbb._0,bbb._1) - var vv = vector(3,4) - var vvv = Aptr - var vvvv = Aptr:moo() - return 3,4,ee,bar(1) -end - -foo:compile() -foo:printpretty(false) --before compilation -foo:printpretty() --after compilation - -local a = `1 + 2 -local b = quote var c = a + a in a + 1 end - -a:printpretty() -b:printpretty() \ No newline at end of file diff --git a/samples/Terra/printd.t b/samples/Terra/printd.t deleted file mode 100644 index d9a9f85d..00000000 --- a/samples/Terra/printd.t +++ /dev/null @@ -1,5 +0,0 @@ -a = .4 - -terra foo() return a end - -foo:printpretty(false) \ No newline at end of file diff --git a/samples/Terra/printfarray.t b/samples/Terra/printfarray.t deleted file mode 100644 index 98c21bef..00000000 --- a/samples/Terra/printfarray.t +++ /dev/null @@ -1,12 +0,0 @@ - - -C = terralib.includec("stdio.h") - -terra char(a : &int8) : int8 - return a[0] -end -terra foobar() - var a = arrayof(int8,char("a"),0) - C.printf("%s\n",a) -end -foobar() \ No newline at end of file diff --git a/samples/Terra/printfloat.t b/samples/Terra/printfloat.t deleted file mode 100644 index 37927f54..00000000 --- a/samples/Terra/printfloat.t +++ /dev/null @@ -1,7 +0,0 @@ -local IO = terralib.includec("stdio.h") - -terra foobar() - IO.printf("%f\n",3.3f) -end - -foobar() \ No newline at end of file diff --git a/samples/Terra/proxystruct.t b/samples/Terra/proxystruct.t deleted file mode 100644 index bde53457..00000000 --- a/samples/Terra/proxystruct.t +++ /dev/null @@ -1,19 +0,0 @@ -local c = terralib.includecstring [[ - #include - #include -]] - - -struct Node { - next : &Node; - v : int; -} - -terra foo() - var cur : &Node = [&Node](c.malloc(sizeof(Node))) - cur.v = 3 - return cur.v -end - -local test = require("test") -test.eq(foo(),3) diff --git a/samples/Terra/pt.t b/samples/Terra/pt.t deleted file mode 100644 index 6212d290..00000000 --- a/samples/Terra/pt.t +++ /dev/null @@ -1,18 +0,0 @@ - - -local a = global(double) - -terra getptr() - return &a -end - -local b = getptr() -local c = terralib.pointertolightuserdata(b) -print(b,c,a) - -terra foo(a : &&int) - -end - -foo(c) -print("DONE") \ No newline at end of file diff --git a/samples/Terra/pthreads.t b/samples/Terra/pthreads.t deleted file mode 100644 index b903dcdb..00000000 --- a/samples/Terra/pthreads.t +++ /dev/null @@ -1,47 +0,0 @@ -local ffi = require("ffi") -if ffi.os == "Windows" then - return -end - -C = terralib.includecstring [[ -#include -#include -]] - -acc = global(int[4]) - -terra forkedFn(args : &opaque) : &opaque - var threadid = @[&int](args) - C.printf("threadid %d\n",threadid) - acc[threadid] = threadid - return nil -end - -terra foo() - var thread0 : C.pthread_t - var thread1 : C.pthread_t - var thread2 : C.pthread_t - var thread3 : C.pthread_t - - acc[0]=-42 - acc[1]=-42 - acc[2]=-42 - acc[3]=-42 - - var args = arrayof(int,0,1,2,3) - - C.pthread_create(&thread0,nil,forkedFn,&args[0]) - C.pthread_create(&thread1,nil,forkedFn,&args[1]) - C.pthread_create(&thread2,nil,forkedFn,&args[2]) - C.pthread_create(&thread3,nil,forkedFn,&args[3]) - - C.pthread_join(thread0,nil) - C.pthread_join(thread1,nil) - C.pthread_join(thread2,nil) - C.pthread_join(thread3,nil) - - return acc[0]+acc[1]+acc[2]+acc[3] -end - -local test = require("test") -test.eq(foo(),0+1+2+3) \ No newline at end of file diff --git a/samples/Terra/quote.t b/samples/Terra/quote.t deleted file mode 100644 index 6110380e..00000000 --- a/samples/Terra/quote.t +++ /dev/null @@ -1,10 +0,0 @@ - -local c = `10 -local a = `4 + c -terra doit() - var c = 3 - return a + a -end - -local test = require("test") -test.eq(doit(),28) \ No newline at end of file diff --git a/samples/Terra/quote10.t b/samples/Terra/quote10.t deleted file mode 100644 index f32e9e22..00000000 --- a/samples/Terra/quote10.t +++ /dev/null @@ -1,13 +0,0 @@ - -terra foo() - return 1,2 -end - -local q = `foo() - -terra bar() - return q -end - -local test = require("test") -test.meq({1,2},bar()) \ No newline at end of file diff --git a/samples/Terra/quote2.t b/samples/Terra/quote2.t deleted file mode 100644 index 378510a3..00000000 --- a/samples/Terra/quote2.t +++ /dev/null @@ -1,9 +0,0 @@ - -local c = `10 -local a = `4 + c -terra doit() - return a -end - -local test = require("test") -test.eq(doit(),14) \ No newline at end of file diff --git a/samples/Terra/quote3.t b/samples/Terra/quote3.t deleted file mode 100644 index 9f24b51f..00000000 --- a/samples/Terra/quote3.t +++ /dev/null @@ -1,13 +0,0 @@ -c = global(0) -terra count() - c = c + 1 - return c -end -foo = macro(function(a,b) return `a + a + a + b + count() end) -terra doit() - var a = -100 - return foo(count(),4) -end - -local test = require("test") -test.eq(doit(),14) \ No newline at end of file diff --git a/samples/Terra/quote4.t b/samples/Terra/quote4.t deleted file mode 100644 index 29f5150f..00000000 --- a/samples/Terra/quote4.t +++ /dev/null @@ -1,9 +0,0 @@ - -local str2 = `{a = 4} -local str = `str2 -terra doit() - return str.a -end - -local test = require("test") -test.eq(doit(),4) \ No newline at end of file diff --git a/samples/Terra/quote5.t b/samples/Terra/quote5.t deleted file mode 100644 index 23539bc4..00000000 --- a/samples/Terra/quote5.t +++ /dev/null @@ -1,20 +0,0 @@ - -c = global(0) -terra foo(a : int) - c = c + a -end - -local stmts = quote - foo(5) - foo(6) - foo(7) -end - -local stmts2 = {stmts,stmts} -terra doit() - stmts - stmts2 - return c -end -local test = require("test") -test.eq(doit(),54) \ No newline at end of file diff --git a/samples/Terra/quote6.t b/samples/Terra/quote6.t deleted file mode 100644 index 59a2b83f..00000000 --- a/samples/Terra/quote6.t +++ /dev/null @@ -1,12 +0,0 @@ -function mymacro() - return {`4,`5} -end -mymacro = macro(mymacro) - -local exps = {`2,`3, `mymacro()} - -terra doit() - return exps -end -local test = require("test") -test.meq({2,3,4,5},doit()) \ No newline at end of file diff --git a/samples/Terra/quote7.t b/samples/Terra/quote7.t deleted file mode 100644 index cbd4cb3b..00000000 --- a/samples/Terra/quote7.t +++ /dev/null @@ -1,23 +0,0 @@ -a = {} - -local c = terralib.includec("stdio.h") - - -a.c = quote - c.printf("hello\n") -end - -a.b = quote - var d = 4 - a.c - return d -end - - -terra foo() - a.c - a.b -end - -local test = require("test") -test.eq(foo(),4) \ No newline at end of file diff --git a/samples/Terra/quote8.t b/samples/Terra/quote8.t deleted file mode 100644 index afec0869..00000000 --- a/samples/Terra/quote8.t +++ /dev/null @@ -1,19 +0,0 @@ -a = {} - -local c = terralib.includec("stdio.h") - - -a.c = {`1,`2,`3} - -a.b = quote - return a.c,a.c -end - - -terra foo() - a.b -end - - -local test = require("test") -test.meq({1,2,3,1,2,3},foo()) diff --git a/samples/Terra/quote9.t b/samples/Terra/quote9.t deleted file mode 100644 index 834a4afd..00000000 --- a/samples/Terra/quote9.t +++ /dev/null @@ -1,19 +0,0 @@ -a = {} - -local c = terralib.includec("stdio.h") - - -a.c = {`1,`2,`3} - -a.b = quote - return a.c._0,(a.c)._0 -end - - -terra foo() - a.b -end - - -local test = require("test") -test.meq({1,1}, foo()) \ No newline at end of file diff --git a/samples/Terra/quoteblock.t b/samples/Terra/quoteblock.t deleted file mode 100644 index 3833dbbf..00000000 --- a/samples/Terra/quoteblock.t +++ /dev/null @@ -1,12 +0,0 @@ - -local a = symbol() -local myquote = quote - var [a] = 3 -end - -terra bar() - [myquote]; - return [a] -end - -print(bar()) \ No newline at end of file diff --git a/samples/Terra/quoteenv.t b/samples/Terra/quoteenv.t deleted file mode 100644 index 607631a1..00000000 --- a/samples/Terra/quoteenv.t +++ /dev/null @@ -1,25 +0,0 @@ ---quotes, unlike functions bind symbols eagerly ---function have :compile() to bind their symbols, but no similar thing exists ---for quotes, making it hard to control ---furthermore there aren't many use cases for late-binding quotes, ---but a bunch exist for needing early-bound quotes, like below: - - -function times5(x) - local c = `0 - for i = 1,5 do - c = `c + x - end - return c -end -times5 = macro(times5) - -terra foo() - var a = 3 - return times5(a) -end - -foo:printpretty() -foo:disas() -local test = require("test") -test.eq(foo(),15) diff --git a/samples/Terra/quoteselect.t b/samples/Terra/quoteselect.t deleted file mode 100644 index 46864e34..00000000 --- a/samples/Terra/quoteselect.t +++ /dev/null @@ -1,12 +0,0 @@ - -local a = {} - -local c = terralib.includec("stdio.h") - -b = `c.printf("hello\n") - -terra foo() - return b -end - -foo() \ No newline at end of file diff --git a/samples/Terra/rd.t b/samples/Terra/rd.t deleted file mode 100644 index c80487fc..00000000 --- a/samples/Terra/rd.t +++ /dev/null @@ -1 +0,0 @@ -C = terralib.includec("stdarg.h") \ No newline at end of file diff --git a/samples/Terra/receivercasts.t b/samples/Terra/receivercasts.t deleted file mode 100644 index 384c7bce..00000000 --- a/samples/Terra/receivercasts.t +++ /dev/null @@ -1,22 +0,0 @@ - -struct A { a : int } - -terra A.methods.foo(a : int) - return a + 1 -end - -function A.metamethods.__cast(from,to,exp) - if from == A and to == int then - return `exp.a - end - error("what") -end - - - -terra testit() - var a = A { 5 } - return a:foo() -end - -assert(6 == testit()) \ No newline at end of file diff --git a/samples/Terra/recfn.t b/samples/Terra/recfn.t deleted file mode 100644 index 3a0d757f..00000000 --- a/samples/Terra/recfn.t +++ /dev/null @@ -1,10 +0,0 @@ -local terra foo() : {} - bar() -end and -local terra bar() : {} - foo() -end - -bar = nil - -foo:printpretty() \ No newline at end of file diff --git a/samples/Terra/recoverfromerror.t b/samples/Terra/recoverfromerror.t deleted file mode 100644 index 92ef01a5..00000000 --- a/samples/Terra/recoverfromerror.t +++ /dev/null @@ -1,15 +0,0 @@ - - -terra what() - return " " / 1 -end - -dostuff = macro(function() - pcall(what.compile,what) - return 4 -end) - -terra foobar() - return dostuff() -end -assert(4 == foobar()) \ No newline at end of file diff --git a/samples/Terra/recstruct.t b/samples/Terra/recstruct.t deleted file mode 100644 index dff75679..00000000 --- a/samples/Terra/recstruct.t +++ /dev/null @@ -1,33 +0,0 @@ -local c = terralib.includecstring [[ - #include - #include -]] - - -struct Node { - next : &Node; - v : int; -} - -local N = 10 -terra foo() - var cur : &Node = nil - for i = 0, N do - var n = [&Node](c.malloc(sizeof(Node))) - n.v = i - n.next = cur - cur = n - end - var sum = 0 - while cur ~= nil do - c.printf("%d\n",cur.v) - sum = sum + cur.v - var old = cur - cur = cur.next - c.free(old) - end - return sum -end - -local test = require("test") -test.eq(foo(),N * (N - 1) / 2) \ No newline at end of file diff --git a/samples/Terra/recstruct2.t b/samples/Terra/recstruct2.t deleted file mode 100644 index 0c92d4d8..00000000 --- a/samples/Terra/recstruct2.t +++ /dev/null @@ -1,17 +0,0 @@ - - -local struct A { b : &B } - and struct B { a : &A } - -struct C { a : &A, b : &B, c : &C } - -local struct D {} - -terra foo() - var a : A, b : B, c : C - a.b = &b - b.a = &a - c.c = &c -end - -foo() \ No newline at end of file diff --git a/samples/Terra/rename.t b/samples/Terra/rename.t deleted file mode 100644 index 323c09d7..00000000 --- a/samples/Terra/rename.t +++ /dev/null @@ -1,8 +0,0 @@ -terralib.includecstring [[ - int foo() { return 3; } -]] - -terra what() return 4 end - - -terralib.saveobj("foo.o",{foo = what}) \ No newline at end of file diff --git a/samples/Terra/renaming.t b/samples/Terra/renaming.t deleted file mode 100644 index c0674d6f..00000000 --- a/samples/Terra/renaming.t +++ /dev/null @@ -1,21 +0,0 @@ - -C = terralib.includec("stdio.h") -terra main() - C.printf("what\n") -end -main:setinlined(false) - -terra realmain() - main() -end - -terra foo() -end -and terra foo(a : int) -end - -foo:compile() - -terralib.saveobj("renamed",{ main = realmain }) - -terralib.dumpmodule() \ No newline at end of file diff --git a/samples/Terra/requiretwice.t b/samples/Terra/requiretwice.t deleted file mode 100644 index 4999edc6..00000000 --- a/samples/Terra/requiretwice.t +++ /dev/null @@ -1,3 +0,0 @@ -A = require("lib.golike") -B = require("lib.golike") -assert(A == B) \ No newline at end of file diff --git a/samples/Terra/rvaluerecv.t b/samples/Terra/rvaluerecv.t deleted file mode 100644 index 5ccad573..00000000 --- a/samples/Terra/rvaluerecv.t +++ /dev/null @@ -1,30 +0,0 @@ -struct A { a : int } - -terra A:foo() - self.a = self.a + 1 - return self.a -end - -terra A.methods.foo2(self : A) - self.a = self.a + 1 - return self.a -end - - -mya = global(A) -mya:set({0}) - -terra geta() - return mya -end - -terra bar() - var v0 = mya.a - var v1 = geta():foo() - var v2 = mya.a - var v3 = geta():foo2() - var v4 = mya.a - return v0,v1,v2,v3,v4 -end -test = require("test") -test.meq({0,1,0,1,0},bar()) \ No newline at end of file diff --git a/samples/Terra/scope.t b/samples/Terra/scope.t deleted file mode 100644 index 866d7e26..00000000 --- a/samples/Terra/scope.t +++ /dev/null @@ -1,13 +0,0 @@ -terra scope() - var a = 4 - var b = 0 - b = b + a - do - var a = 5 - b = b + a - end - b = b + a - return b -end -local test = require('test') -test.eq(scope(),13) \ No newline at end of file diff --git a/samples/Terra/selectoverload.t b/samples/Terra/selectoverload.t deleted file mode 100644 index b4b33d96..00000000 --- a/samples/Terra/selectoverload.t +++ /dev/null @@ -1,25 +0,0 @@ -struct Vec { data : float[3] } - - -local get = {} -get.x = terra(self : &Vec) - return self.data[0] -end -get.y = macro(function(self) - return `self.data[1] -end) - -Vec.metamethods.__entrymissing = macro(function(name,self) - return `[get[name]](&self) -end) - -terra bar() - var a = Vec { array(1.f,2.f,3.f) } - a.y = a.y + 1 - var pa = &a - return a.x + a.y + pa.x -end - -local test = require("test") -test.eq(bar(),5) - diff --git a/samples/Terra/setname.t b/samples/Terra/setname.t deleted file mode 100644 index 06c15855..00000000 --- a/samples/Terra/setname.t +++ /dev/null @@ -1,7 +0,0 @@ - -two = terra() - return 1 + 1 -end -two:setname("two") - -two:disas() \ No newline at end of file diff --git a/samples/Terra/setter.t b/samples/Terra/setter.t deleted file mode 100644 index abd55acc..00000000 --- a/samples/Terra/setter.t +++ /dev/null @@ -1,39 +0,0 @@ - -struct A { -a : int; -b : int; -} - -terra A.metamethods.__update(self : &A, a : int, b : int) - self.a = a - self.b = b -end -terra A.metamethods.__apply(self : &A, a : int) - return a + self.b -end - -struct B { - a : int -} - - -B.metamethods.__update = macro(function(me,arg,arg2,rhs) - return quote me.a = arg + arg2 + rhs end -end) - -B.metamethods.__setentry = macro(function(field,self,rhs) - field = field:sub(2) - return quote self.[field] = self.[field] + rhs end -end) - -terra foo() - var a : A - a(4) = 5 - var b : B - b(3,4) = 5 - b._a = 1 - return a.a + a.b + a(3) + b.a -end - ---foo:printpretty() -assert(foo() == 9+8+3+4+5+1) diff --git a/samples/Terra/sgemm-old.t b/samples/Terra/sgemm-old.t deleted file mode 100644 index 36d58007..00000000 --- a/samples/Terra/sgemm-old.t +++ /dev/null @@ -1,205 +0,0 @@ - -local IO = terralib.includec("stdio.h") -local stdlib = terralib.includec("stdlib.h") - - - -local NB = 64 -local V = 8 - -terra vecload(data : &float, idx : int) - var addr = &data[idx] - return @[&vector(float,V)](addr) -end - -haddavx = terralib.intrinsic("llvm.x86.avx.hadd.ps.256", { vector(float,8), vector(float,8) } -> vector(float,8)) -terra hadd(v : vector(float,8)) - var v1 = haddavx(v,v) - var v2 = haddavx(v1,v1) - return v2[0] + v2[4] -end - - -local AR = 2 -local BR = 2 -local KR = 2 -local NK = 64 - -local BLOCKB = true -local BLOCKA = true - -local function isinteger(x) return math.floor(x) == x end - -assert(isinteger(NK / (KR * V))) -assert(isinteger(NB / AR )) -assert(isinteger(NB / BR )) - - - -blockregisters = macro(function(C,A,B,K,lda,ldc,mm,nn,kk,m,n) - local function mkmatrix(nm,I,J) - local r = {} - for i = 0,I-1 do - r[i] = {} - for j = 0,J-1 do - r[i][j] = symbol(nm..tostring(i)..tostring(j)) - end - end - return r - end - local as,bs,cs = mkmatrix("a",AR,KR),mkmatrix("b",BR,KR),mkmatrix("c",AR,BR) - local stmts = terralib.newlist() - for i = 0, AR-1 do - for j = 0, BR-1 do - stmts:insert(quote var [cs[i][j]] : vector(float,V) = 0.f end) - end - end - - local k = symbol("k") - local kloopbody = terralib.newlist() - - local alreadyloaded = {} - local function get(vs,i,j,loadfn) - if not alreadyloaded[vs[i][j]] then - alreadyloaded[vs[i][j]] = true - kloopbody:insert(loadfn(vs[i][j])) - end - return vs[i][j] - end - - local function getA(i,j) - return get(as,i,j,function(sym) - local result - if BLOCKA then - result = quote - var [sym] = vecload(A, mm * K + NB*(kk + m - mm + i) + k - kk + j *V) - end - else - result = quote - var [sym] = vecload(A, (m + i) * lda + k + j * V) - end - end - return result - end) - end - - local function getB(i,j) - return get(bs,i,j,function(sym) - local result - if BLOCKB then - result = quote - var [sym] = vecload(B, nn * K + NB*(kk + n - nn + i) + k - kk + j * V) - end - else - result = quote - var [sym] = vecload(B, (n + i) * K + k + j * V) - end - end - return result - end) - end - - for l = 0, KR-1 do - for i = 0, AR-1 do - for j = 0, BR-1 do - local aa = getA(i,l) - local bb = getB(j,l) - kloopbody:insert(quote - [cs[i][j]] = [cs[i][j]] + aa * bb - end) - end - end - end - - stmts:insert(quote - for [k] = kk, kk + NK, V*KR do - kloopbody - end - end) - - for i = 0, AR-1 do - for j = 0, BR-1 do - local function getsum(b,e) - if b + 1 == e then - return `[cs[i][j]][b] - else - local mid = (e + b)/2 - assert(math.floor(mid) == mid) - local lhs = getsum(b,mid) - local rhs = getsum(mid,e) - return `lhs + rhs - end - end - local sum - if V == 8 and false then - sum = `hadd([cs[i][j]]) - else - sum = getsum(0,V) - end - stmts:insert(quote - var r = sum - if kk == 0 then - C[(m + i)*ldc + (n + j)] = r - else - C[(m + i)*ldc + (n + j)] = C[(m + i)*ldc + (n + j)] + r - end - end) - end - end - - return stmts -end) - -terra my_sgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : float, A : &float, lda : int, B : &float, ldb : int, - beta : float, C : &float, ldc : int) - - var TB = [&float](stdlib.malloc(K * N * sizeof(float))) - var TA = A - for kk = 0,K,NK do - for nn = 0,N,NB do - for k = kk,kk+NK do - for n = nn,nn+NB do - if BLOCKB then - TB[nn * K + NB*(kk + n - nn) + k - kk] = B[k*ldb + n] - else - TB[n*K + k] = B[k*ldb + n] - end - end - end - end - end - - if BLOCKA then - TA = [&float](stdlib.malloc(M * K * sizeof(float))) - for mm = 0,M,NB do - for kk = 0,K,NK do - for m = mm,mm+NB do - for k = kk,kk+NK do - TA[mm * K + NB*(kk + m - mm) + k - kk] = A[m*lda + k] - end - end - end - end - end - - for mm = 0,M,NB do - for nn = 0, N,NB do - for kk = 0, K, NK do - for m = mm,mm+NB,AR do - for n = nn,nn+NB,BR do - blockregisters(C,TA,TB,K,lda,ldc,mm,nn,kk,m,n) - end - end - end - end - end - stdlib.free(TB) - if BLOCKA then - stdlib.free(TA) - end -end - -my_sgemm:compile() -my_sgemm:printpretty() - -terralib.saveobj("my_sgemm.o", {my_sgemm = my_sgemm}) \ No newline at end of file diff --git a/samples/Terra/sgemm.t b/samples/Terra/sgemm.t deleted file mode 100644 index c5121daa..00000000 --- a/samples/Terra/sgemm.t +++ /dev/null @@ -1,162 +0,0 @@ - -local IO = terralib.includec("stdio.h") -local stdlib = terralib.includec("stdlib.h") - - - -local NB = 72 -local V = 8 - -terra vecload(data : &float, idx : int) - var addr = &data[idx] - return @[&vector(float,V)](addr) -end - -haddavx = terralib.intrinsic("llvm.x86.avx.hadd.ps.256", { vector(float,8), vector(float,8) } -> vector(float,8)) -terra hadd(v : vector(float,8)) - var v1 = haddavx(v,v) - var v2 = haddavx(v1,v1) - return v2[0] + v2[4] -end - - -local AR = 2 -local BR = 4 -local KR = 1 -local NK = 72 - - -local function isinteger(x) return math.floor(x) == x end - -assert(isinteger(NK / (KR * V))) -assert(isinteger(NB / AR )) -assert(isinteger(NB / BR )) - - - -blockregisters = macro(function(C,A,B,K,lda,ldc,m,n,kk) - local function mkmatrix(nm,I,J) - local r = {} - for i = 0,I-1 do - r[i] = {} - for j = 0,J-1 do - r[i][j] = symbol(nm..tostring(i)..tostring(j)) - end - end - return r - end - local as,bs,cs = mkmatrix("a",AR,KR),mkmatrix("b",BR,KR),mkmatrix("c",AR,BR) - local stmts = terralib.newlist() - for i = 0, AR-1 do - for j = 0, BR-1 do - stmts:insert(quote var [cs[i][j]] : vector(float,V) = 0.f end) - end - end - - local k = symbol("k") - local kloopbody = terralib.newlist() - - local alreadyloaded = {} - local function get(vs,i,j,loadfn) - if not alreadyloaded[vs[i][j]] then - alreadyloaded[vs[i][j]] = true - kloopbody:insert(loadfn(vs[i][j])) - end - return vs[i][j] - end - - local function getA(i,j) - return get(as,i,j,function(sym) - return quote - var [sym] = vecload(A, (m + i) * lda + k + j * V) - end - end) - end - - local function getB(i,j) - return get(bs,i,j,function(sym) - return quote - var [sym] = vecload(B, (n + i) * K + k + j * V) - end - end) - end - - for l = 0, KR-1 do - for i = 0, AR-1 do - for j = 0, BR-1 do - local aa = getA(i,l) - local bb = getB(j,l) - kloopbody:insert(quote - [cs[i][j]] = [cs[i][j]] + aa * bb - end) - end - end - end - - stmts:insert(quote - for [k] = kk, kk + NK, V*KR do - kloopbody - end - end) - - for i = 0, AR-1 do - for j = 0, BR-1 do - local function getsum(b,e) - if b + 1 == e then - return `[cs[i][j]][b] - else - local mid = (e + b)/2 - assert(math.floor(mid) == mid) - local lhs = getsum(b,mid) - local rhs = getsum(mid,e) - return `lhs + rhs - end - end - local sum - if V == 8 and terralib.llvmversion ~= 31 then - sum = `hadd([cs[i][j]]) - else - sum = getsum(0,V) - end - stmts:insert(quote - var r = sum - if kk == 0 then - C[(m + i)*ldc + (n + j)] = r - else - C[(m + i)*ldc + (n + j)] = C[(m + i)*ldc + (n + j)] + r - end - end) - end - end - - return stmts -end) - -terra my_sgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : float, A : &float, lda : int, B : &float, ldb : int, - beta : float, C : &float, ldc : int) - - var TB = [&float](stdlib.malloc(K * N * sizeof(float))) - for k = 0,K do - for n = 0,N do - TB[n*K + k] = B[k*ldb + n] - end - end - - for mm = 0,M,NB do - for nn = 0, N,NB do - for kk = 0, K, NK do - for m = mm,mm+NB,AR do - for n = nn,nn+NB,BR do - blockregisters(C,A,TB,K,lda,ldc,m,n,kk) - end - end - end - end - end - stdlib.free(TB) -end - -my_sgemm:compile() -my_sgemm:printpretty() - -terralib.saveobj("my_sgemm.o", {my_sgemm = my_sgemm}) diff --git a/samples/Terra/sgemm3.t b/samples/Terra/sgemm3.t deleted file mode 100644 index 4c625cb6..00000000 --- a/samples/Terra/sgemm3.t +++ /dev/null @@ -1,124 +0,0 @@ - -function symmat(name,I,...) - if not I then return symbol(name) end - local r = {} - for i = 0,I-1 do - r[i] = symmat(name..tostring(i),...) - end - return r -end - - -llvmprefetch = terralib.intrinsic("llvm.prefetch",{&opaque,int,int,int} -> {}) - - - -function genkernel(NB, RM, RN, V,alpha) - - local A,B,C,mm,nn,ld = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn"),symbol("ld") - local lda,ldb,ldc = ld,ld,ld - local a,b,c,caddr = symmat("a",RM), symmat("b",RN), symmat("c",RM,RN), symmat("caddr",RM,RN) - local k = symbol("k") - - local loadc,storec = terralib.newlist(),terralib.newlist() - local VT = vector(float,V) - local VP = &VT - for m = 0, RM-1 do - for n = 0, RN-1 do - loadc:insert(quote - var [caddr[m][n]] = C + m*ldc + n*V - var [c[m][n]] = alpha * @VP([caddr[m][n]]) - end) - storec:insert(quote - @VP([caddr[m][n]]) = [c[m][n]] - end) - end - end - - local calcc = terralib.newlist() - - for n = 0, RN-1 do - calcc:insert(quote - var [b[n]] = @VP(&B[n*V]) - end) - end - for m = 0, RM-1 do - calcc:insert(quote - var [a[m]] = VT(A[m*lda]) - end) - end - for m = 0, RM-1 do - for n = 0, RN-1 do - calcc:insert(quote - [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] - end) - end - end - - - return terra([A] : &float, [B] : &float, [C] : &float, [ld] : int64) - for [mm] = 0, NB, RM do - for [nn] = 0, NB,RN*V do - [loadc]; - for [k] = 0, NB do - llvmprefetch(B + 4*ldb,0,3,1); - [calcc]; - B = B + ldb - A = A + 1 - end - [storec]; - A = A - NB - C = C + RN*V - B = B - ldb*NB + RN*V - end - C = C + RM * ldb - NB - B = B - NB - A = A + lda*RM - end - end -end - -local NB = 48 -local NB2 = 5 * NB - -local V = 1 - -l1dgemm0 = genkernel(NB,1,1,V,0) -l1dgemm1 = genkernel(NB,1,1,V,1) - -terra min(a : int, b : int) - return terralib.select(a < b, a, b) -end - -local stdlib = terralib.includec("stdlib.h") -local IO = terralib.includec("stdio.h") - -terra my_sgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : float, A : &float, lda : int, B : &float, ldb : int, - beta : float, C : &float, ldc : int) - - - for mm = 0,M,NB2 do - for nn = 0,N,NB2 do - for kk = 0,K, NB2 do - for m = mm,min(mm+NB2,M),NB do - for n = nn,min(nn+NB2,N),NB do - for k = kk,min(kk+NB2,K),NB do - --IO.printf("%d %d starting at %d\n",m,k,m*lda + NB*k) - if k == 0 then - l1dgemm0(A + (m*lda + k), - B + (k*ldb + n), - C + (m*ldc + n),lda) - else - l1dgemm1(A + (m*lda + k), - B + (k*ldb + n), - C + (m*ldc + n),lda) - end - end - end - end - end - end - end -end - -terralib.saveobj("my_sgemm.o", { my_sgemm = my_sgemm }) \ No newline at end of file diff --git a/samples/Terra/sgemmkernel.t b/samples/Terra/sgemmkernel.t deleted file mode 100644 index 46c21454..00000000 --- a/samples/Terra/sgemmkernel.t +++ /dev/null @@ -1,164 +0,0 @@ - -function symmat(name,I,...) - if not I then return symbol(name) end - local r = {} - for i = 0,I-1 do - r[i] = symmat(name..tostring(i),...) - end - return r -end - - -function genkernel(NB, RM, RN, V,alpha) - - local terra vecload(data : &float, idx : int) - var addr = &data[idx] - return @[&vector(float,V)](addr) - end - local terra vecstore(data : &float, idx : int, v : vector(float,V)) - var addr = &data[idx] - @[&vector(float,V)](addr) = v - end - - local A,B,C,mm,nn = symbol("A"),symbol("B"),symbol("C"),symbol("mn"),symbol("nn") - local lda,ldb,ldc = NB,NB,NB - local a,b,c,caddr = symmat("a",RM), symmat("b",RN), symmat("c",RM,RN), symmat("caddr",RM,RN) - local k = symbol("k") - - local loadc,storec = terralib.newlist(),terralib.newlist() - local VT = vector(float,V) - local VP = &VT - for m = 0, RM-1 do - for n = 0, RN-1 do - loadc:insert(quote - var [caddr[m][n]] = C + (mm+m)*ldc + nn + n*V - var [c[m][n]] = alpha * @VP([caddr[m][n]]) - end) - storec:insert(quote - @VP([caddr[m][n]]) = [c[m][n]] - end) - end - end - - local calcc = terralib.newlist() - - for n = 0, RN-1 do - calcc:insert(quote - var [b[n]] = @VP(&B[k*ldb + nn + n*V]) - end) - end - for m = 0, RM-1 do - calcc:insert(quote - var [a[m]] = VT(A[(mm+m)*lda + k]) - end) - end - for m = 0, RM-1 do - for n = 0, RN-1 do - calcc:insert(quote - [c[m][n]] = [c[m][n]] + [a[m]] * [b[n]] - end) - end - end - - - return terra([A] : &float, [B] : &float, [C] : &float) - for [mm] = 0, NB, RM do - for [nn] = 0, NB,RN*V do - [loadc]; - for [k] = 0, NB do - [calcc]; - end - [storec]; - end - end - end -end - -local NB = 32 -local NB2 = 8 * NB - -local V = 8 - -l1sgemm0 = genkernel(NB,2,4,V,0) -l1sgemm1 = genkernel(NB,2,4,V,1) - -terra min(a : int, b : int) - return terralib.select(a < b, a, b) -end - -local stdlib = terralib.includec("stdlib.h") -local IO = terralib.includec("stdio.h") - -local VT = vector(float,V) - -terra my_sgemm(gettime : {} -> double, M : int, N : int, K : int, alpha : double, A : &float, lda : int, B : &float, ldb : int, - beta : float, C : &float, ldc : int) - - var AA = [&float](stdlib.malloc(sizeof(float)*M*K)) - var BB = [&float](stdlib.malloc(sizeof(float)*K*N)) - var CC = [&float](stdlib.malloc(sizeof(float)*M*N)) - - var i = 0 - for mm = 0,M,NB do - for kk = 0,K,NB do - for m = mm,mm+NB do - for k = kk,kk+NB,V do - @[&VT](&AA[i]) = @[&VT](&A[m*lda + k]) - i = i + V - end - end - end - end - i = 0 - for kk = 0,K,NB do - for nn = 0,N,NB do - for k = kk,kk+NB do - for n = nn,nn+NB,V do - @[&VT](&BB[i]) = @[&VT](&B[k*ldb + n]) - i = i + V - end - end - end - end - - for mm = 0,M,NB2 do - for nn = 0,N,NB2 do - for kk = 0,K, NB2 do - for m = mm,min(mm+NB2,M),NB do - for n = nn,min(nn+NB2,N),NB do - for k = kk,min(kk+NB2,K),NB do - --IO.printf("%d %d starting at %d\n",m,k,m*lda + NB*k) - if k == 0 then - l1sgemm0(AA + (m*lda + NB*k), - BB + (k*ldb + NB*n), - CC + (m*ldc + NB*n)) - else - l1sgemm1(AA + (m*lda + NB*k), - BB + (k*ldb + NB*n), - CC + (m*ldc + NB*n)) - end - end - end - end - end - end - end - - i = 0 - for mm = 0,M,NB do - for nn = 0,N,NB do - for m = mm,mm+NB do - for n = nn,nn+NB,V do - @[&VT](&C[m*ldc + n]) = @[&VT](&CC[i]) - i = i + V - end - end - end - end - - stdlib.free(AA) - stdlib.free(BB) - stdlib.free(CC) -end - -terralib.saveobj("my_sgemmkernel.o", { my_sgemm = my_sgemm }) \ No newline at end of file diff --git a/samples/Terra/shallowfreeze.t b/samples/Terra/shallowfreeze.t deleted file mode 100644 index 7d5b3d9e..00000000 --- a/samples/Terra/shallowfreeze.t +++ /dev/null @@ -1,24 +0,0 @@ - - -struct B { - d : int -} -struct A { - b : &B; - c : int; - d : int; - e : int; -} - - -terra foo() : A - return A {nil} -end - -foo:disas() - -print(foo()) - - - -terralib.dumpmodule() \ No newline at end of file diff --git a/samples/Terra/sharedlib.t b/samples/Terra/sharedlib.t deleted file mode 100644 index 64a7afe9..00000000 --- a/samples/Terra/sharedlib.t +++ /dev/null @@ -1,22 +0,0 @@ - - -terra foo(a : int, b : int) - return a + b -end - -local ffi = require 'ffi' - -local name = (ffi.os == "Windows" and "foo.dll" or "foo.so") - -local args = {} - -if ffi.os == "Windows" then - args = {"/IMPLIB:foo.lib","/EXPORT:foo" } -end - -terralib.saveobj(name,{ foo = foo }, args) - -local foo2 = terralib.externfunction("foo", {int,int} -> int ) -terralib.linklibrary("./"..name) - -assert(4 == foo2(1,3)) diff --git a/samples/Terra/shift.t b/samples/Terra/shift.t deleted file mode 100644 index 67794ebd..00000000 --- a/samples/Terra/shift.t +++ /dev/null @@ -1,7 +0,0 @@ -local test = require("test") - -terra foo(a : int) - return 1 << 2, a >> 1, -4 >> 1, uint32(-a) >> 1 -end - -test.meq({4,2,-2,2147483646},foo(4)) diff --git a/samples/Terra/signext.t b/samples/Terra/signext.t deleted file mode 100644 index a9a17096..00000000 --- a/samples/Terra/signext.t +++ /dev/null @@ -1,12 +0,0 @@ - - -terra bar() - var a : uint8 = 255 - var b = foo(a) - return a == b -end and -terra foo(a : uint8) - return a -end - -print(bar()) \ No newline at end of file diff --git a/samples/Terra/simple.t b/samples/Terra/simple.t deleted file mode 100644 index 8d21c5eb..00000000 --- a/samples/Terra/simple.t +++ /dev/null @@ -1,6 +0,0 @@ - -terra simple(a : int) - return a + a -end -local test = require("test") -test.eq(simple(2),4) \ No newline at end of file diff --git a/samples/Terra/simpleadd.t b/samples/Terra/simpleadd.t deleted file mode 100644 index dd8e42cd..00000000 --- a/samples/Terra/simpleadd.t +++ /dev/null @@ -1,15 +0,0 @@ -struct Complex { real : float, imag : float } - -terra Complex.metamethods.__add(a : Complex, b : Complex) - return Complex { a.real + b.real, a.imag + b.imag } -end - - -terra foo() - var a = Complex { 1, 2 } - var b = Complex { 3, 4 } - var c = a + b - return c.real,c.imag -end - -print(foo()) \ No newline at end of file diff --git a/samples/Terra/simpleapply.t b/samples/Terra/simpleapply.t deleted file mode 100644 index e6a67034..00000000 --- a/samples/Terra/simpleapply.t +++ /dev/null @@ -1,19 +0,0 @@ -struct Vec { data : int[4] } -Vec.metamethods.__apply = terra(self : &Vec, i : int) - return self.data[i] -end - -struct Vec2 { data : int[4] } -Vec2.metamethods.__apply = macro(function(self,b) - return `self.data[b] -end) - -terra bar() - var a = Vec { array(1,2,3,4) } - var b = Vec2 { array(1,2,3,4) } - b(2) = b(2) + 1 - return b(2) + a(2) -end - -local test = require("test") -test.eq(bar(),7) \ No newline at end of file diff --git a/samples/Terra/simpleglobal.t b/samples/Terra/simpleglobal.t deleted file mode 100644 index ff8964ce..00000000 --- a/samples/Terra/simpleglobal.t +++ /dev/null @@ -1,19 +0,0 @@ - -local a = terralib.global(int) -local b = terralib.global(5) -local c = terralib.global(int,3) -terra foo() - a = 4 -end - - -terra bar() - return c + a + b -end - -foo() -assert(bar() == 12) - -b:set(4) - -assert(bar() == 11) \ No newline at end of file diff --git a/samples/Terra/simplerec.t b/samples/Terra/simplerec.t deleted file mode 100644 index 5d0b98ff..00000000 --- a/samples/Terra/simplerec.t +++ /dev/null @@ -1,25 +0,0 @@ - - - -local terra bar() - return 1 -end -and struct A { - a : int -} -and local struct B { - a : int -} -and terra B:foo() - return self.a -end -and terra foo() - var b , a = B{4}, A{5} - return 1 + b:foo() -end -and local terra mydecl -and struct mystructdecl - -print(bar()) - -print(foo()) diff --git a/samples/Terra/simplestruct.t b/samples/Terra/simplestruct.t deleted file mode 100644 index fc0b5ac8..00000000 --- a/samples/Terra/simplestruct.t +++ /dev/null @@ -1,10 +0,0 @@ - -struct A { - a : int -} - -terra foo(a : &A) - return a -end - -print(foo(terralib.new(A,{3}))) diff --git a/samples/Terra/simplevec.t b/samples/Terra/simplevec.t deleted file mode 100644 index b75f3d1a..00000000 --- a/samples/Terra/simplevec.t +++ /dev/null @@ -1,12 +0,0 @@ - -terra sum(input : &float, N : int) - var acc : vector(float,4) = vector(0.f,0.f,0.f,0.f) - for i = 0,N,4 do - --cast the floats to float4s and load - var entry = @[&vector(float,4)](input + i) - acc = acc + entry - end - return acc[0] + acc[1] + acc[2] + acc[3] -end - -sum:disas() diff --git a/samples/Terra/sintable.t b/samples/Terra/sintable.t deleted file mode 100644 index c1606563..00000000 --- a/samples/Terra/sintable.t +++ /dev/null @@ -1,17 +0,0 @@ -local N = 32 -local tbl = terralib.new(float[N]) -for i = 1,N do - tbl[i-1] = math.sin( 2 * math.pi * (i-1)/N) -end - -local ctable = terralib.constant(tbl) - -terra sintable(a : float) : float - var idx = int(a / (2 * math.pi) * N) - return ctable[idx] -end - -sintable:disas() - -print(sintable(0)) -print(sintable(math.pi/4)) \ No newline at end of file diff --git a/samples/Terra/special.t b/samples/Terra/special.t deleted file mode 100644 index 218aa3a2..00000000 --- a/samples/Terra/special.t +++ /dev/null @@ -1,61 +0,0 @@ - -local test = require("test") - -function mkspecial(N) - local terra pow(a : double) - var i,r = 0,1.0 - while i < N do - r = r * a - i = i + 1 - end - return r - end - return pow -end - - -local pow2 = mkspecial(2) -local pow3 = mkspecial(3) - -test.eq(pow2(2),4) -test.eq(pow3(2),8) - - -function mkor(T) - local terra fn(a : T, b : T) : T - return a or b - end - return fn -end - -local lor = mkor(bool) -local aor = mkor(int) - -test.eq(lor(1,2),true) -test.eq(aor(1,2),3) - - ---[[ -function my_lua_fun() - - val my_list = new_list() - defer delete(my_list) - - - - return { ["a"] = 1, ["b"] = 2 } -end ---wess weimer PhD on controlling actions -a:my_method(b) - -a.my_method(a,b) - -var a : T -a:my_method(b) -T.my_method(a,b) - -Pair = typedef(struct { a = int, b = int}) - -var a : Pair = { 1, 3 } -var a : Pair = my_lua_fun() -]] \ No newline at end of file diff --git a/samples/Terra/speed.t b/samples/Terra/speed.t deleted file mode 100644 index ceca0264..00000000 --- a/samples/Terra/speed.t +++ /dev/null @@ -1,30 +0,0 @@ -local c = terralib.includecstring [[ - #include - #include -]] - -terra doit(N : int64) - var cur,last = 1ULL,1ULL - for i = 0ULL, (N-2ULL) do - cur,last = cur+last,cur - end - return cur -end -terra main(argc : int, argv : &&int8) - var N = 4ULL - if argc == 2 then - N = c.atoi(argv[1]) - end - var result = doit(N) - c.printf("%lld\n",result) -end - -terra what() - return c.atoi("54") -end - -local test = require("test") -print(what()) -print(test.time( function() doit:compile() end)) -print(test.time( function() doit(100000000) end)) -print(test.time( function() terralib.saveobj("speed",{main = main}) end)) diff --git a/samples/Terra/splitprimary.t b/samples/Terra/splitprimary.t deleted file mode 100644 index aed90417..00000000 --- a/samples/Terra/splitprimary.t +++ /dev/null @@ -1,19 +0,0 @@ -r = 1 -local function foo(a) - r = a - return r -end -local b = foo(1) -(foo)(3) -assert(b + r == 4) - -terra testescapes() - var a = [4] - [ quote - a = a + 1 - end - ] - return [ `&a ][0] -end - -assert(testescapes() == 5) \ No newline at end of file diff --git a/samples/Terra/ssimple.t b/samples/Terra/ssimple.t deleted file mode 100644 index a50f90a8..00000000 --- a/samples/Terra/ssimple.t +++ /dev/null @@ -1,477 +0,0 @@ -function failit(fn) - local success,msg = pcall(fn) - if success then - error("failed to fail.",2) - elseif not string.match(msg,"Errors reported during") then - error("failed wrong: "..msg,2) - end -end - -terra foo() - return 1 -end - -a = 4 -terra foo2() - return a -end -b = 4.5 -terra foo3() - return b -end - -terra foo4() - var a = 3 - return a -end - - - -sa = symbol("myname") - -terra foo5() - var [sa] = 5 - return sa -end - -whatwhat = `3 + b - -terra foo6() - return whatwhat -end - -local whatwhat2 = {4,5} - -terra foo7() - return 3,4,5,whatwhat,whatwhat2 -end - -terra foo8() - return whatwhat2,4 -end - -local test = require("test") -assert(foo() == 1) -assert(foo2() == 4) -assert(foo3() == 4.5) -assert(foo4() == 3) -assert(foo5() == 5) -assert(foo6() == 7.5) -test.meq({3,4,5,7.5,4,5},foo7()) -test.meq({4,5,4},foo8()) - -local a = { b = {c = 4}} -terra foo9() - return a.["b"].c -end -print(foo9()) - -struct A { a : int } - -A.methods.what = terra() return 4 end - - -terra foo10() - return A.what() -end - -assert(foo10() == 4) - - -terra foo11() - var c = 3 - return [4 + 5 + a.b.c] + [c] -end - -assert(foo11() == 16) - -failit(function() - local terra missingvar() - return missing - end -end) -local b = coroutine.create(failit) -failit(function() - return `sa.foobar,`b.e -end) -failit(function() - return `a.d -end) -failit(function() - return `a.[1+"nope"] -end) -failit(function() - return `a.[1] -end) - -over = symbol() - -anint = symbol(int) - -terra foo13() - var [anint] - anint = 3 - return anint -end -assert(foo13() == 3) - -terra foo12() - goto [over] - while true do - end - ::[over]:: -end - -foo12() - - -terra foo14() : {int,double} - return 3.5,4.5 -end - -test.meq({3,4.5},foo14()) - -terra foo15() : int - return 3.5 -end -assert(foo15() == 3) - -failit(function() - local terra foo16() : 3 - end -end) - -terra foo16() - var r = 0 - for i = 0,10 do - r = r + 2 - end - return r -end - -assert(foo16() == 20) - -terra foo17() - var i = 0 - repeat - i = i + 1 - var b = i + 1 - until b == 10 - repeat - until true - return i -end -assert(foo17() == 9) - -local terra foo18() - var a : int, b : double = 2.5,2.5 - return a,b -end - -test.meq({2,2.5},foo18()) - -failit(function() - local function doit() - return 1 + {} - end - return `[doit()] -end) - -failit(function() -local terra foo19() - var a : 3, b : double = 2.5,2.5 - return a,b -end -foo19() -end) - -failit(function() -local terra foo20() - var a : int, a : double = 2.5,2.5 - return a,a -end -foo20() -end) - -foo21s = symbol() - -local terra foo21() - var [foo21s],b = 3,4 - return b + foo21s -end -assert(foo21() == 7) - -failit(function() -local terra foo20() - var ["a"] : int, ["b"] = 4,5 - return a -end -end) - -failit(function() - return quote var a end -end) - -astring = "astring" - -local terra foo22() - return astring[0] -end - -assert(foo22() == 97) - -local aquote = `7 -local atree = aquote.tree - -terra foo23() - return atree -end - -assert(foo23() == 7) - -terra foo24(a : int) - return 3,4 + a -end - -terra foo25() - var c,a,b = 4,foo24(3) - return a + b + c -end - - - -assert(foo25() == 14) - -local obfuscate = { foo24 } -terra foo26() - var c,a,b = 4,obfuscate(3) - return a + b + c -end - -local obfuscate2 = { `foo24(3) } -terra foo27() - obfuscate2 - foo24(3) -end -foo27() - -assert(foo26() == 14) - -failit(function() -local terra foo26a(a : int) - if a == 0 then - return a - else - return foo26a(a - 1) + 1 - end -end -foo26a(3) -end) - -local terra foo26b(a : int) : int - if a == 0 then - return a - else - var foo26bptr = foo26b - return foo26b(a - 1) + foo26bptr(0) + 1 - end -end - -assert(foo26b(3) == 3) - - -failit(function() - (terra() return (3)(4) end)() -end) - -failit(function() - local terra notdefined - local terra callnotdefined() - return notdefined(1) - end - callnotdefined() -end) - - - local terra norets() - end - local terra callnotdefined() - return (norets()) - end - callnotdefined() - -local terra returns2() return 1,2 end - -terra foo29(a : int) - if a > 1 then - return (returns2()._0) - else - return 5 - end -end - -assert(foo29(3) == 1 and foo29(0) == 5) - - -terra foo30() - print(4) -end - -foo30() - - -local terra notdefined -local terra definedtwice(a : int) return a end -terra definedtwice(a : int, b : int) return a + b end - -failit(function() -local terra foo31() - return (notdefined), (definedtwice) -end -foo31() -end) - -terra foo35() - return definedtwice(3) + definedtwice(3,4) -end - - -local terra foo36() - var r = returns2() - return definedtwice(unpackstruct(r)) -end -assert(3 == foo36()) - -assert(foo35() == 10) - -struct B { - a : int; - b : double; -} - -terra B:add() - return self.a + self.b -end - -terra B:inc(v : int) - self.a = self.a + v -end - -B.metamethods.__apply = terra(self : &B, v :int) - return v + v -end - -B.metamethods.__entrymissing = macro(function() return 8 end) - -struct C { - a : int; -} - -terra B.metamethods.__add(self : &B, a : int, b : int) - return self.a + a -end -terra B.metamethods.__add(self : &B, a : int, b : int, c : int) - return self.a + a -end - - -function myvoid() - print("CALLED") -end -terra testcallvoid() - myvoid() -end -print("BEFORE") -testcallvoid() -print("AFTER") - -terra C.metamethods.__add(b : &B, c : &C) - return b.a + c.a -end - -terra foo40() - var b = B { 5,6 } - var c = C { 3 } - var ptrb = &b - b:inc(3) - ptrb:inc(3) - return b:add() + ptrb:add() + b(3) + ptrb(3) + b.foo + ptrb.foo + (b + c) -end - -assert(foo40() == 8 + 8 + 6 + 6 + 6 + 11 + 6 + 11 + 3 + 11) -B.metamethods.__add = macro(function(b,c) return `b.a + c.a + 1 end) -terra foo41() - var b = B { 5,6 } - var c = C { 3 } - var ptrb = &b - b:inc(3) - ptrb:inc(3) - return b:add() + ptrb:add() + b(3) + ptrb(3) + b.foo + ptrb.foo + (b + c) -end - -assert(foo41() == 8 + 8 + 6 + 6 + 6 + 11 + 6 + 11 + 3 + 11 + 1) - -terra foo32() - var a = B { b = 3, a = 4 } - var ptra = &a - a.b = a.b + 1 - ptra.a = ptra.a + (@ptra).a + 1 - return a.a, a.b -end - -test.meq({9,4},foo32()) - -terra foo33() - return (vector(3,4,5) + vectorof(double,3,4,5))[0] + sizeof(double) -end - -local notinscope = symbol() - -failit(function() - local terra foo34() - return notinscope - end - foo34() -end) - -local gbl = global(int) - -terra foo37() - gbl = 4 -end -foo37() - -assert(gbl:get() == 4) -assert(foo33() == 14) - -local C = terralib.includec("stdio.h") - -terra foo38() - C.printf("hello, world %f\n", 3.5f) -end -foo38() -local twice = macro(function(exp,call) - return quote - exp = exp + 1 + call._0 - exp = exp + 1 + call._0 - end -end) -terra foo39() - var a = 4 - twice(a,returns2()) - return a -end - -assert(foo39() == 8) ---checkexp truncate and allowluaobjects behavior ---global variable resolution ---select/pointerselect/__get ---expression macro 1 return ---expression macro truncated ---expression macro expanded ---expression macro that returns a multi-ret function ---expression macro that returns a multi-ret function that was an argument ---function call, function call with multi-return, ---function call to overloaded function/undef function ---overloaded operator with mixed macro/function stuff ---reciever cast stuff \ No newline at end of file diff --git a/samples/Terra/staticmethod.t b/samples/Terra/staticmethod.t deleted file mode 100644 index 0ce91a4c..00000000 --- a/samples/Terra/staticmethod.t +++ /dev/null @@ -1,9 +0,0 @@ -struct A { -} -A.metamethods.__getmethod = function(self,idx) - return tonumber(string.sub(idx,2,-1)) -end -terra foo() - return A.f33 + A.b34 -end -assert(67 == foo()) \ No newline at end of file diff --git a/samples/Terra/stattest.t b/samples/Terra/stattest.t deleted file mode 100644 index 71380d2d..00000000 --- a/samples/Terra/stattest.t +++ /dev/null @@ -1,13 +0,0 @@ -local ffi = require("ffi") -if ffi.os == "Windows" then - return -end - -C,T = terralib.includec("sys/stat.h") -terra dostat() - var s : T.stat - C.stat("stattest.t",&s) - return s.st_size -end - -assert(dostat() == 210) diff --git a/samples/Terra/stencil.t b/samples/Terra/stencil.t deleted file mode 100644 index 1ce4d732..00000000 --- a/samples/Terra/stencil.t +++ /dev/null @@ -1,134 +0,0 @@ - -local C = terralib.includecstring [[ -#include -#include -#ifndef _WIN32 -#include -static double CurrentTimeInSeconds() { - struct timeval tv; - gettimeofday(&tv, NULL); - return tv.tv_sec + tv.tv_usec / 1000000.0; -} -#else -#include -static double CurrentTimeInSeconds() { - return time(NULL); -} -#endif - -int CalcTime(int * times, double * start) { - if(*times == 0) { - *start = CurrentTimeInSeconds(); - } else { - double elapsed = CurrentTimeInSeconds() - *start; - if(elapsed > 0.1f && *times >= 3) { - *start = elapsed / *times; - return 0; - } - } - (*times)++; - return 1; -} -]] - - -function symmat(name,I,...) - if not I then return symbol(name) end - local r = {} - for i = 0,I-1 do - r[i] = symmat(name..tostring(i),...) - end - return r -end - - - -local IO = terralib.includec("stdio.h") - - - -NI,NJ = 1,4 -V = 8 -terra uload(d : &float) - return terralib.attrload([&vector(float,V)](d), { align = 4 }) -end -terra ustore(d : &float, v : vector(float,V)) - terralib.attrstore([&vector(float,V)](d), v, { align = 4 }) -end - -terra runit(N : int, input : &float, output : &float) - input = input + N*NI + V*NJ - output = output + N*NI + V*NJ - for i = NI, N-NI,NI do - for j = V*NJ, N-V*NJ,V*NJ do - [(function() - local C = symmat("C",NI,NJ) - local stmts = terralib.newlist() - for iii = 0,NI-1 do for jjj = 0,NJ-1 do - stmts:insert(quote - var [C[iii][jjj]] : vector(float,V) = 0 - end) - end end - - for ii = -1,1 do - for jj = -1,1 do - for iii = 0,NI-1 do for jjj = 0,NJ-1 do - if math.abs(ii) + math.abs(jj) ~= 2 then - stmts:insert(quote - var d = uload(input + N * (ii + iii) + jj + V*jjj); - [C[iii][jjj]] = [C[iii][jjj]] + d - end) - end - end end - end - end - for iii = 0,NI-1 do for jjj = 0,NJ-1 do - stmts:insert(quote - ustore(output + N * (iii) + V*jjj, [C[iii][jjj]]) - end) - end end - return stmts - end)()] - input = input + V*NJ - output = output + V*NJ - end - input = input + 2*V*NJ - output = output + 2*V*NJ - end -end - -terra doit() - var N = 2048 - var img = [&float](C.malloc(N*N*sizeof(float))) - var img2 = [&float](C.malloc(N*N*sizeof(float))) - - for i = 0, N do - for j = 0, N do - img[i*N+j] = 1 - end - end - - var times = 0 - var mytime : double - while C.CalcTime(×,&mytime) ~= 0 do - runit(N,img,img2) - end - - C.printf("times = %d\n",times) - for i = NI, N-NI do - for j = V*NJ, N-V*NJ do - if img2[i*N+j] ~= 5 then - C.printf("wrong! %d %d %f\n",i,j,img2[i*N+j]) - goto out - end - end - end - ::out:: - var togiga = 1.0/(1024*1024*1024) - var pixels = (N-NI)*(N-V*NJ) - C.printf("%f %f %f\n", mytime, pixels*4*2 *togiga / mytime, 5*pixels * togiga / mytime) - -end -doit() -runit:disas() -doit() diff --git a/samples/Terra/strerror.t b/samples/Terra/strerror.t deleted file mode 100644 index 6eb0b83f..00000000 --- a/samples/Terra/strerror.t +++ /dev/null @@ -1,9 +0,0 @@ -string=terralib.includec("string.h") -buf=terralib.new(int8[1024]) -ffi = require "ffi" -if ffi.os == "Windows" then - string.strerror_s(buf,1024,1) -else - string.strerror_r(1,buf,1024) -end -print(ffi.string(buf)) diff --git a/samples/Terra/string.t b/samples/Terra/string.t deleted file mode 100644 index d44388eb..00000000 --- a/samples/Terra/string.t +++ /dev/null @@ -1,15 +0,0 @@ - -local c = terralib.includec("stdio.h") - -terra foo() - var a = "whatwhat\n" - return c.puts(a) -end - -local test = require("test") -local ffi = require("ffi") -if ffi.os == "Windows" then - test.eq(foo(),0) -else - test.eq(foo(),10) -end \ No newline at end of file diff --git a/samples/Terra/struct.t b/samples/Terra/struct.t deleted file mode 100644 index 5c3f96cd..00000000 --- a/samples/Terra/struct.t +++ /dev/null @@ -1,50 +0,0 @@ ---the zero line -struct A { b : B } and -struct B {a : int, b : int} - -terra bar(a : B) - a.a = a.a + 1 - return a,3 -end - -terra foo() - var a : B - a.a = 4; - --(bar(a)).a = 3, TODO: why is the offset == 0 for this value? - var c,d = bar(a) - return c.a + a.a + d -end - - -terra baz(a : &B) - a.a = 1 - a.b = 2 - return a.a -end - - -terra foo2() - var a : B - var d = baz(&a) - return a.a + a.b + d -end -local test = require("test") - -test.eq(foo(),12) -test.eq(foo2(),4) - - -local C = tuple(int, int) - -local D = tuple(int, int) - -terra anon() - var c : C - c._0 = 3 - c._1 = 4 - var d : D = c - --var b : B = d - return d._0 + d._1 -end - -test.eq(anon(),7) \ No newline at end of file diff --git a/samples/Terra/structarg.t b/samples/Terra/structarg.t deleted file mode 100644 index c3d1f4ed..00000000 --- a/samples/Terra/structarg.t +++ /dev/null @@ -1,9 +0,0 @@ -terra foobar() - var a = { a=3,b=4} - var b = {a=5,b=6.0} - b = a - return a.a -end - -local test = require("test") -test.eq(foobar(),3) \ No newline at end of file diff --git a/samples/Terra/structcast.t b/samples/Terra/structcast.t deleted file mode 100644 index 9b84a258..00000000 --- a/samples/Terra/structcast.t +++ /dev/null @@ -1,38 +0,0 @@ -struct A { a : int } -struct B {a : int, b : A} - -local D = tuple(double, A) - -terra anon() - var b : B - b.a = 4 - b.b.a = 3 - - var d : D - d._0 = 1.0 - d._1.a = 2 - - b = B(d) - - return b.a + b.b.a -end - -terra anon2() - var b = B { b = A{ 2.0 }, a = 4 } - var b2 = B { a = 4, b = A{ 2.0 } } - var b3 = B{ 4, A{2.0} } - return b.a + b.b.a + b2.a + b2.b.a + b3.a + b3.b.a -end - -terra anon3() - return {5,A{6}} -end - -terra anon4() - var b = B(anon3()) - return b.a + b.b.a -end -test = require("test") -test.eq(anon(),3) -test.eq(anon2(),18) -test.eq(anon4(),11) \ No newline at end of file diff --git a/samples/Terra/structconstructor.t b/samples/Terra/structconstructor.t deleted file mode 100644 index 8a9bd5c9..00000000 --- a/samples/Terra/structconstructor.t +++ /dev/null @@ -1,9 +0,0 @@ -struct A { a : int, b : int} - -terra foobar() - var a = A { 3, 4} - return a.b -end - -local test = require("test") -test.eq(foobar(),4) \ No newline at end of file diff --git a/samples/Terra/structrvalue.t b/samples/Terra/structrvalue.t deleted file mode 100644 index 31c0f6eb..00000000 --- a/samples/Terra/structrvalue.t +++ /dev/null @@ -1,16 +0,0 @@ ---the zero line -struct A { b : B } and -struct B {a : int, b : int} - - -terra foo() - var b = B {1,2} - return b -end - -terra bar() - return foo().b -end - -local test = require("test") -test.eq(bar(),2) \ No newline at end of file diff --git a/samples/Terra/structsyntax.t b/samples/Terra/structsyntax.t deleted file mode 100644 index 43d1b06a..00000000 --- a/samples/Terra/structsyntax.t +++ /dev/null @@ -1,14 +0,0 @@ -struct A { - a : int - b : float - union { - c : int - d : float - } -} - -terra foo() - return A { a = 4, b = 5, c = 3} -end - -assert(foo().c == 3) \ No newline at end of file diff --git a/samples/Terra/sugar.t b/samples/Terra/sugar.t deleted file mode 100644 index 6870fde5..00000000 --- a/samples/Terra/sugar.t +++ /dev/null @@ -1,15 +0,0 @@ - -local foo = &int - - -local a = int -> {bool,int} - -print(a.name) - -terra foo2() - -end - - - -local test = require("test") diff --git a/samples/Terra/sumlanguage1.t b/samples/Terra/sumlanguage1.t deleted file mode 100755 index 84889622..00000000 --- a/samples/Terra/sumlanguage1.t +++ /dev/null @@ -1,2 +0,0 @@ -import "lib/sumlanguage" -assert((sum 1.0f,2LL,2ULL,3.0,1U,1 done)==10) \ No newline at end of file diff --git a/samples/Terra/sumlanguage2.t b/samples/Terra/sumlanguage2.t deleted file mode 100755 index 7c84b980..00000000 --- a/samples/Terra/sumlanguage2.t +++ /dev/null @@ -1,4 +0,0 @@ -import "lib/sumlanguage2" -a = 2 -local b = 3 -assert(sum 1,a,b done == 6) \ No newline at end of file diff --git a/samples/Terra/symbolmangling.t b/samples/Terra/symbolmangling.t deleted file mode 100644 index 70c5ad79..00000000 --- a/samples/Terra/symbolmangling.t +++ /dev/null @@ -1,4 +0,0 @@ -C = terralib.includecstring [[ - #include -]] -C.fopen("broken.t","r") diff --git a/samples/Terra/symbolvar.t b/samples/Terra/symbolvar.t deleted file mode 100644 index 4d4b0cbd..00000000 --- a/samples/Terra/symbolvar.t +++ /dev/null @@ -1,11 +0,0 @@ - - -local a = symbol() - -terra foo() - var [a] = 3 - return [a] -end - -local test = require("test") -test.eq(3,foo()) \ No newline at end of file diff --git a/samples/Terra/symbolvar2.t b/samples/Terra/symbolvar2.t deleted file mode 100644 index 1195e539..00000000 --- a/samples/Terra/symbolvar2.t +++ /dev/null @@ -1,16 +0,0 @@ - - -local a = symbol() - -local q = quote - [a] = [a] + 1 -end - -terra foo() - var [a] = 2 - q - return [a] -end - -local test = require("test") -test.eq(3,foo()) \ No newline at end of file diff --git a/samples/Terra/symbolvar3.t b/samples/Terra/symbolvar3.t deleted file mode 100644 index 5eed2aaa..00000000 --- a/samples/Terra/symbolvar3.t +++ /dev/null @@ -1,16 +0,0 @@ - - -local a = symbol() - -local q = quote - var [a] = 2 - [a] = [a] + 1 -end - -terra foo() - q - return [a] -end - -local test = require("test") -test.eq(3,foo()) \ No newline at end of file diff --git a/samples/Terra/symbolvar4.t b/samples/Terra/symbolvar4.t deleted file mode 100644 index 1db5c832..00000000 --- a/samples/Terra/symbolvar4.t +++ /dev/null @@ -1,16 +0,0 @@ -local a = symbol() -local b = symbol(int) - -local c = symbol(int) -local d = symbol() - - -terra foo() - var [a],[b] = 1.25,1.25 - var [c],[d] = 3.25,3.25 - return [a] + [b] + [c] + [d] -end - -local test = require("test") - -test.eq(foo(),8.50) \ No newline at end of file diff --git a/samples/Terra/symbolvar5.t b/samples/Terra/symbolvar5.t deleted file mode 100644 index 6028bb13..00000000 --- a/samples/Terra/symbolvar5.t +++ /dev/null @@ -1,16 +0,0 @@ -local a = symbol() -local b = { symbol(int), symbol(int) } - -local c = symbol(int) -local d = { symbol(), symbol() } - - -terra foo() - var [a],[b] = 1.25,1.25,1.25 - var [c],[d] = 3.25,3.25,3.25 - return [a] + [b[1]] + [b[2]] + [c] + [d[1]] + [d[2]] -end - -local test = require("test") - -test.eq(foo(),12.75) \ No newline at end of file diff --git a/samples/Terra/symbolvar6.t b/samples/Terra/symbolvar6.t deleted file mode 100644 index efd07137..00000000 --- a/samples/Terra/symbolvar6.t +++ /dev/null @@ -1,16 +0,0 @@ -local a = symbol() -local b = {} - -local c = symbol(int) -local d = {} - - -terra foo() - var [a],[b] = 1.25 - var [c],[d] = 3.25 - return [a] + [c] -end - -local test = require("test") - -test.eq(foo(),4.25) \ No newline at end of file diff --git a/samples/Terra/symbolvar7.t b/samples/Terra/symbolvar7.t deleted file mode 100644 index 5c0bc621..00000000 --- a/samples/Terra/symbolvar7.t +++ /dev/null @@ -1,15 +0,0 @@ -local a = symbol() -local b = { symbol(int), symbol(int) } - -local c = symbol(int) -local d = symbol(double) - -terra foo() - var [a] : double,[b] = 1.25,1.25,1.25 - var [c] : double,[d] : int = 3.25,3.25 - return [a] + [b[1]] + [b[2]] + [c] + [d] -end - -local test = require("test") - -test.eq(foo(),9.50) \ No newline at end of file diff --git a/samples/Terra/symparam.t b/samples/Terra/symparam.t deleted file mode 100644 index 9aea4d3a..00000000 --- a/samples/Terra/symparam.t +++ /dev/null @@ -1,9 +0,0 @@ - -local a = symbol() -terra foo([a] : int, b : int) - return [a] + b -end - -local test = require("test") - -test.eq(foo(1,2),3) \ No newline at end of file diff --git a/samples/Terra/symparam2.t b/samples/Terra/symparam2.t deleted file mode 100644 index f6c7e393..00000000 --- a/samples/Terra/symparam2.t +++ /dev/null @@ -1,9 +0,0 @@ - -local a = symbol(int) -terra foo([a], [a], b : int) - return [a] + b -end - -local test = require("test") - -test.eq(foo(1,2,4),6) \ No newline at end of file diff --git a/samples/Terra/symparam3.t b/samples/Terra/symparam3.t deleted file mode 100644 index 35b3e40b..00000000 --- a/samples/Terra/symparam3.t +++ /dev/null @@ -1,15 +0,0 @@ - -local a = symbol(int) -local c = {} -terra foo([a], b : int, [c]) - return [a] + b -end -local d = {symbol(int),symbol(int)} -terra foo2([a], b : int, [d]) - return [a] + b + [d[1]] + [d[2]] -end - -local test = require("test") - -test.eq(foo2(1,2,3,4),10) -test.eq(foo(1,2),3) \ No newline at end of file diff --git a/samples/Terra/template.t b/samples/Terra/template.t deleted file mode 100644 index b305aeb9..00000000 --- a/samples/Terra/template.t +++ /dev/null @@ -1,6 +0,0 @@ - -terra foo() - -end - -local test = require("test") diff --git a/samples/Terra/terracast.t b/samples/Terra/terracast.t deleted file mode 100644 index 05df48f7..00000000 --- a/samples/Terra/terracast.t +++ /dev/null @@ -1,15 +0,0 @@ - - - -function addone(a) - return a + 1 -end - - -local a1 = terralib.cast(int -> int, addone) - -terra dofn(a : int -> int) - return a(3) -end -local test = require("test") -test.eq(dofn(a1),4) \ No newline at end of file diff --git a/samples/Terra/terralua.t b/samples/Terra/terralua.t deleted file mode 100644 index 8084f68c..00000000 --- a/samples/Terra/terralua.t +++ /dev/null @@ -1,32 +0,0 @@ -function dog(...) - print("Hi. This is Dog.",...) -end - -terra foo() - dog() -end - -terra passanarg() - dog(3,4,5,nil) -end - -function takesastruct(a) - print(a.a,a.b) - a.a = a.a + 1 -end -struct A { a : int , b : double } -terra passastruct() - var a = A {1,3.4} - --takesastruct(a) luajit doesn't like having structs passed to its callbacks by value? - var b = a.a - takesastruct(&a) - var c = a.a - return b + c -end - -foo() -passanarg() - -local test = require("test") - -test.eq(passastruct(),3) diff --git a/samples/Terra/terraluamethod.t b/samples/Terra/terraluamethod.t deleted file mode 100644 index 09de7b2d..00000000 --- a/samples/Terra/terraluamethod.t +++ /dev/null @@ -1,16 +0,0 @@ -struct A { a : int } - -A.methods.up = function(self,b) - self.a = self.a + 1 + (b or 0) -end - -terra foo() - var a = A { 1 } - a:up() - var b = &a - b:up(4) - return a.a -end - -local test = require("test") -test.eq(foo(),7) \ No newline at end of file diff --git a/samples/Terra/terranew.t b/samples/Terra/terranew.t deleted file mode 100644 index 67336e38..00000000 --- a/samples/Terra/terranew.t +++ /dev/null @@ -1,19 +0,0 @@ - - -A = terralib.new(int[4],{1,2,3,4}) - -terra foo(a : &int) - var sum = 0 - for i = 0,4 do - sum = sum + a[i] - end - return sum,a -end - -local test = require("test") - -local a,b = terralib.unpackstruct(foo(A)) - -test.eq(a,10) -test.eq(terralib.typeof(A),int[4]) -test.eq(terralib.typeof(b),&int) \ No newline at end of file diff --git a/samples/Terra/testdebug.t b/samples/Terra/testdebug.t deleted file mode 100644 index b155e795..00000000 --- a/samples/Terra/testdebug.t +++ /dev/null @@ -1,57 +0,0 @@ -if not terralib.traceback then return end ---this test require debug on, if it is not on, relaunch with it on -if 0 == terralib.isdebug then - assert(0 == os.execute(terralib.terrahome.."/bin/terra -g testdebug.t")) - return -end -C = terralib.includec("stdio.h") - -terra foo(a : int, b : int) - var c = a + b - return c * 2 -end - -local ptr = terralib.cast(rawstring,foo:getdefinitions()[1]:getpointer()) - -terra findptr(a : &opaque) - var si : terralib.SymbolInfo - var li : terralib.LineInfo - terralib.lookupsymbol(a,&si) - C.printf("p = %p, addr = %p, sz = %d, nm = %.*s\n",a,si.addr,[int](si.size), si.namelength,si.name) - terralib.lookupline(si.addr,a, &li) - C.printf("line = %.*s:%d\n",li.namelength,li.name,[int](li.linenum)) - return li.linenum -end -assert(11 == findptr(ptr+6)) -assert(10 == findptr(ptr+4)) -local ra = terralib.intrinsic("llvm.returnaddress", int32 -> &opaque ) -local fa = terralib.intrinsic("llvm.frameaddress", int32 -> &opaque ) -terra testbt3() - var frames : (&opaque)[128] - terralib.traceback(nil) - var N = terralib.backtrace(frames,128,ra(0),fa(1)) - for i = 0,N do - C.printf("%p ",frames[i]) - var nm : rawstring - var nmL : uint64 - var si : terralib.SymbolInfo - if terralib.lookupsymbol(frames[i],&si) then - C.printf("frame %.*s\n", si.namelength, si.name) - else - C.printf("\n") - end - end -end -testbt3:setinlined(false) -terra fn2() - testbt3() - C.printf("fn2\n") - return 1 -end -terra what() - fn2() - C.printf("what\n") -end -fn2:setinlined(false) -what() -terralib.disas(terralib.traceback,5,5) \ No newline at end of file diff --git a/samples/Terra/testimport.t b/samples/Terra/testimport.t deleted file mode 100644 index e2ef63db..00000000 --- a/samples/Terra/testimport.t +++ /dev/null @@ -1,6 +0,0 @@ - -local r,e = terralib.loadstring [[ -import "lib.fakeimport" -]] - -assert(e:match("stack traceback")) \ No newline at end of file diff --git a/samples/Terra/testlang1.t b/samples/Terra/testlang1.t deleted file mode 100755 index 89496035..00000000 --- a/samples/Terra/testlang1.t +++ /dev/null @@ -1,21 +0,0 @@ -import "lib/testlang" - -print("hello") -local a = image "astring" -image 4 -image and,or,& -image image -image akeyword -image foobar -print(a) -image bar 3 -print(bar,bar1) - -local image what 4 3 -print(what) -local a = 4 -local b = 5 -c = 6 -print(foolist { a, b, c}) ---test eos token -image diff --git a/samples/Terra/testlang2.t b/samples/Terra/testlang2.t deleted file mode 100755 index b4d1229f..00000000 --- a/samples/Terra/testlang2.t +++ /dev/null @@ -1,4 +0,0 @@ -import "lib/testlang" - -local a = image "astring" -print(a) diff --git a/samples/Terra/testlog.t b/samples/Terra/testlog.t deleted file mode 100644 index 2e015773..00000000 --- a/samples/Terra/testlog.t +++ /dev/null @@ -1,8 +0,0 @@ -terra foo(a : bool, b : bool, c : bool) return a and b or c end - -foo:disas() -terra callfoo() - var r = foo(true,false,true) - return r -end -assert(callfoo()) \ No newline at end of file diff --git a/samples/Terra/testrequire.t b/samples/Terra/testrequire.t deleted file mode 100644 index e72084de..00000000 --- a/samples/Terra/testrequire.t +++ /dev/null @@ -1,14 +0,0 @@ -local f = assert(io.popen("uname", 'r')) -local s = assert(f:read('*a')) -f:close() - -if s~="Darwin\n" then - print("Warning, not running test b/c this isn't a mac") -else - -local A = require("lib.objc") -local B = require("lib.objc") - -assert(A == B) - -end \ No newline at end of file diff --git a/samples/Terra/teststd.t b/samples/Terra/teststd.t deleted file mode 100644 index 8df604a9..00000000 --- a/samples/Terra/teststd.t +++ /dev/null @@ -1,45 +0,0 @@ -local S = require "std" - -c = global(int,0) - -struct A(S.Object) { - a : int; - b : int[5]; -} -struct C { - a : int -} -struct B(S.Object) { - a : A; - b : A[2]; - c : C[3]; - c2 : C; - c3 : C[2]; -} - -terra A:__destruct() - S.printf("A dtor!\n") - c = c + 1 -end -terra B:__destruct() - c = c + 10 -end -terra foo() - var a = A.salloc() -end - -foo() -assert(c:get() == 1) - -terra bar() - var b = B.salloc() -end -bar() -assert(c:get() == 14) - -terra baz() - var b = B.alloc() - b:delete() -end -baz() -assert(c:get() == 27) \ No newline at end of file diff --git a/samples/Terra/testvector.t b/samples/Terra/testvector.t deleted file mode 100644 index 7ba46c2b..00000000 --- a/samples/Terra/testvector.t +++ /dev/null @@ -1,57 +0,0 @@ - -local S = require "std" - -local floatv = S.Vector(int) -terra foo() - var a = floatv.salloc():init() - for i = 0,100 do - a:insert(i) - end - for i = 0,50 do - a:insert(0,i) - end - for i = 0,50 do - a:insert(1,2,i) - end - for i = 0ULL,a:size() do - a(i) = a(i) + 1 - end - for i = 0ULL,50 do - @a:insert() = 5 - end - var s = 0 - for i = 0ULL,a:size() do - s = s + a(i) - end - var z = a:size() - S.assert(a:remove() == 5) - S.assert(a:size() == z - 1) - S.assert(a:remove(0) == 50) - S.assert(a:remove(0) == 50) - S.assert(a:remove(0) == 50) - S.assert(a(1) == 49) - return s -end -assert(foo() == 8875 + 5 *50) - -local g = global(int,0) - -struct A (S.Object) { - a : int -} - -terra A:__destruct() - g = g + self.a -end - -assert(S.Vector(int) == S.Vector(int)) - -terra foo2() - var a = [S.Vector(A)].salloc():init() - for i = 0,50 do - a:insert().a = i - end -end - -foo2() -assert(g:get() == 49*50/2) \ No newline at end of file diff --git a/samples/Terra/torturechain.t b/samples/Terra/torturechain.t deleted file mode 100644 index 91af6a06..00000000 --- a/samples/Terra/torturechain.t +++ /dev/null @@ -1,67 +0,0 @@ - -terra foo() - return 8.0,9 -end - -local torturechain = quote - var a = 3.0 -in - [quote - var b = 4 - in - [quote - var c = 5.0 - in - a,b,c, [quote - var d = 6 - in - [quote - var e = 7.0 - in - d,e,foo() - end] - end] - end] - end] -end - -terra bindit() - var a,b,c,r1 = torturechain - var d,e,r2 = r1 - var f,g = r2 - return a + b + c + d + e + f + g -end - -local sum = 3+4+5+6+7+8+9 -assert(sum == bindit()) - -terra foo(z : int, a : int, b : int, c : int, d : int, e : int, f : int, g : int) - return z + a + b + c + d + e + f + g -end - - -terra overloadit(a : int, b : int, c : int, d : int, e : int, f : int) - return 0 -end - -terra overloadit(a : double, b : int, c : int, d : int, e : int, f : int) - return 1 -end - - -terra callit() - var a,b,c,r1 = torturechain - var d,e,r2 = r1 - var f,g = r2 - return foo(0,a,b,c,d,e,f,g) -end - -terra callol() - var a,b,c,r1 = torturechain - var d,e,r2 = r1 - var f,g = r2 - return overloadit(a,b,c,e,f,g) -end - -assert(callit() == sum) -assert(callol() == 1) diff --git a/samples/Terra/toterraexpression.t b/samples/Terra/toterraexpression.t deleted file mode 100644 index ba31fb7a..00000000 --- a/samples/Terra/toterraexpression.t +++ /dev/null @@ -1,8 +0,0 @@ -local x = setmetatable({a = 4}, { __toterraexpression = function(self) return self.a end}) - - -local terra foo() - return x -end - -assert(foo() == 4) \ No newline at end of file diff --git a/samples/Terra/twolang.t b/samples/Terra/twolang.t deleted file mode 100644 index fddc25e6..00000000 --- a/samples/Terra/twolang.t +++ /dev/null @@ -1,23 +0,0 @@ - -do -import "lib/foolang" -a = foo bar -import "lib/barlang" -b = bar foo -assert( foo bar + bar foo == 3) -assert(a + b == 3) -end - -local function failparse(str,match) - local r,msg = terralib.loadstring(str) - assert(not r) - local match = msg:match(match) - if not match then print(msg) end - assert(match) -end - -failparse("return (foo bar + bar foo)", "near 'bar'") -failparse('import "lib/foolang";return (foo bar + bar foo)', "near foo") -failparse('import "lib/foolang"; import "lib/foolang";',"entrypoint 'foo' already defined") - -do import "lib/foolang" end do import "lib/foolang" end \ No newline at end of file diff --git a/samples/Terra/typeexp.t b/samples/Terra/typeexp.t deleted file mode 100644 index 6f29586e..00000000 --- a/samples/Terra/typeexp.t +++ /dev/null @@ -1,9 +0,0 @@ -atype = int -terra foo(a : atype) - var b : &atype = &a - return @b -end - -local test = require("test") - -test.eq(foo(3),3) \ No newline at end of file diff --git a/samples/Terra/union.t b/samples/Terra/union.t deleted file mode 100644 index eb18b998..00000000 --- a/samples/Terra/union.t +++ /dev/null @@ -1,26 +0,0 @@ - -struct A { a : int, union { c : int8[6], b : int }, d : float, union { e : int, f : float }, g : int } -struct B { union { b : int , c : int8[6] }, a : int } -local C = struct { union { union { b : int} , c : int8[6] }, w : int } -terra foo() - var a : A - var b : B - var c : C - a.b = 4 - a.a = 5 - a.c[4] = 3 - a.d = 4 - return a.a + a.b + a.c[4] + a.d -end - -struct Stuff { union { a : int, b : float } } - -terra what() - var a : Stuff, b : Stuff - a.a,b.a = 3,4 - return a.b/b.b --== .75, this is the best bad interview question -end - -local test = require("test") -test.eq(foo(),16) -test.eq(what(),.75) \ No newline at end of file diff --git a/samples/Terra/unm.t b/samples/Terra/unm.t deleted file mode 100644 index 665e2060..00000000 --- a/samples/Terra/unm.t +++ /dev/null @@ -1,20 +0,0 @@ - - -struct A { - a : int -} - -A.metamethods.__unm = terra(self : &A) - return A { -self.a } -end - -A.metamethods.__sub = terra(self : &A, rhs : &A) - return A { self.a - rhs.a } -end - -terra doit() - var a,b = A { 1 } , A { 2 } - return (-(a - b)).a -end - -assert(doit() == 1) \ No newline at end of file diff --git a/samples/Terra/unpacktuple.t b/samples/Terra/unpacktuple.t deleted file mode 100644 index 7701455f..00000000 --- a/samples/Terra/unpacktuple.t +++ /dev/null @@ -1,30 +0,0 @@ - - -terra foo() - return 1,2 -end - -terra foo2() - return {a = 1, b = 2} -end - -assert(unpacktuple(1) == 1) -assert(unpacktuple(foo()) == 1) - -assert(unpacktuple(foo(),2) == 2) - -assert(unpacktuple(foo(),nil,1) == 1) -assert(unpacktuple(foo2()).a == 1) - -assert(2 == #{unpacktuple(foo())}) - -assert(1 == #{unpacktuple(foo(),2)}) - -terra usefoo() - var a = foo() - var c,d = unpacktuple(a) - var e = unpacktuple(a,2) - return e -end - -assert(usefoo() == 2) \ No newline at end of file diff --git a/samples/Terra/unsafesym.t b/samples/Terra/unsafesym.t deleted file mode 100644 index c8d2f2f2..00000000 --- a/samples/Terra/unsafesym.t +++ /dev/null @@ -1,14 +0,0 @@ - -local mymacro = macro(function(a) - a = a:asvalue() - print(a, terralib.issymbol(a), terralib.unsafetypeofsymbol(a)) - return {} -end) - - - -terra foo(a : int) - mymacro(a) -end - -foo:compile() \ No newline at end of file diff --git a/samples/Terra/unstrict.t b/samples/Terra/unstrict.t deleted file mode 100644 index a4292ec0..00000000 --- a/samples/Terra/unstrict.t +++ /dev/null @@ -1,5 +0,0 @@ -Strict.__newindex,Strict.__index = nil,nil - -print(b) -terra foo() end -print(c) \ No newline at end of file diff --git a/samples/Terra/usercast.t b/samples/Terra/usercast.t deleted file mode 100644 index f35bec84..00000000 --- a/samples/Terra/usercast.t +++ /dev/null @@ -1,24 +0,0 @@ - -struct A { a : int, b : float } - -function A.metamethods.__cast(from,to,exp) - if from == int and to == A then - return `A {exp, 1.f } - elseif from == float and to == A then - return `A { 1, exp } - end - error("invalid") -end - - -terra moo(a : A) - return a.a + a.b -end - -terra bar() - return moo(1) + moo(1.f) -end - -local test = require("test") - -test.eq(bar(), 4) \ No newline at end of file diff --git a/samples/Terra/varargcstring.t b/samples/Terra/varargcstring.t deleted file mode 100644 index a9406390..00000000 --- a/samples/Terra/varargcstring.t +++ /dev/null @@ -1,2 +0,0 @@ -C = terralib.includec("stdio.h") -C.printf("hello, %d\n",3) \ No newline at end of file diff --git a/samples/Terra/vars.t b/samples/Terra/vars.t deleted file mode 100644 index a8f38d3b..00000000 --- a/samples/Terra/vars.t +++ /dev/null @@ -1,23 +0,0 @@ - - -a = {} -a.b, a.c = global(3),global(double,4) -d = global(5) ---print(a.b) - ---a.b:gettype(nil) - -terra bar() - a.b = a.b + 1 - a.c = a.c + 1 - d = d + 1 -end -terra foo() - return a.b,a.c,d -end - - -local test = require("test") - -bar() -test.meq({4,5,6},foo()) \ No newline at end of file diff --git a/samples/Terra/vars2.t b/samples/Terra/vars2.t deleted file mode 100644 index e3556663..00000000 --- a/samples/Terra/vars2.t +++ /dev/null @@ -1,17 +0,0 @@ - -a = global(int) --testing variable with no initializer - - -terra foo() - a = 3 -end - -terra bar() - return a -end - - -local test = require("test") - -foo() -test.eq(bar(),3) \ No newline at end of file diff --git a/samples/Terra/vec.t b/samples/Terra/vec.t deleted file mode 100644 index b3d6790c..00000000 --- a/samples/Terra/vec.t +++ /dev/null @@ -1,27 +0,0 @@ - -terra foo(a : double) - var v0 : vector(double,3) = a - var v1 : vector(int,3) = 4 - var v2 = v0 / v1 - var v3 = (v0 <= v1) or (v1 >= v0) - var ptr = [&double](&v2) - return v3[0] or v3[1] or v3[2] - --return ptr[0] + ptr[1] + ptr[2] -end - - -N = 64 -terra addsomevecs(a : vector(double,N), b : vector(double,N), c : vector(double,N) ) - return (a + b) / c -end - - -terra foo2(a : double, b : double) - var c = addsomevecs(a,b,b) - return c[0] + c[1] -end - -local test = require("test") - -test.eq(foo(3), true) -test.eq(foo2(3,4), 3.5) \ No newline at end of file diff --git a/samples/Terra/vecarith.t b/samples/Terra/vecarith.t deleted file mode 100644 index 6a21b9ba..00000000 --- a/samples/Terra/vecarith.t +++ /dev/null @@ -1,138 +0,0 @@ ---[[ - -- -+ - -* -/ -% - -^ -and -or -~= == < > >= <= -<< >> - -]] - - -N = 2 - -types = {int,int64,uint64,float,double} -names = {"i","l","u","f","d"} -max = 16 - -for i = 1,#types do - local fenv = getfenv() - for j = 0,max do - local x = global(vector(types[i],N)); - (terra() x = j end)() - fenv[names[i]..j] = x - end -end - - -d375 = global(vector(double,N)) -d175 = global(vector(double,N)) -terra init() - d375 = 3.75 - d175 = 1.75 -end -init() - -terra test0() - var a = i1 + i3 - var b = l1 + l2 - var c = u1 + u2 - var d = f1 + f2 - var e = d1 + d2 - return (a + b + c + d + e)[1] -end - -terra test1() - var a = i1 - i3 - var b = l1 - l2 - var c = u1 - u2 - var d = f1 - f2 - var e = d1 - d2 - return (a - b - c - d - e)[1] -end - -terra test2() - var a = i2 * i3 - var b = l3 * l2 - var c = u3 * u2 - var d = f1 * f2 - var e = d3 * d2 - return (a * b * c * d * e)[1] -end - -terra test3() - var a = i2 / i3 + i1 - var b = l3 / l2 + i1 - var c = u3 / u2 - var d = f1 / f2 - var e = d3 / d2 - return (a * b * c * d * e)[1] -end - -terra test4() - var a = i2 % i3 - var b = l3 % l4 - var c = u3 % u2 - var d = f1 % f2 - var e = d375 % d2 - return ((a == i2) and (b == l3) and (d == f1) and (e == d175))[1] -end - -terra test5() - var a = i2 ^ i3 - var b = l3 ^ l4 - var c = u3 ^ u2 - return ((a == 1) and (b == l7) and (c == u1))[1] -end - -terra test6() - var a = i2 and i3 - var b = l3 and l4 - var c = u3 and u2 - return ((a == 2) and (b == l0) and (c == u2))[1] -end - -terra test7() - var a = i2 or i3 - var b = l3 or l4 - var c = u3 or u2 - return ((a == 3) and (b == l7) and (c == u3))[1] -end - - -terra test8() - var a0,a1 = i2 ~= i3, i2 == i3 - var b0,b1 = i2 < i3, i2 >= i3 - var c0,c1 = i2 > i3, i2 <= i3 - - return (a0 and not a1 and b0 and not b1 and not c0 and c1)[1] -end - -terra test9() - var a0, a1 = i8 >> i1, i8 << i1 - var b0, b1 = -i8 >> i1, -i8 << i1 - return (a0 == i4 and a1 == i16 and b0 == -i4 and b1 == -i16)[1] -end - - -local test = require("test") - -test.eq(test0(),16) -test.eq(test1(),2) -test.eq(test2(),2592) -test.eq(test3(),1.5) - -test.eq(test4(),true) - -test.eq(test5(),true) -test.eq(test6(),true) -test.eq(test7(),true) -test.eq(test8(),true) -test.eq(test9(),true) \ No newline at end of file diff --git a/samples/Terra/veclit.t b/samples/Terra/veclit.t deleted file mode 100644 index 20e9aee8..00000000 --- a/samples/Terra/veclit.t +++ /dev/null @@ -1,29 +0,0 @@ - -terra foo() - var a = 2* vector(1,2,3) - return a[0] + a[1] + a[2] -end - -terra foo2() - var a = vector(1,2.5,3) - return a[1] -end -terra what() - return 3,4.5 -end -expwhat = macro(function(a) return {`a._0, `a._1} end) -terra foo3() - var a = vector(1,2.5,expwhat(what())) - return a[3] -end - -terra foo4() - var a = vectorof(int,1,2.5,3) - return a[1] -end - -local test = require("test") -test.eq(foo(),12) -test.eq(foo2(),2.5) -test.eq(foo3(),4.5) -test.eq(foo4(),2) \ No newline at end of file diff --git a/samples/Terra/vecobj.t b/samples/Terra/vecobj.t deleted file mode 100644 index 59eab9fa..00000000 --- a/samples/Terra/vecobj.t +++ /dev/null @@ -1,54 +0,0 @@ -local Vec = terralib.memoize(function(typ,N) - N = assert(tonumber(N),"expected a number") - local ops = { "__sub","__add","__mul","__div" } - local struct VecType { - data : typ[N] - } - VecType.metamethods.type, VecType.metamethods.N = typ,N - VecType.metamethods.__typename = function(self) return ("%s_%d"):format(tostring(self.metamethods.type),self.metamethods.N) end - for i, op in ipairs(ops) do - local i = symbol("i") - local function template(ae,be) - return quote - var c : VecType - for [i] = 0,N do - c.data[i] = operator(op,ae,be) - end - return c - end - end - local terra doop(a : VecType, b : VecType) [template(`a.data[i],`b.data[i])] end - terra doop(a : typ, b : VecType) [template(`a,`b.data[i])] end - terra doop(a : VecType, b : typ) [template(`a.data[i],`b)] end - VecType.metamethods[op] = doop - end - terra VecType.methods.FromConstant(x : typ) - var c : VecType - for i = 0,N do - c.data[i] = x - end - return c - end - VecType.metamethods.__apply = macro(function(self,idx) return `self.data[idx] end) - VecType.metamethods.__cast = function(from,to,exp) - if from:isarithmetic() and to == VecType then - return `VecType.FromConstant(exp) - end - error(("unknown conversion %s to %s"):format(tostring(from),tostring(to))) - end - return VecType -end) - -terra foo(v : Vec(float,4), w : Vec(float,4)) - var z : Vec(float,4) = 1 - var x = (v*4)+w+1 - for i = 0,4 do - print(x(i)) - end - return x(2) -end - -foo:printpretty(true,false) -foo:disas() - -assert(20 == foo({{1,2,3,4}},{{5,6,7,8}})) \ No newline at end of file diff --git a/samples/Terra/vecptr.t b/samples/Terra/vecptr.t deleted file mode 100644 index c853065f..00000000 --- a/samples/Terra/vecptr.t +++ /dev/null @@ -1,4 +0,0 @@ -terra foo(a : &float) - var b = [&vector(float,4)](a) -end -foo:compile() \ No newline at end of file diff --git a/samples/Terra/vecsize.t b/samples/Terra/vecsize.t deleted file mode 100644 index 08043aee..00000000 --- a/samples/Terra/vecsize.t +++ /dev/null @@ -1,5 +0,0 @@ - -assert(terralib.sizeof(int)*3 <= terralib.sizeof(vector(int,3))) -assert(terralib.sizeof(vector(int,1)) == 4) -assert(terralib.sizeof(vector(int,4)) == 16) -assert(terralib.sizeof(vector(int,5)) == 32) \ No newline at end of file diff --git a/samples/Terra/vtablerec.t b/samples/Terra/vtablerec.t deleted file mode 100644 index 75e9ea56..00000000 --- a/samples/Terra/vtablerec.t +++ /dev/null @@ -1,30 +0,0 @@ - -struct V { - entry : {&A} -> {} -} and -struct A { - vtable : &V -} - -terra what(a : &A) : {} -end - -what:compile() - -terra bar() - var v : V - v.entry = what -end - -bar:compile() - ---[[ -{&A}->{} -&A -A -&V -V -&{&A}->{} -{&A}->{} - -]] \ No newline at end of file diff --git a/samples/Terra/zeroargs.t b/samples/Terra/zeroargs.t deleted file mode 100644 index 59b4356d..00000000 --- a/samples/Terra/zeroargs.t +++ /dev/null @@ -1,5 +0,0 @@ -local b = {} -terra foo() - return 1,b -end -foo() \ No newline at end of file diff --git a/samples/Terra/zeroreturn.t b/samples/Terra/zeroreturn.t deleted file mode 100644 index 406a3245..00000000 --- a/samples/Terra/zeroreturn.t +++ /dev/null @@ -1,18 +0,0 @@ - - -local b = global(0) - -terra foo(a : int) - if a > 3 then - return - end - b = a -end - -terra getb() return b end - -local test = require("test") -foo(4) -test.eq(getb(),0) -foo(2) -test.eq(getb(),2) \ No newline at end of file diff --git a/samples/Terra/zeroreturn2.t b/samples/Terra/zeroreturn2.t deleted file mode 100644 index 82f8e6df..00000000 --- a/samples/Terra/zeroreturn2.t +++ /dev/null @@ -1,17 +0,0 @@ - -a = global(0) - -terra doit() - a = a + 1 -end -terra geta() - return a -end - -terra bar() - return doit() -end - -bar() -local test = require("test") -test.eq(geta(),1) \ No newline at end of file From 2448ff83142a1d80927dc94791ca68563a73ac78 Mon Sep 17 00:00:00 2001 From: Vicent Marti Date: Fri, 11 Mar 2016 10:27:10 +0100 Subject: [PATCH 200/205] git-linguist: Print PWD --- bin/git-linguist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/git-linguist b/bin/git-linguist index 37d46b64..9e525bb5 100755 --- a/bin/git-linguist +++ b/bin/git-linguist @@ -111,7 +111,7 @@ def git_linguist(args) parser.parse!(args) git_dir = `git rev-parse --git-dir`.strip - raise "git-linguist must be ran in a Git repository" unless $?.success? + raise "git-linguist must be ran in a Git repository (#{Dir.pwd})" unless $?.success? wrapper = GitLinguist.new(git_dir, commit, incremental) case args.pop From faec60188f30e89b991dd3e5600cdeffc16b25d5 Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sat, 12 Mar 2016 11:04:53 +0100 Subject: [PATCH 201/205] Tests for .sql heuristic rules --- test/test_heuristics.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/test_heuristics.rb b/test/test_heuristics.rb index 7021e20b..c3a1c608 100644 --- a/test/test_heuristics.rb +++ b/test/test_heuristics.rb @@ -189,6 +189,16 @@ class TestHeuristcs < Minitest::Test }) end + # Candidate languages = ["SQL", "PLpgSQL", "SQLPL", "PLSQL"] + def test_sql_by_heuristics + assert_heuristics({ + "SQL" => ["SQL/create_stuff.sql", "SQL/db.sql", "SQL/dual.sql"], + "PLpgSQL" => all_fixtures("PLpgSQL", "*.sql"), + "SQLPL" => ["SQLPL/trigger.sql"], + "PLSQL" => all_fixtures("PLSQL", "*.sql") + }) + end + # Candidate languages = ["Perl", "Perl6"] def test_t_perl_by_heuristics assert_heuristics({ From 2a0b0e9f934573d5f61cedb6445202f242038bfa Mon Sep 17 00:00:00 2001 From: Paul Chaignon Date: Sat, 12 Mar 2016 11:17:29 +0100 Subject: [PATCH 202/205] Fix heuristic rule for PLpgSQL --- lib/linguist/heuristics.rb | 2 +- samples/PLpgSQL/procedures.sql | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 samples/PLpgSQL/procedures.sql diff --git a/lib/linguist/heuristics.rb b/lib/linguist/heuristics.rb index 666397d8..cbbcd03a 100644 --- a/lib/linguist/heuristics.rb +++ b/lib/linguist/heuristics.rb @@ -354,7 +354,7 @@ module Linguist end disambiguate ".sql" do |data| - if /^\\i\b|AS \$\$|LANGUAGE '+plpgsql'+/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data) + if /^\\i\b|AS \$\$|LANGUAGE '?plpgsql'?/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data) #Postgres Language["PLpgSQL"] elsif /(alter module)|(language sql)|(begin( NOT)+ atomic)/i.match(data) || /signal SQLSTATE '[0-9]+'/i.match(data) diff --git a/samples/PLpgSQL/procedures.sql b/samples/PLpgSQL/procedures.sql new file mode 100644 index 00000000..51b6bc94 --- /dev/null +++ b/samples/PLpgSQL/procedures.sql @@ -0,0 +1,31 @@ +load 'plpgsql'; +load 'plpgsql_lint'; + +DROP FUNCTION IF EXISTS list_sites(); +CREATE OR REPLACE FUNCTION list_sites() RETURNS TABLE (fc json) AS +$func$ +BEGIN +RETURN QUERY SELECT row_to_json(feat_col) FROM ( + SELECT 'FeatureCollection' AS type, array_to_json(array_agg(feat)) AS features FROM ( + SELECT DISTINCT ON (new_id) 'Feature' AS type, ST_ASGeoJSON(loc.geom)::json AS geometry, row_to_json( + (SELECT prop FROM (SELECT new_id) AS prop)) AS properties FROM location loc) AS feat) AS feat_col; +END; +$func$ LANGUAGE plpgsql; + + +DROP FUNCTION IF EXISTS get_observations(character varying, integer); +CREATE OR REPLACE FUNCTION get_observations(kind varchar, site_id integer) RETURNS TABLE (fc json) AS +$func$ +BEGIN + IF kind = 'o2_abs' THEN + RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM ( + SELECT observation_date AS date, o2_abs AS value FROM oxygen WHERE new_id = site_id) AS obs; + ELSIF kind = 'o2_rel' THEN + RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM ( + SELECT observation_date AS date, o2_rel AS value FROM oxygen WHERE new_id = site_id) AS obs; + ELSIF kind = 'temp' THEN + RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM ( + SELECT observation_date AS date, temp AS value FROM oxygen WHERE new_id = site_id) AS obs; + END IF; +END; +$func$ LANGUAGE plpgsql; From d2c7d27d13affd542d318a1f51ae77d96cb9c652 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Wed, 16 Mar 2016 21:30:18 -0600 Subject: [PATCH 203/205] Grammar update --- vendor/grammars/AutoHotkey | 2 +- vendor/grammars/Elm.tmLanguage | 2 +- vendor/grammars/Lean.tmbundle | 2 +- vendor/grammars/MagicPython | 2 +- vendor/grammars/NimLime | 2 +- vendor/grammars/Vala-TMBundle | 2 +- vendor/grammars/apache.tmbundle | 2 +- vendor/grammars/api-blueprint-sublime-plugin | 2 +- vendor/grammars/atom-language-stan | 2 +- vendor/grammars/ats.sublime | 2 +- vendor/grammars/chapel-tmbundle | 2 +- vendor/grammars/factor | 2 +- vendor/grammars/gap-tmbundle | 2 +- vendor/grammars/haxe-sublime-bundle | 2 +- vendor/grammars/jade-tmbundle | 2 +- vendor/grammars/kotlin-sublime-package | 2 +- vendor/grammars/language-babel | 2 +- vendor/grammars/language-clojure | 2 +- vendor/grammars/language-csharp | 2 +- vendor/grammars/language-gfm | 2 +- vendor/grammars/language-javascript | 2 +- vendor/grammars/language-renpy | 2 +- vendor/grammars/latex.tmbundle | 2 +- vendor/grammars/mathematica-tmbundle | 2 +- vendor/grammars/sas.tmbundle | 2 +- vendor/grammars/smali-sublime | 2 +- vendor/grammars/sublime-nginx | 2 +- vendor/grammars/sublime-robot-plugin | 2 +- vendor/grammars/sublime-rust | 2 +- vendor/grammars/sublime-typescript | 2 +- vendor/grammars/sublime_cobol | 2 +- vendor/grammars/vue-syntax-highlight | 2 +- 32 files changed, 32 insertions(+), 32 deletions(-) diff --git a/vendor/grammars/AutoHotkey b/vendor/grammars/AutoHotkey index 4da62de2..d31adb91 160000 --- a/vendor/grammars/AutoHotkey +++ b/vendor/grammars/AutoHotkey @@ -1 +1 @@ -Subproject commit 4da62de23dc705bf9b95e76cf5e8e51aa1e68fea +Subproject commit d31adb9184fb14f970995c12ad3a29f288c9bc0f diff --git a/vendor/grammars/Elm.tmLanguage b/vendor/grammars/Elm.tmLanguage index 437033bd..155ce91c 160000 --- a/vendor/grammars/Elm.tmLanguage +++ b/vendor/grammars/Elm.tmLanguage @@ -1 +1 @@ -Subproject commit 437033bd48350b49bc0dfa734206bfa0ba5de337 +Subproject commit 155ce91c81a3b98fdf2785fe69b5460a3075d9f0 diff --git a/vendor/grammars/Lean.tmbundle b/vendor/grammars/Lean.tmbundle index 943ac84b..a1a3818e 160000 --- a/vendor/grammars/Lean.tmbundle +++ b/vendor/grammars/Lean.tmbundle @@ -1 +1 @@ -Subproject commit 943ac84bf69bfbcab54eeeebba6d66c90ed700ff +Subproject commit a1a3818ecfdd1365ec01ac3894106b5a70b455ac diff --git a/vendor/grammars/MagicPython b/vendor/grammars/MagicPython index 82c76aff..7d07d6f5 160000 --- a/vendor/grammars/MagicPython +++ b/vendor/grammars/MagicPython @@ -1 +1 @@ -Subproject commit 82c76aff704192fb9ed1f505360635f575f13b5a +Subproject commit 7d07d6f5b052785603e1e8cfbf771ccd442d2975 diff --git a/vendor/grammars/NimLime b/vendor/grammars/NimLime index 4db349dd..0c6c6207 160000 --- a/vendor/grammars/NimLime +++ b/vendor/grammars/NimLime @@ -1 +1 @@ -Subproject commit 4db349dda5219a37e99a0375e2a5d8a001fbf20e +Subproject commit 0c6c6207a62929054d50f242c4f0b3e32084e2f6 diff --git a/vendor/grammars/Vala-TMBundle b/vendor/grammars/Vala-TMBundle index 1c5ebb62..935bd21c 160000 --- a/vendor/grammars/Vala-TMBundle +++ b/vendor/grammars/Vala-TMBundle @@ -1 +1 @@ -Subproject commit 1c5ebb62d11e01d145b414355de72d4de8758ed8 +Subproject commit 935bd21c13068158435f64b3dbd8423c8d812c92 diff --git a/vendor/grammars/apache.tmbundle b/vendor/grammars/apache.tmbundle index a4a494e8..a12e8955 160000 --- a/vendor/grammars/apache.tmbundle +++ b/vendor/grammars/apache.tmbundle @@ -1 +1 @@ -Subproject commit a4a494e8455ca98bde8591a7f068c3384babb09a +Subproject commit a12e895533700b0200cca20f169be63727efff8c diff --git a/vendor/grammars/api-blueprint-sublime-plugin b/vendor/grammars/api-blueprint-sublime-plugin index 550417b9..076ee9bd 160000 --- a/vendor/grammars/api-blueprint-sublime-plugin +++ b/vendor/grammars/api-blueprint-sublime-plugin @@ -1 +1 @@ -Subproject commit 550417b9bbbd833b57b5917b48ca0fef9ed52190 +Subproject commit 076ee9bd62d68ee07831c87f2e7c7eeec732dd0f diff --git a/vendor/grammars/atom-language-stan b/vendor/grammars/atom-language-stan index f8d855ea..2fa2745d 160000 --- a/vendor/grammars/atom-language-stan +++ b/vendor/grammars/atom-language-stan @@ -1 +1 @@ -Subproject commit f8d855eab960b4dd140c0f469a809401544850b8 +Subproject commit 2fa2745da7ab9de0ba42a9743d1942becb5e4c32 diff --git a/vendor/grammars/ats.sublime b/vendor/grammars/ats.sublime index a3f24abb..fd6bd223 160000 --- a/vendor/grammars/ats.sublime +++ b/vendor/grammars/ats.sublime @@ -1 +1 @@ -Subproject commit a3f24abbe7043adc0ad798711467edae33cf89f0 +Subproject commit fd6bd223d17e384f2a7dc93ce01c6e786fd452c2 diff --git a/vendor/grammars/chapel-tmbundle b/vendor/grammars/chapel-tmbundle index 469476b2..d6c9e926 160000 --- a/vendor/grammars/chapel-tmbundle +++ b/vendor/grammars/chapel-tmbundle @@ -1 +1 @@ -Subproject commit 469476b285adf6c4a09973fd12e97ec831afd050 +Subproject commit d6c9e926e78b4b8fd1631fc059307a87fb73d33e diff --git a/vendor/grammars/factor b/vendor/grammars/factor index 97d1ec75..d99c9e16 160000 --- a/vendor/grammars/factor +++ b/vendor/grammars/factor @@ -1 +1 @@ -Subproject commit 97d1ec759eb9fa2ace83c62685b6b36faec05981 +Subproject commit d99c9e16632d2eb1e5a8862182529d3dcc6b7c56 diff --git a/vendor/grammars/gap-tmbundle b/vendor/grammars/gap-tmbundle index 52c8fafb..cf05fa8d 160000 --- a/vendor/grammars/gap-tmbundle +++ b/vendor/grammars/gap-tmbundle @@ -1 +1 @@ -Subproject commit 52c8fafb664fb7909223f92403e26fe3bfde0cdc +Subproject commit cf05fa8df13f8b1f46fc07e6c17270d899a69926 diff --git a/vendor/grammars/haxe-sublime-bundle b/vendor/grammars/haxe-sublime-bundle index 94cc8eea..e9559a2c 160000 --- a/vendor/grammars/haxe-sublime-bundle +++ b/vendor/grammars/haxe-sublime-bundle @@ -1 +1 @@ -Subproject commit 94cc8eea31127365556ef9bbb1db78ef6bfdd2e5 +Subproject commit e9559a2c538c83d5dca09e410915834e9bdcd3cb diff --git a/vendor/grammars/jade-tmbundle b/vendor/grammars/jade-tmbundle index d27b61d1..81093433 160000 --- a/vendor/grammars/jade-tmbundle +++ b/vendor/grammars/jade-tmbundle @@ -1 +1 @@ -Subproject commit d27b61d1780ff594b43d9ad04a9e896ea92b393b +Subproject commit 81093433d6c371657c237ed8be3c47f3e98e3a66 diff --git a/vendor/grammars/kotlin-sublime-package b/vendor/grammars/kotlin-sublime-package index 3ddc52e8..535967fd 160000 --- a/vendor/grammars/kotlin-sublime-package +++ b/vendor/grammars/kotlin-sublime-package @@ -1 +1 @@ -Subproject commit 3ddc52e8dbc8bef1f1a534b94bd0f688bc2a4422 +Subproject commit 535967fd2c53d299289d3b045097ea08dbe9764f diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel index e2fd09d7..5f63df46 160000 --- a/vendor/grammars/language-babel +++ b/vendor/grammars/language-babel @@ -1 +1 @@ -Subproject commit e2fd09d7d9caf1f336b3a35581e55387723dcbf3 +Subproject commit 5f63df46ccae53d3aa07e41e647e8e91f18177b6 diff --git a/vendor/grammars/language-clojure b/vendor/grammars/language-clojure index a0193ad2..fa482c39 160000 --- a/vendor/grammars/language-clojure +++ b/vendor/grammars/language-clojure @@ -1 +1 @@ -Subproject commit a0193ad2a9797033649e665083f09249d2d098fc +Subproject commit fa482c39a323624189240910cd7eb81dfd97e445 diff --git a/vendor/grammars/language-csharp b/vendor/grammars/language-csharp index f635e67e..96ab79f4 160000 --- a/vendor/grammars/language-csharp +++ b/vendor/grammars/language-csharp @@ -1 +1 @@ -Subproject commit f635e67edef4e2fe68c3526e1ad26ed66f01aa62 +Subproject commit 96ab79f45bfb6875c9aa2ac702934a385df35de3 diff --git a/vendor/grammars/language-gfm b/vendor/grammars/language-gfm index 298a8a3e..1472c976 160000 --- a/vendor/grammars/language-gfm +++ b/vendor/grammars/language-gfm @@ -1 +1 @@ -Subproject commit 298a8a3eb180f1fa6b8a8bc77c2147e355c8cafd +Subproject commit 1472c976c5c5cbc842bb7cce7fc6e19de9b926a6 diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript index f68e4bfe..b28af094 160000 --- a/vendor/grammars/language-javascript +++ b/vendor/grammars/language-javascript @@ -1 +1 @@ -Subproject commit f68e4bfe54a3b9d16450223f401d2fb16453897f +Subproject commit b28af094cc31a7e2423c474845e506ce33aa3a57 diff --git a/vendor/grammars/language-renpy b/vendor/grammars/language-renpy index cc2f1c69..c259c5d3 160000 --- a/vendor/grammars/language-renpy +++ b/vendor/grammars/language-renpy @@ -1 +1 @@ -Subproject commit cc2f1c69f0b1c1d121aa5648422fc70d86dca7cf +Subproject commit c259c5d3acc0a27dc2a28abc2a2229acf9adde1b diff --git a/vendor/grammars/latex.tmbundle b/vendor/grammars/latex.tmbundle index 82986b93..bec21c8b 160000 --- a/vendor/grammars/latex.tmbundle +++ b/vendor/grammars/latex.tmbundle @@ -1 +1 @@ -Subproject commit 82986b93a4f4ae7aab52445d8b7742b9af635d05 +Subproject commit bec21c8bcd3e977c157e41f8e4d3f6c53862dbe8 diff --git a/vendor/grammars/mathematica-tmbundle b/vendor/grammars/mathematica-tmbundle index 3b4b826d..5067a25b 160000 --- a/vendor/grammars/mathematica-tmbundle +++ b/vendor/grammars/mathematica-tmbundle @@ -1 +1 @@ -Subproject commit 3b4b826dbe60f1dba4484fdeacf0047681b9b82e +Subproject commit 5067a25b9b1c2b9a8bb0ed9fcfd63c73ff11277e diff --git a/vendor/grammars/sas.tmbundle b/vendor/grammars/sas.tmbundle index 3759a197..ba5c7462 160000 --- a/vendor/grammars/sas.tmbundle +++ b/vendor/grammars/sas.tmbundle @@ -1 +1 @@ -Subproject commit 3759a19719d3c4c4979087be12adbcaa02a7bca3 +Subproject commit ba5c74624c477d657698ffd515fa6f670ee147b9 diff --git a/vendor/grammars/smali-sublime b/vendor/grammars/smali-sublime index 28a43364..60a1fdb3 160000 --- a/vendor/grammars/smali-sublime +++ b/vendor/grammars/smali-sublime @@ -1 +1 @@ -Subproject commit 28a4336421bff627d76c8dc27b991a4ed53a6747 +Subproject commit 60a1fdb3442cd7082036f1a02e403a5f725ed837 diff --git a/vendor/grammars/sublime-nginx b/vendor/grammars/sublime-nginx index fcf644ec..e72eb758 160000 --- a/vendor/grammars/sublime-nginx +++ b/vendor/grammars/sublime-nginx @@ -1 +1 @@ -Subproject commit fcf644ecea021ab8a6bc171f415f8df0b005b31e +Subproject commit e72eb758149317de9b79a14aee91e778b3dbd929 diff --git a/vendor/grammars/sublime-robot-plugin b/vendor/grammars/sublime-robot-plugin index bf5dc7fa..07069ebf 160000 --- a/vendor/grammars/sublime-robot-plugin +++ b/vendor/grammars/sublime-robot-plugin @@ -1 +1 @@ -Subproject commit bf5dc7fa9f431f4990a02518f89fe45a2beaa5e8 +Subproject commit 07069ebf20c82663eee24e4c7d82cccca020e8e9 diff --git a/vendor/grammars/sublime-rust b/vendor/grammars/sublime-rust index 621e4f61..f75f2b10 160000 --- a/vendor/grammars/sublime-rust +++ b/vendor/grammars/sublime-rust @@ -1 +1 @@ -Subproject commit 621e4f6117531d8fe299eb5584a6be766df1822e +Subproject commit f75f2b102632eb2f29124c055cdcc9fa7776886d diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript index 26fd717a..2da61f59 160000 --- a/vendor/grammars/sublime-typescript +++ b/vendor/grammars/sublime-typescript @@ -1 +1 @@ -Subproject commit 26fd717a79d1984e76bbe6d958c5c4bbf0179049 +Subproject commit 2da61f59d231b5442e1a7136aedcb9705ad099e2 diff --git a/vendor/grammars/sublime_cobol b/vendor/grammars/sublime_cobol index 3d2b6dbc..7c60c108 160000 --- a/vendor/grammars/sublime_cobol +++ b/vendor/grammars/sublime_cobol @@ -1 +1 @@ -Subproject commit 3d2b6dbcd1b27023150ff9d8ab47953706d070b8 +Subproject commit 7c60c10849c45a55203b352dcf0b212113a61caf diff --git a/vendor/grammars/vue-syntax-highlight b/vendor/grammars/vue-syntax-highlight index f20c9bab..fbcccaee 160000 --- a/vendor/grammars/vue-syntax-highlight +++ b/vendor/grammars/vue-syntax-highlight @@ -1 +1 @@ -Subproject commit f20c9bab7e71738f421e6edc1aab8839ee05d85a +Subproject commit fbcccaee1043af3e6269a1e674fc89ede2cc941b From c1e71dc215a72bce5661be978cefdc85b03bae61 Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Wed, 16 Mar 2016 21:44:20 -0600 Subject: [PATCH 204/205] Bumping to v4.8.0 --- lib/linguist/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/linguist/version.rb b/lib/linguist/version.rb index 7bb4af7b..2e14f12f 100644 --- a/lib/linguist/version.rb +++ b/lib/linguist/version.rb @@ -1,3 +1,3 @@ module Linguist - VERSION = "4.7.6" + VERSION = "4.8.0" end From f0c7380132465bd4a378b4e174f6bee896a96f1e Mon Sep 17 00:00:00 2001 From: Arfon Smith Date: Thu, 17 Mar 2016 10:27:39 -0600 Subject: [PATCH 205/205] Updating sublime-terra grammar --- vendor/grammars/sublime-terra | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/grammars/sublime-terra b/vendor/grammars/sublime-terra index 2a73bf7d..d77b0341 160000 --- a/vendor/grammars/sublime-terra +++ b/vendor/grammars/sublime-terra @@ -1 +1 @@ -Subproject commit 2a73bf7dfd996d00d13ee9059b400f65069a6407 +Subproject commit d77b0341d26f0989b2dc918ce9fb5cb8a5c7202b